2012-01-09 3 views
5

나는 문제가있다. 메시지 전달을 통해 콘텐츠 스크립트에서 배경 페이지로 DOM 데이터를 전송했습니다. 내가 알고 싶은 것은 옵션 페이지와 배경 페이지 사이에 통신 채널을 구축하는 방법입니다. API chrome.extension.getBackgroundPage()은 유용하지 않습니다. 전통적인 메시지가 sendRequestaddlistener을 통과하지도 않습니다. 이 데이터를 배경 페이지에서 옵션 페이지로 어떻게 전송합니까? 누군가 설명 할 테스트 된 스 니펫을 제공 할 수 있습니까?옵션 페이지와 크롬 확장의 배경 페이지 간의 통신 방법


이것은 내가 시도한 것입니다. 내 contentscript.js에서 는

<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> 

난 내가이 방법 을 시도 options.html 옵션 페이지에서이 텍스트의 값에 액세스하려면 지금이

<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> 

처럼 background.html에서 selected_Text을 retreive 하나는이 같은 chrome.extension.getBackgroundPage()를 사용했다 :

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

초기화는 options.html의 온로드 .This 나에게 V를 제공하지 않습니다이다 alue. 실제로 그것은 chrome.extension.backgroundPage의 초기화시 종료됩니다.

내가 시도한 또 다른 방법은 다른 인사말을 사용하여 contentscript.js에서 비슷한 요청 (예 : contentscript.js에 이미있는 것과 비슷한 요청)을 작성하고 options.html에서 청취자를 추가하는 것입니다. 수신자 측 (옵션 페이지)에서 요청 후 contentscript 콜백을 받기 때문에. 나는 분명히 뭔가 잘못하고있는 중입니까? 제발 도와주세요.

+3

"API chrome.extension.getBackgroundPage()는 유용하지 않습니다."이유는 무엇입니까? –

답변

4

두 번째 접근 방식이 작동하지 않는 것은 당연합니다. Options.html은 옵션 페이지가 작동중인 경우에만 항상 "활성"상태가 아닙니다. 따라서 콘텐츠 스크립트의 요청을들을 수 없습니다. 정확히 "배경"이 무엇입니까.

첫 번째 방법 (getBackgroundPage() 사용)과 관련하여 본인이 직접이 메서드를 사용하지는 않았지만 배경 페이지의 DOM 만 가져 오는 것으로 보이므로 백그라운드 js의 변수에 액세스 할 수 없습니다.

가장 좋은 샷이 값을 요청, 배경 페이지에 옵션 페이지에서 요청을 전송해야한다 예 :

내용 스크립트

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

배경 페이지 :

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. 
    }); 
}); 

또 다른 쉽고 그러나 까다로운 해결책은 localStorage을 사용하여 옵션과 배경 페이지가 동일한 정보를 공유하기 때문에 옵션과 배경 페이지간에 정보를 전달하는 것입니다.

+2

감사합니다 ronme, 유용했습니다. 마침내 localStorage를 사용하여 문제를 해결했습니다. 그것은 꽤 시원하고 짧았습니다. – user964001

+2

듣기 좋은, user964001. 내 대답을 "받아들이 길"원할 수도 있습니다. 나중에 이것을 읽는 사람들은 이것이 "올바른"대답이라는 것을 알고 있습니다. – ronme

+0

'getBackgroundPage'는 모든 'window' 변수를 포함하여 배경 페이지의 모든 속성을 가져옵니다. – fiatjaf

관련 문제