为1.8 Sizzle重写jQuery表达式/选择器

时间:2012-11-23 12:15:18

标签: javascript jquery jquery-selectors jquery-1.8

不久前,我问了一个关于防止事件重复绑定的问题 [here] 我试图更新1.8的expresion,但无法让它工作:

原文:

$.expr[':'].hasEvent = function(obj, idx, meta, stack) {
    return ($._data((obj), 'events') != undefined && $_.data((obj), 'events')[meta[3]] != undefined);
};

我失败的尝试:

jQuery.expr[':'].hasEvent = $.expr.createPseudo(function( selector, context ) {
    return function(elem) {
        return ($._data((elem), 'events') != undefined && $_.data((elem), 'events').selector != undefined);
    }
});

用法:

$(object).not(":hasEvent(myEvent)").on("myEvent", onMyEvent);

这有效:

if (!$._data((object), 'events') || !$._data((object), 'events').myEvent) {
    $(object).on("myEvent", onMyEvent);
}

1 个答案:

答案 0 :(得分:1)

1)您的代码中有拼写错误:$_.data而不是$._data

2)您不能使用selector参数作为对象属性使用点.这是字符串,如果您想检查该对象是否具有此类属性名称,则应使用括号{{1} }

因此,此表达式的固定代码如下所示:

obj[selector]

使用JSFiddle here