2014-05-10 2 views
1

Firefox 부가 기능을 만드는 법을 배우고 있습니다. 나는 페이지에 스크립트를 삽입 할 간단한 애드온 (add-on)을하고 싶다. 설명서를 읽었지만이 문제를 해결할 수는 없습니다.왜이 contentscript가 firefox 애드온에서 여러 번 실행됩니까?

cfx 실행 로그에서 한 번만 수행해야하는 경우 동일한 페이지에서 여러 번 스크립트가 실행되는 것을 볼 수 있습니다.

main.js


var pageMod = require('sdk/page-mod') 
var data = require('sdk/self').data 

pageMod.PageMod({ 
    include: ['*'], 
    contentScriptWhen: 'end', 
    contentScriptFile: data.url('starter.js') 
}) 

starter.js


var script = document.createElement('script'); 

script.id = 'i-inject'; 
script.type = 'text/javascript'; 
script.src = 'http://localhost:8888/injectme.js'; 
document.getElementsByTagName('head')[0].appendChild(script); 
console.log('injected'); 

당신이 ('주입')이 CONSOLE.LOG를 볼 수 있습니까? cfx를 실행하고 페이지를 다시로드 할 때마다 콘솔에 5 번 인쇄 된 것을 볼 수 있습니다. 나는 그 행동을 이해하지 못한다.

크게 감사합니다 어떤 도움 :)

난 그냥 여러 검색 지금까지이 질문에 나를 인도하지 않은 어떤 이유로 같은 질문을 물어 완료
+1

API docs가 같은 페이지에 5 회에서 실행, 아니면 한 번만 다음 번 각각에 대해 확인을 그들의에서 찾을 수 있습니다 페이지에 포함될 수있는 네 개의 iframe? – nmaier

+1

안녕하세요, iframe에 대해 생각하지 않았습니다. 귀하의 의견은이 질문에 나를 이끈다 : http://stackoverflow.com/questions/12002542/firefox-addon-ignore-iframes 그리고 나는이 방법으로 그것을 풀려고 노력해야한다고 생각한다. 원하는 경우 답변을 넣을 수 있으며 투표 할 것입니다. Chrome 확장 프로그램이 그렇게하지 않는다고 생각합니다. 같은 생각입니다. 감사합니다. – Amida

답변

2

.

iFrames와 관련하여 게시 한 링크를 사용하면이 솔루션으로 연결될 수 있습니다.

Firefox에서는 iFrame이 여전히 페이지이며 SDK는 기본적으로 iFrames와 상단 페이지를 구별하지 않으므로 콘텐츠 스크립트가 pageMod의 '일치'요구 사항을 충족하는 모든로드 된 페이지 (또는 iFrame)에 첨부됩니다. page-mod를 사용하는 대신 탭을 사용하여 필요한 스크립트와 데이터를 주입 할 수 있습니다.

var data = require("sdk/self").data; 
var tabs = require('sdk/tabs'); 

tabs.on('ready', function(tab) { 
    var worker = tab.attach({ 
      contentScriptOptions: {}, 
      contentScriptFile: [data.url('myScript.js')] 
    }); 

    // now set up your hooks:   
    worker.port.on('someKey', function(data) { 
      //do whatever with your data 
    }); 

}); 

또는, 당신은 단지 페이지에 어떤 iFrame을에서 실행을 방지 할 수 톱 페이지에 적용 할 PageMod의 동작을 수정할 수 있습니다. 제어 페이지 모드 동작을 촉진하는 방법에 대한

var data = require("sdk/self").data; 
var pageMod = require('sdk/page-mod'); 

pageMod.PageMod({ 
    match: [*], 
    attachTo: ["top"], 
    contentScriptOptions: {}, 
    contentScriptFile: [data.url('myScript.js')], 
    onAttach: function(worker) { 
     //function body 
    } 
}); 

자세한 내용은

+0

안녕하세요. 답변 해주셔서 감사합니다. 나는 또한 이것을했다. 그러나 문제는 ** 그것이 여러 번 실행되는 이유입니다. 이유 (@nmaier가 실제로 말한 것)로 답을 완성 할 수 있다면 받아 들일 것입니다. – Amida

+0

아, 좋은 지적이야! 그래서 편집 :) – BrMcMullin

관련 문제