2012-04-04 1 views
1

파이어 폭스 확장 기능을 개발 중이고 방화범 같은 요소의 상태를 :hover 상태로 시뮬레이트하고 싶습니다.설정 방법 : inIDOMUtils :: setContentState를 사용하여 DOM 요소의 상태를 가리 키시겠습니까?

my-script-file.js에서 I [0] DOM 요소하지 JQuery와 오브젝트를 얻는 것을 소자 오브젝트 예 $('#myDiv')[0] 메모 self.port를 사용 mousehover을 방출한다.

이 코드는 작동하지 않으며 오류가 발생합니다 (domUtil.setContentState(step.element, 0x04); 줄). 오류입니다 : 내가 setContentState() 정의 파이어 폭스 문서 사이트에 가서 내가 여기 내 선택 elementnsIDOMElement에 개체를 변환하는 방법을 내 요소가 nsIDOMElement 내 질문의 인스턴스 여야합니다 notited

.

또는 실제로 여기서 내 질문은 또는 jquery $()에 의해 선택된 요소에 :hover을 강제로 적용하는 방법입니다.

나는 불을 지르고 소스 코드를 읽고이 조각을 마련 :

var {Cc, Ci, Cr} = require("chrome"); 
var domUtil = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils); 

exports.main = function() { 
    var attachToTab = function(tab) 
    { 
     if(currentWorker) 
      currentWorker.destroy(); 

     currentWorker = tab.attach({ 
      contentScriptFile: [data.url("jquery.js"), data.url("my-script-file.js")] 
     }); 

     currentWorker.port.on('mousehover', function(element){ 
       console.log('doing setContentState :hover'); 
       domUtil.setContentState(element, 0x04); 
     }); 
    } 

    require("widget").Widget({ 
     id: "MyAddonBtn", 
     label: "Sample", 
     contentURL: data.url("images/addon.ico"), 
     onClick: function(){ 
      attachToTab(tabs.activeTab); 
     } 
    }); 

} 

답변

3

그것은 애드온 SDK가 작동하는 방식에 문제가 있습니다. 콘텐츠 스크립트는 페이지 요소에 액세스 할 수 있지만 고급 권한 (inIDOMUtils 사용해야 함)이 없습니다. 확장 스크립트는 고급 권한이 있지만 일반적으로 페이지 요소에 액세스 할 수 없습니다. 그리고 - 아니요, 메시지에서 페이지 요소를 보내는 것은 작동하지 않습니다. 메시지는 JSON 화 될 수있는 객체 만 받아들입니다.

유일한 해결책은 SDK 프레임 워크에서 탈피하여 확장 스크립트에서 직접 페이지에 액세스하는 것입니다. 이런 식으로 뭔가 :

var attachToTab = function() 
{ 
    var browserWindow = require("window-utils").activeBrowserWindow; 
    if (browserWindow && "gBrowser" in browserWindow) 
    { 
    var doc = browserWindow.gBrowser.contentDocument; 
    var element = doc.getElementById("foo"); 
    if (element) 
     domUtil.setContentState(element, 0x04); 
    } 
}; 

window-utils 패키지는 낮은 수준의 API 꽤 심하게 설명되어 있습니다 (예를 들어, activeBrowserWindow 속성이 문서에없는) - 당신의 자신의 위험에 사용합니다. 하지만 현재 브라우저 창에 직접 액세스 할 수 있습니다. 일단 당신이 거기에, gBrowser 변수는 당신에게 <xul:tabbrowser> element을 제공합니다.

+0

멋진 정보와 짧은 정보를 보내 주셔서 감사합니다. –

관련 문제