检测jQuery何时找到一个元素

时间:2017-04-27 15:27:16

标签: javascript jquery plugins

有没有办法检测jQuery何时在文档中的元素中找到。例如,我有一个功能:

function filter(jObject) { 
    alert('Did something wonderful');
    console.log(jObject); // jQueryObject
}

我希望过滤器将自身附加到每个jQuery对象,并在触发$()时调用。所以:

<div id="divElement">A Dummy</div>

<script>
    $('#divElement'); // Will trigger filter() and alert will popup.
    // Console will print out the jQuery Object above.
</script>

为什么我要这样做?假设我去了

document.getElementById('divElement').controller = new function() { ... };
$('#divElement').controller; // This is undefined.

因此我需要写一些像$ .fn.checkExtendedProperty = function();并且每次调用$时都会触发它以查找jQuery未命中的那些属性。 (不修改jquery.js文件本身。出于显而易见的原因,我宁愿不篡改它。)

有趣的黑客我找到了,它的确有效。尚不确定其含义是什么。

$$ = $;
$ = function(mix) {
    var jObj = $$(mix);
    jObj = checkExtendedProperty(jObj); // Binding Extended Property
    return jObj;
};
function checkExtendedProperty(jObj) { ... }
// Copying all References.
for( var i in $$ ) { $[i] = $$[i]; }

如果有人知道使用jQuery本机函数或某种插件钩子的更好方法,那将非常有用。

1 个答案:

答案 0 :(得分:0)

这个问题的唯一解决方案是停止向元素添加函数作为属性,并创建一个与您的模块接口的jQuery方法。

// setter/general function call (looks at all selected elements)
$.fn.controller = function (obj) {
  return this.each(function () {
    myModule.controller(this, obj);
  });
};
// getter (only looks at first selected element)
$.fn.getController = function () {
  return myModule.getController(this[0]);
};

不是向元素添加函数,而是为它们指定一个类,表明它们与模块相关联,并且您需要能够使用模块中的记录识别它的任何信息都应存储在数据属性中。

在定义所述方法之前,你总是可以检查jquery是否包含在内,这样你的代码可以使用和不使用jquery。