2009-12-26 13 views

cevap

24

Varsayılan olarak, popup.js/popup.html içinde "belge" nesnesi, uzantının yalnızca açılır penceresinin belgesine başvurur. Belirli bir sekme için DOM'yi almak için (örneğin şu an aktif sekmesi), content scripts communications'u kullanmanız gerekir. Örneğin size böyle bir şey yapmak popup.html yüzden, popup aracılığıyla İçerik komut için extension bir istek göndermek gerekir: İçerik komut Şimdi

chrome.tabs.getSelected(null, function(tab) { 
    // Send a request to the content script. 
    chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, function(response) { 
    console.log(response.dom); 
    }); 
}); 

, biz gelen listen for those events gerek uzatma, bu nedenle bazı dosyada biz

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
if (request.action == "getDOM") 
    sendResponse({dom: "The dom that you want to get"}); 
else 
    sendResponse({}); // Send nothing.. 
}); 

Şimdi içerik komut dosyası ve sekme iznini içerecek şekilde kurulum sizin manifest unutmayın dom.js

adını verdi.

+0

DOM, Document Object Model ile demek istiyorum ... teşekkürler –

+1

Evet, örneğimde size gösterdiğim şey, Chrome Uzantıları'nda yapılan senkronize mesajlaşmadır. "Almak istediğiniz dom" bir String döndürdüm, ancak gerçekte istediğiniz herhangi bir DOM'yi döndürebilirsiniz. Eğer vücuttaki her şeyi almak istiyorsanız "sendResponse" ({dom: document.getElementsByTagName ("body") [0]}); Yukarıdaki örnek çalışma –

+3

mu? AFAIK sendikası cevabı domu dom nesnesiyle dominant hale getirecek ve dom nesnesinin dairesel yapısından dolayı bir hataya neden olacaktır. –

3

Bu yanıt en son API ile çalışmıyor gibi görünüyor. Bu çalışan bir örnek.

popup.js:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    var tab = tabs[0]; 
    console.log(tab.url, tab.title); 
    chrome.tabs.getSelected(null, function(tab) { 
     chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(msg) { 
      msg = msg || {}; 
      console.log('onResponse', msg.farewell); 
     }); 
    }); 
}); 

getDescription.js: manifest.json ait

window.onload = function() { 
    chrome.runtime.onMessage.addListener(function(msg, _, sendResponse) { 
     console.log('onMessage', msg); 
     if (msg.greeting == "hello") { 
      sendResponse({farewell: "goodbye"}); 
     } else{ 
      sendResponse({}); 
     } 
    }); 
}; 

ilgili bölümleri:

{ 
    "permissions": [ 
     "tabs" 
    ], 

    "content_scripts": [ 
    { 
     "matches": ["http://*/*", "https://*/*"], 
     "js": ["getDescription.js"] 
    } 
    ] 
} 
1

Bu son düzeltmedir:

popup.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
     console.log(response.farewell); 
    }); 
}); 

(Not: Yukarıdaki console.log (response.farewell) popup.html için değil, mevcut sekmesi)

contentscript.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if (request.greeting == "hello") 
     sendResponse({farewell: "goodbye"}); 
    }); 

Kaynak: https://developer.chrome.com/extensions/messaging

İlgili konular