干净和通用的解决方案与 jQuery 3.4.1 一起正常工作:
我的解决方案是执行以下操作:
- 在 jQuery 对象初始化时拦截选择器,同时使用继承透明地维护所有其他 jQuery 功能
- 构建使用我们在初始化期间添加的新“选择器”属性的刷新插件
定义:
$ = (function (originalJQuery)
{
return (function ()
{
var newJQuery = originalJQuery.apply(this, arguments);
newJQuery.selector = arguments.length > 0 ? arguments[0] : null;
return newJQuery;
});
})($);
$.fn = $.prototype = jQuery.fn;
$.fn.refresh = function ()
{
if (this.selector != null && (typeof this.selector === 'string' || this.selector instanceof String))
{
var elems = $(this.selector);
this.splice(0, this.length);
this.push.apply(this, elems);
}
return this;
};
用法:
var myAnchors = $('p > a');
//Manipulate your DOM and make changes to be captured by the refresh plugin....
myAnchors.refresh();
//Now, myAnchors variable will hold a fresh snapshot
注意:
作为优化,对象选择器不需要刷新,因为它们本质上是通过引用传递的,因此,在刷新插件中,我们仅在选择器是字符串选择器而不是对象选择器时才刷新,以便澄清,考虑以下代码:
// Define a plain object
var foo = { foo: "bar", hello: "world" };
// Pass it to the jQuery function
var $foo = $( foo );
// Test accessing property values
var test1 = $foo.prop( "foo" ); // bar
// Change the original object
foo.foo = "koko";
// Test updated property value
var test2 = $foo.prop( "foo" ); // koko