Wiem, że o to pytano w wielu postach, ale szczerze mówiąc, nie rozumiem ich. Jestem nowy w JavaScript, rozszerzeniach Chrome i wszystkim innym i mam to zadanie klasowe. Muszę więc stworzyć wtyczkę, która liczyłaby obiekty DOM na dowolnej stronie przy użyciu żądań międzydomenowych. Do tej pory udało mi się to osiągnąć za pomocą interfejsów API rozszerzeń Chrome. Teraz problem polega na tym, że muszę pokazać dane na mojej stronie popup.html z pliku contentScript.js. Nie wiem, jak to zrobić. Próbowałem przeczytać dokumentację, ale wysyłając wiadomości w przeglądarce Chrome, po prostu nie rozumiem, co mam zrobić.
poniżej znajduje się dotychczasowy kod.
manifest.json
{
"manifest_version":2,
"name":"Dom Reader",
"description":"Counts Dom Objects",
"version":"1.0",
"page_action": {
"default_icon":"icon.png",
"default_title":"Dom Reader",
"default_popup":"popup.html"
},
"background":{
"scripts":["eventPage.js"],
"persistent":false
},
"content_scripts":[
{
"matches":["http://pluralsight.com/training/Courses/*", "http://pluralsight.com/training/Authors/Details/*", "https://www.youtube.com/user/*", "https://sites.google.com/site/*", "http://127.0.0.1:3667/popup.html"],
"js":["domReader_cs.js","jquery-1.10.2.js"]
//"css":["pluralsight_cs.css"]
}
],
"permissions":[
"tabs",
"http://pluralsight.com/*",
"http://youtube.com/*",
"https://sites.google.com/*",
"http://127.0.0.1:3667/*"
]
popup.html
<!doctype html>
<html>
<title> Dom Reader </title>
<script src="jquery-1.10.2.js" type="text/javascript"></script>
<script src="popup.js" type="text/javascript"></script>
<body>
<H1> Dom Reader </H1>
<input type="submit" id="readDom" value="Read DOM Objects" />
<div id="domInfo">
</div>
</body>
</html>
eventPage.js
var value1,value2,value3;
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.action == "show") {
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.pageAction.show(tabs[0].id);
});
}
value1 = request.tElements;
});
popup.js
$(function (){
$('#readDom').click(function(){
chrome.tabs.query({active: true, currentWindow: true}, function (tabs){
chrome.tabs.sendMessage(tabs[0].id, {action: "readDom"});
});
});
});
contentScript
var totalElements;
var inputFields;
var buttonElement;
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse){
if(request.action == "readDom"){
totalElements = $("*").length;
inputFields = $("input").length;
buttonElement = $("button").length;
}
})
chrome.runtime.sendMessage({
action: "show",
tElements: totalElements,
Ifields: inputFields,
bElements: buttonElement
});
Każda pomoc byłaby doceniona i proszę unikać wszelkich noobów, które zrobiłem :)
źródło
chrome.tabs.sendMessage
w popupjs ichrome.runtime.onMessage.addListener
w content.js dlaczego.tabs
dla popupjs i.runtime
w content.jsMożesz do tego użyć localStorage. Możesz przechowywać dowolne dane w formacie tabeli skrótów w pamięci przeglądarki, a następnie uzyskiwać do nich dostęp w dowolnym momencie. Nie jestem pewien, czy możemy uzyskać dostęp do localStorage ze skryptu zawartości (wcześniej był zablokowany), spróbuj zrobić to samodzielnie. Oto jak to zrobić za pośrednictwem strony w tle (najpierw przekazuję dane ze skryptu zawartości na stronę w tle, a następnie zapisuję je w localStorage):
w contentScript.js:
chrome.runtime.sendMessage({ total_elements: totalElements // or whatever you want to send });
w eventPage.js (Twoja strona w tle):
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse){ localStorage["total_elements"] = request.total_elements; } );
Następnie możesz uzyskać dostęp do tej zmiennej w popup.js za pomocą localStorage ["total_elements"].
Może możesz uzyskać dostęp do localStorage bezpośrednio ze skryptu zawartości w nowoczesnych przeglądarkach. Wtedy nie musisz przekazywać danych przez swoją stronę w tle.
Przyjemna lektura o localStorage: http://diveintohtml5.info/storage.html
źródło
.extension.xxx
, zamiast po prostu pokazywać właściwą drogę (co niektórzy ludzie mogą uważać za „ równie dobra alternatywa ”). Myślę, że to bardziej kwestia stylu. Tak trzymaj !