Javascript 为什么链式filter()调用会重新触发它所使用的函数?

Javascript 为什么链式filter()调用会重新触发它所使用的函数?,javascript,jquery,jquery-mobile,filter,Javascript,Jquery,Jquery Mobile,Filter,我习惯于这样做: $(some_elements) .filter(function() { return $(this).jqmData("locked") !== true; }) .jqmData('locked', true ) .each( function(){ // stuff }); 因此,我的筛选器调用会选择所有“未锁定”的元素,对它们运行函数并将它们锁定,以便下次排除它们 现在,我正在尝试在小部件工厂函数中使

我习惯于这样做:

$(some_elements)
   .filter(function() { return $(this).jqmData("locked") !== true; })
       .jqmData('locked', true )
       .each( function(){
         // stuff
       });
因此,我的筛选器调用会选择所有“未锁定”的元素,对它们运行函数并将它们锁定,以便下次排除它们

现在,我正在尝试在小部件工厂函数中使用此过滤器:

...
_create: function() {
    var self = this;
    self.refresh( true );
},

refresh: function ( create ) {
...
    $filter
        .submit( function( e ) {
            e.preventDefault();
            search.blur();
        })
        .bind( "submit", function() {
            return false;
        })
        .filter(function() { return this.getAttribute( "data-override" ) !== false; })
            .find( "input" )
                .bind( "keyup change input", self.filter( e, kids ) )
                .end()
            .end()
        .prepend( o.target || $( container ) );
},
...
当我在这里使用它时,调用
filter()
会重新触发我的
\u create
函数,我不知道为什么。如果我离开过滤器,一切正常,所以它必须在我的过滤呼叫

问题
我在filter()函数中做错了什么

编辑:
因此,这不是链式的,而是有效的:

 $filter
    .submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .prependTo( $( o.target ) || $( el ) );

 if ( $(this).jqmData("override") === false ) {
    $filter
        .find( "input" )
        .bind( "keyup change input", function() {
            self.filter( e, kids );
        });
 }
但这并不是(refires
\u create
):


这两个事件处理程序完全相同:

.submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .bind( "submit", function() {
        return false;
    })
此函数立即执行函数并返回结果:

.bind( "keyup change input", self.filter( e, kids ) )
或许应该是:

    .bind( "keyup change input", function() {
       self.filter( e, kids );
    })
    .end() ....
你最终会得到:

$filter.on('submit',function (e) {
    e.preventDefault();
    search.blur();
}).filter(function() {
    return $(this).data("override");
}).find("input").on('keyup change input', function() {
    self.filter(e, kids);
}).end().end().prepend(o.target || $(container);


不。它仍然会重新触发我的小部件创建功能。给我一分钟,我发布了哪些不起作用,哪些起作用。您是否尝试删除一个
end()
语句,因为似乎有一个太多了?不,应该有两个,没有注意到find()。您是否尝试在prependTo函数中不使用OR语句?是的。不是这样。问题在于
.filter()
调用。如果我不考虑这一点,一切都会好起来。
$filter.on('submit',function (e) {
    e.preventDefault();
    search.blur();
}).filter(function() {
    return $(this).data("override");
}).find("input").on('keyup change input', function() {
    self.filter(e, kids);
}).end().end().prepend(o.target || $(container);
$filter.prependTo(o.target || $(container)
       .on('submit',function (e) {
           e.preventDefault();
           search.blur();
     }).filter(function() {
           return $(this).data("override");
     }).find("input")
       .on('keyup change input', function() {
           self.filter(e, kids);
 });