我需要知道 DOM 节点的内容何时发生变化。幸运的是,我可以确定所有这些更改都将通过调用.text(val)
or来实现.html(val)
。
调用这两个函数时,是否可以让 jQuery 发送事件?
如果你真的需要做到这一点,你可以考虑给jQuery打猴子补丁。基本要点已编辑 - 取自参考链接:
(function($){
// store original reference to the method
var _old = $.fn.text;
$.fn.text = function(text){
// modifications go here
return _old.apply(this,arguments);
};
})(jQuery);
它非常笨拙,所以我只会在它是获得所需内容的唯一方法时才考虑它,并且您必须非常小心 jQuery API 更改。
您可以扩展 jQuery 函数text()
和html()
. 我在某个地方找到了这个(对不起,我没有来源,如果你知道谁应该为此归功于它,请有人编辑),它对我来说就像一个魅力
(function ($) {
var originalHtmlFunction = $.fn.html;
$.fn.html = function (value) {
if (typeof value != 'undefined') {
var jqObj = originalHtmlFunction.call(this, value);
// Do your magic here
return jqObj;
}
else {
return originalHtmlFunction.call(this, value);
}
};
var originalTextFunction = $.fn.text;
$.fn.text = function (value) {
if (typeof value != 'undefined') {
var jqObj = originalTextFunction.call(this, value);
// Do your magic here
return jqObj;
}
else {
return originalTextFunction.call(this,value);
}
};
})(jQuery);
您可以像这样重载.text()
(或任何 jQuery 方法),并将已更改的任何内容保存在我们可以创建的日志记录类中。这是下面的基本课程。
var textLogger = new (function textChangeLog () {
this.logArray = [];
this.add = function (item) {
this.logArray.push(item);
};
this.displayLog = function (index) {
if (typeof index === 'number') { console.log( this.logArray[index] ); }
else { console.log( this.logArray ); }
};
})();
现在我们覆盖当前.text()
并添加我们的一些添加。日志记录类和回调函数(如果您想要更多功能)
$.fn.oldText = $.fn.text;
// ** NOTE: At any point you can just use $('body').oldText('change it');
// to by pass any of the below changes / overrides to .text()
$.fn.text = function (str, funcEvent) {
try {
// Let's log anything that's being changed in our textLogger class Array
textLogger.add($(this));
// call the original .text()
$(this).oldText(str);
// the optional event you passed in
var callbackFunc = typeof funcEvent !== 'undefined' ? funcEvent : function () { };
callbackFunc();
}
catch(e) { console.log(e); }
};
现在我们做一些示例用法,然后我们执行textLogger.displayLog()以在控制台中查看我们的结果。你会在一个数组中看到整个 jQuery 选择器/上下文/ID。
$('div').text('here');
$('#anotherExample').text('we changed this too!');
textLogger.displayLog();
$('#cbTest').text('blah', function () { console.log('callback!'); });
编辑更新了 jsFiddle 以显示如何在文本更改时触发/响应自定义事件。
是的,这是可能的,但取决于您如何使用所述方法,它可能效率不高。
$.each(["text","html"], function(i,method) {
var oldMethod = $.fn[method];
$.fn[method] = function(){
this.trigger(method+"change");
oldMethod.apply(this,arguments);
};
});
// sample usage:
$("#someelement").on("textchange",function(){
alert("Text Change!");
}).text("Foobar");