Question

A little while ago I asked a question about preventing the duplicate binding of events [here] I am trying to update expresion for 1.8 but cant get it to work:

the original:

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

My failed attempt:

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

usage:

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

This works:

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

Solution

1) You have typo in code: $_.data instead of $._data

2) You can't use selector argument as object property using dot . This is string, and if you want to check that object has such property name you should use brackets obj[selector]

So fixed code for this expression will look like following:

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

Working JSFiddle available here.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top