2012-06-20 9 views
9

È possibile ascoltare un'estensione di Chrome in attesa dell'aspetto di un elemento ancora da creare?Ascolta la creazione di un elemento e attiva un evento quando viene visualizzato nella pagina in Chrome Extension

Dire che l'utente fa clic su un pulsante e l'evento click crea un elemento <div id='myDiv'>My Div</div> e lo aggiunge alla pagina/DOM. È possibile impostare un listener che attiva automaticamente un evento quando viene visualizzato quell'elemento?

Oppure devo ricorrere al polling della pagina e controllare questo elemento ogni X quantità di millisecondi?

jQuery e altre librerie non sono un'opzione per me btw.

+0

Perché non tenere traccia dei clic del pulsante? O si caricherà attraverso altri mezzi? – TheZ

+0

In realtà è stato creato con un callback AJAX, ma l'ho solo descritto nel modo più semplice per esempio. Quindi devo ascoltare la creazione/l'aspetto dell'elemento. –

+0

Duplicato? http://stackoverflow.com/questions/7434685/event-when-element-added-to-page ... In ogni caso sembra che la soluzione più elegante sia ora deprecata (DOM Mutation Events), ma c'è una soluzione hacky pubblicata qui: http://stackoverflow.com/questions/6997826/alternative-to-domnodeinserted – Cecchi

risposta

12

Il nuovo DOM4 MutationObserver può farlo. Non penso che sia ampiamente supportato ancora, ma per tua fortuna, è supportato in Chrome, come WebKitMutationObserver.

Modificata dalla pagina esercitazione collegata, questo ascolta per le mutazioni ovunque sulla pagina:

var observer = new WebKitMutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     for (var i = 0; i < mutation.addedNodes.length; i++) { 
      if(mutation.addedNodes[i].id == "myDiv") { 
       // target node added, respond now... 
      } 
     } 
    }); 
}); 
observer.observe(document, { subtree: true }); 

Se è possibile restringere l'ascolto in observer.observe ad un elemento più specifico di document, che darebbe un po 'di guadagno di prestazioni .

+0

Esiste un'implementazione legacy? – Zlatko

+0

@zladuric Forse potresti essere interessato a [C'è un listener di modifiche DOM jQuery?] (Http://stackoverflow.com/questions/2844565/is-there-a-jquery-dom-change-listener/) – apsillers

+0

Grazie, ma non posso usare le librerie esterne. setInterval dovrà rimanere. – Zlatko

2

È possibile utilizzare arrive.js, esso avvolge l'API Mutation Observers. Utilizzo:

document.arrive(".test-elem", function() { 
    // 'this' refers to the newly created element 
    var newElem = this; 
}); 
Problemi correlati