2014-12-18 16 views
5

È possibile rilevare se il contenuto di un paragrafo è stato modificato in JQuery?Rileva modifica elemento paragrafo con JQuery

Ho provato il seguente codice.

<p id="test">Text</p> 
<button id="submit1">change</button> 

-

$(document).on("click", "#submit1", function() { 
    var d = new Date(); 
    var time = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); 
    $("#test").text(time); 
});  
$(document).on("change", "#test", function() { 
    alert("Paragraph changed"); 
}); 

JSFiddle: http://jsfiddle.net/nnbqye55/

Credo che mi manca qualcosa di ovvio.

risposta

4

change gli eventi non verranno attivati ​​sul paragrafo. Quello che ti serve sono gli osservatori di mutazione. Here è la documentazione MDN pertinente. Hanno penetrazione del browser pretty good; per gli IE meno recenti, è possibile utilizzare probabilmente gli eventi di mutazione deprecati, anche se si sa che si tratta di killers delle prestazioni, quindi state molto attenti. Riscriverò il tuo esempio usando Mutation Observers; si può anche verificare un jsFiddle demo:

$(function(){ 
    //Store the test paragraph node 
    var test = $('#test'); 

    //Function to change the paragraph 
    var changeParagraph = function() { 
     var d = new Date(); 
     var time = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); 
     test.text(time); 
    }; 

    //Bind the paragraph changing event 
    $('#submit1').on('click', changeParagraph); 

    //Observe the paragraph 
    this.observer = new MutationObserver(function(mutations) { 
     alert('Paragraph changed!') 
    }.bind(this)); 
    this.observer.observe(test.get(0), {characterData: true, childList: true}); 
}); 
+0

Sapete perché ci sono 2 'MutationRecord' (mutazioni) nel' MutationObserver'? – Mephiztopheles

+0

Perché si sono verificate due mutazioni. Innanzitutto, l'elenco dei nodi figlio è cambiato (un nodo 'text' è stato sostituito da un altro). In secondo luogo, i 'dati' contenuti nell'elemento DOM osservato sono cambiati (guarda il valore di' test.get (0) .data' nei tuoi devtools per vedere cosa intendo). È possibile solo osservare le modifiche di 'childList' facendo' this.observer.observe (test.get (0), {childList: true}) ', ma se i dati del nodo' text' sono cambiati * senza * sostituendo quel nodo, l'osservatore non verrebbe attivato. Meglio guardare per entrambe le possibili mutazioni, quindi scorrere tra di loro per trovare quello che vuoi. – AlexZ

+0

Scooby duby dooo .... Ha funzionato .. superbo ... –

0

quanto riguarda il cambiamento è necessario per attivare evento di modifica come qui di seguito

$(document).on("click", "#submit1", function() { 
    var d = new Date(); 
    var time = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); 
    $("#test").text(time).trigger("change"); 
});  

$(document).on("change", "#test", function() { 
    alert("Paragraph changed"); 
}); 

JS Fiddle

+0

Forse sono stato chiaro nella mia domanda - ho voluto verificare le modifiche al paragrafo .. il cambiamento può essere dovuto a qualsiasi evento altrove ...La soluzione presume che la modifica avvenga tramite il solo clic del pulsante. – Soumya

+0

La mia risposta ti è d'aiuto? – Sadikhasan

1

È possibile collegare l'evento change() solo per <input>, <select> e <textarea> elemento e rilevare la loro variazione di valore. Non su altri elementi. Controllare here

0

È possibile utilizzare il codice da qui http://quiiver.appspot.com/method_observer_for_jquery e utilizzarlo come

$('#test').bind('text' // the method's name used to change the text 
, function(){ 
    alert("Paragraph changed"); 
}) 

DEMO Tuttavia, funziona solo per le modifiche effettuate tramite jQuery.

0

Non è necessariamente bisogno di JQuery, nei browser moderni API web include mutation observers. Per i browser più vecchi ci sono mutation events.

mutazione osservatore esempio:

var observer = new MutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
    alert(mutation.type); 
    });  
}); 

Fiddle con gli osservatori di mutazione: http://jsfiddle.net/nnbqye55/5/

Per le versioni precedenti di supporto JQuery/IE, vedi: https://github.com/kapetan/jquery-observe

0

si può usare 'DOMSubtreeModified' per verificare i cambiamenti dom sugli elementi del tag html. Vedi il supporto per questo event attraverso i browser.

http://jsfiddle.net/nnbqye55/7/

$(document).on("DOMSubtreeModified", "#test", function() { 
    alert("Paragraph changed"); 
});