2

페이지의 모든 앵커 태그에 이벤트 리스너를 추가하는 Firefox 확장 프로그램을 작성하고 있습니다. 본질적으로 나는 가지고있다 :자바 스크립트로 추가 된 앵커에 이벤트를 첨부하는 XUL

window.addEventListener("load", function() { myExtension.init(); }, false); 

var myExtension = { 

    init: function() { 
    var appcontent = document.getElementById("appcontent"); 
    if(appcontent) 
     appcontent.addEventListener("DOMContentLoaded", myExtension.onPageLoad, true); 
    }, 

    onPageLoad: function(event) { 
     var doc = event.originalTarget; 
     var anchors = doc.getElementsByTagName("a"); 
     //attach event listeners 
    } 
} 

이것은 페이지의 대부분의 태그에 적용된다. 문제는 자바 스크립트로 추가 된 태그가 이벤트 리스너를 첨부하지 않는다는 것입니다. 나는 재정의 createElement를 시도했다 :

//in the onPageLoadFunction 
var originalCreateElement = doc.createElement; 
doc.createElement = function(tag) { 
    if (tag != "a"){ 
     return originalCreateElement(tag); 
    } 
    var anchor = originalCreateElement("a"); 
    anchor.addEventListener("mouseover", myInterestingFunction, false); 
    return anchor; 
} 

와 나는 DOM 삽입 청취자

//in the onPageLoadFunction 
function nodeInserted(event){; 
    addToChildren(event.originalTarget); 
} 

function addToChildren(node){ 
    if (node.hasChildNodes()){ 
     var nodes = node.childNodes; 
     for (var i = 0; i < nodes.length; i++){ 
      addToChildren(nodes[i]); 
     } 
    } 
    if (node.nodeName == "a"){ 
     anchorEvent(node); //adds event listeners to node 
    } 
} 

doc.addEventListener("DOMNodeInserted", nodeInserted, false); 

하지만 둘 다 일을 추가하는 시도했습니다. 이러한 앵커 객체에 대한 참조를 얻으려면 어떻게해야합니까? 그래서이 객체에 리스너를 추가 할 수 있습니까? "페이지에있는 모든 앵커 태그에 이벤트 리스너를"추가

감사

답변

1

동적으로 효율적으로 수행하기 어렵다.

  1. 주기적 앵커 태그에 대한 페이지를 폴링 (같은 jQuery.live()가하는)
  2. 사용 DOM mutation events (등 DOMNodeInserted)

전자는 명백한 성능에 영향을 : 당신은 두 가지 선택이있다. 돌연변이 이벤트를 사용하면 성능 비용이 절감됩니다. 문서에 임의의 돌연변이 이벤트가 추가되면 Gecko는 DOM 코드에서 느린 경로를 사용하므로 모든 DOM 조작이 느리게 작동합니다.

addEventListener을 사용하여 일부 최상위 요소 (또는 전체 창)에서 수신기를 설정하고 대상이 앵커인지 확인해야하는 이유는 무엇입니까? 캡처 링 리스너를 사용하여 기본 동작이 발생하기 전에 수신기를 호출 할 수 있습니다.

+0

위에서 지적한 DOM 돌연변이 이벤트를 시도했지만 작동하지 않는 것 같습니다. 사용자가 여러 탭을 동시에 열어서 일정 기간 동안 모두 폴링하므로 확장 프로그램에서 페이지를 주기적으로 폴링하는 것이 문제가됩니다. 그것은 속도가 느려집니다. – josiahdecker

+0

그래서 왜 돌연변이 듣기가 당신을 위해 작동하지 않는지 모르겠다. 알아 내려면 테스트 케이스를 만들어야합니다. 청취자가 발사하지 않았다고 확신합니까? 어쩌면 DOM 트리의 더 깊은 요소에 등록하려고 시도 할 것인가? /// 어쨌든 내가 제안한 마지막 해결책이 더 좋다고 생각하니, 시도해 보셨습니까? – Nickolay

+0

로드 한 후 1.5 초 후에 페이지 폴링을 시도했는데 대부분의 링크를 얻을 수 있습니다. 또한 3 초마다 페이지 폴링을 시도했지만 너무 느려졌습니다. 폴링이 작동합니다. 감사합니다. 나는 좀 더 우아한 해결책을 원했다. – josiahdecker