2012-01-09 21 views
5

Tôi gặp sự cố. Thông qua việc truyền thông điệp, tôi đã chuyển dữ liệu DOM từ tập lệnh nội dung sang trang nền. Những gì tôi muốn biết là làm thế nào bạn có thể thiết lập một kênh truyền thông giữa trang Tùy chọn và trang nền. API chrome.extension.getBackgroundPage() không hữu ích. Thông điệp truyền thống cũng không phải là thông qua các hoạt động sendRequestaddlistener. Làm cách nào để chuyển dữ liệu này từ trang nền sang trang tùy chọn? Ai đó có thể cung cấp đoạn trích thử nghiệm để giải thích?cách liên lạc giữa trang tùy chọn và trang nền của tiện ích chrome


đây là những gì tôi đã thử. Trong contentscript.js tôi

<script> 
    var selected_Text =""; 
    window.addEventListener("dblclick",function(event){ 

    selected_Text = String(window.getSelection()); 
    chrome.extension.sendRequest({greeting: "maprender",name:selected_Text},  function(response) { 
     alert("reached here") 
     console.log(response.farewell); 
     }); 

//i am to then load options.html on DOM like this 
var Div = document.createElement("iframe"); 
Div.setAttribute('src', chrome.extension.getURL('options.html')); 
Div.setAttribute("style","width:130px;height:80px;position:absolute;left:10px;"); 
Div.setAttribute("id","xyz"); 
document.body.appendChild(Div); 
</script> 

tôi truy xuất các selected_Text tại background.html như thế này

<script> 
var Addr_details={ 
place:null 
}; 
chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 

    if (request.greeting == "maprender") 
    { 
     alert("reached here sendin resp"+request.name); 
     Addr_details.place = request.name; 
     sendResponse({farewell: "goodbye"}); 

    } 
    else 
     sendResponse({}); // snub them. 
    }); 
</script> 

Bây giờ để truy cập giá trị của văn bản này tại trang tùy chọn options.html tôi đã cố gắng 2 phương pháp Một là sử dụng chrome.extension.getBackgroundPage() như sau:

<script> 
function init(){ 
var bkg = chrome.extension.getBackgroundPage(); 
alert("the selected text is "+bkg.Addr_details.place); 
} 
</script> 

init đang tải tùy chọn.html .Điều này không cung cấp cho tôi v alue. infact nó chỉ chấm dứt lúc khởi tạo của chrome.extension.backgroundPage.

Một cách tiếp cận khác mà tôi đã thử là tạo một yêu cầu tương tự (như đã có tại contentcript.js) từ contentscript.js với một lời chào khác và thêm người nghe vào tùy chọn.html .Điều đó dường như không hoạt động ở phía bên nhận (tùy chọn trang) bởi vì tôi nhận được gọi lại tại contentcript sau khi request.I chắc chắn đang làm một cái gì đó sai, amnt tôi? Xin vui lòng giúp đỡ.

+3

"API chrome.extension.getBackgroundPage() không hữu ích" Tại sao? –

Trả lời

4

Có ý nghĩa cho cách tiếp cận thứ hai không hoạt động. Options.html không phải là "hoạt động" tất cả các thời gian, chỉ khi trang tùy chọn là lên. Do đó, nó không thể nghe các yêu cầu từ tập lệnh nội dung. Đó chính xác là "nền" là gì. Đối với phương pháp đầu tiên (sử dụng getBackgroundPage()), tôi không bao giờ sử dụng phương pháp này bản thân mình, nhưng nó dường như chỉ mang lại DOM của trang nền, và do đó bạn không thể truy cập các biến trong nền js.

bắn tốt nhất của bạn nên được để gửi một yêu cầu từ trang tùy chọn để trang nền, yêu cầu cho giá trị này, ví dụ:

Nội dung kịch bản: trang

chrome.extension.sendRequest({greeting: "retrieveAddr"}, function(response) { 
    // do something with response.addr... 
}); 

Bối cảnh:

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    switch (request.greeting) { 
    case "maprender"): 
     alert("reached here sendin resp"+request.name); 
     Addr_details.place = request.name; 
     sendResponse({farewell: "goodbye"}); 
     break; 
    case "retrieveAddr": 
     sendResponse({addr: Addr_details}); 

    default: 
     sendResponse({}); // snub them. 
    }); 
}); 

Giải pháp khác, dễ dàng hơn nhưng mạnh mẽ hơn là sử dụng localStorage để chuyển thông tin giữa các tùy chọn và trang nền, vì cả hai đều chia sẻ cùng một.

+2

Cảm ơn ronme, đó là hữu ích. Cuối cùng tôi đã sử dụng localStorage để giải quyết vấn đề. đó là khá starightforward và ngắn. – user964001

+2

tuyệt vời khi nghe điều đó, user964001. Bạn có thể muốn "chấp nhận" câu trả lời của tôi, vì vậy những người đọc sau này biết đây là câu trả lời "đúng". – ronme

+0

'getBackgroundPage' mang tất cả các thuộc tính của trang nền, bao gồm tất cả các biến' window'. – fiatjaf

Các vấn đề liên quan