Utwórz specjalne Zdarzenie jQuery dla zmienionej zawartości
Próbuję utworzyć specjalne Zdarzenie jQuery, które uruchamia się, gdy zawartość, która jest związana, zmienia się. Moją metodą jest sprawdzenie zawartości za pomocą setInterval i sprawdzenie, czy zawartość zmieniła się od ostatniego razu. Jeśli masz na to lepszy sposób, daj mi znać. Innym problemem jest to, że nie mogę usunąć odstępu. W każdym razie, to, czego potrzebuję, to najlepszy sposób, aby sprawdzić zmiany treści w wydarzeniu.wyjątkowy.
(function(){
var interval;
jQuery.event.special.contentchange = {
setup: function(data, namespaces) {
var $this = $(this);
var $originalContent = $this.text();
interval = setInterval(function(){
if($originalContent != $this.text()) {
console.log('content changed');
$originalContent = $this.text();
jQuery.event.special.contentchange.handler();
}
},500);
},
teardown: function(namespaces){
clearInterval(interval);
},
handler: function(namespaces) {
jQuery.event.handle.apply(this, arguments)
}
};
})();
I zwiąż to tak:
$('#container').bind('contentchange', function() {
console.log('contentchange triggered');
});
I get the konsola.log "zawartość zmieniona", ale nie konsola.log "contentchange Trigger". Więc to oczywiste, że oddzwanianie nigdy nie jest wyzwalane.
Po prostu używam Firebug do zmiany zawartości i wyzwalania zdarzenia, aby go przetestować.
Update
Chyba nie wyraziłem się wystarczająco jasno, mój kod nie działa. Szukam tego, co robię źle.
Oto gotowy kod dla wszystkich zainteresowanych
(function(){
var interval;
jQuery.event.special.contentchange = {
setup: function(){
var self = this,
$this = $(this),
$originalContent = $this.text();
interval = setInterval(function(){
if($originalContent != $this.text()) {
$originalContent = $this.text();
jQuery.event.handle.call(self, {type:'contentchange'});
}
},100);
},
teardown: function(){
clearInterval(interval);
}
};
})();
Dzięki Mushexowi za pomoc. 4 answers
Spójrz również na James podobny skrypt (deklarowanie jako metoda obiektu jquery, a nie jako zdarzenie)
jQuery.fn.watch = function( id, fn ) {
return this.each(function(){
var self = this;
var oldVal = self[id];
$(self).data(
'watch_timer',
setInterval(function(){
if (self[id] !== oldVal) {
fn.call(self, id, oldVal, self[id]);
oldVal = self[id];
}
}, 100)
);
});
return self;
};
jQuery.fn.unwatch = function( id ) {
return this.each(function(){
clearInterval( $(this).data('watch_timer') );
});
};
I tworzenie specjalnego zdarzenia
jQuery.fn.valuechange = function(fn) {
return this.bind('valuechange', fn);
};
jQuery.event.special.valuechange = {
setup: function() {
jQuery(this).watch('value', function(){
jQuery.event.handle.call(this, {type:'valuechange'});
});
},
teardown: function() {
jQuery(this).unwatch('value');
}
};
W każdym razie, jeśli potrzebujesz go tylko jako wydarzenie, skrypt jest ładny:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-19 23:05:01
Wiem, że ten post / pytanie jest trochę stary, ale w dzisiejszych czasach byłem za podobnym rozwiązaniem i znalazłem to: {]}
$('#selector').bind('DOMNodeInserted', function(e) {
console.log(e.target);
});
Źródło: http://naspinski.net/post/Monitoring-a-DOM-Element-for-Modification-with-jQuery.aspx
Mam nadzieję, że to komuś pomoże!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-06 18:52:57
Gotowy kod w oryginalnym pytaniu zadziałał dla mnie, dziękuję! Chciałbym tylko zauważyć, że używam jquery 1.9.1 i $.wydarzenie.uchwyt został usunięty. Zmieniłem następujące, aby to działało.
JQuery.wydarzenie.uchwyt.call (self, {type: 'contentchange'});
Do
JQuery.wydarzenie.centrala.call (self, {type: 'contentchange'});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-17 13:06:23
Może mógłbyś spróbować Mutation Observer
Oto kod:
mainArea = document.querySelector("#main_area");
MutationObserver = window.MutationObserver;
DocumentObserver = new MutationObserver(function() {
//what you want to run
});
DocumentObserverConfig = {attributes: true, childList: true, characterData: true, subtree: true};
DocumentObserver.observe(mainArea, DocumentObserverConfig);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-12 05:11:32