javascript - 为什么链式 filter() 调用会重新触发创建它的函数?

标签 javascript jquery jquery-mobile filter

我习惯于做这样的事情:

$(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() 的调用会重新触发我的 _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 );
        });
 }

虽然这不是(重新触发 _create):

$filter
    .submit( function( e ) {
        e.preventDefault();
        search.blur();
    })
    .filter( function() {
        console.log($(this).data("override"))
        return $(this).data("override");
    })
    .find("input")
        .bind( "keyup change input", function() {
            self.filter( e, kids );
    })
    .end()
    .end()
    .prependTo( $( o.target ) || $( el ) );

最佳答案

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

.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);

$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);
 });

关于javascript - 为什么链式 filter() 调用会重新触发创建它的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15601832/

相关文章:

jQuery 的传播和 Keydown 问题

jquery - Wookmark 插件,图像重叠问题

jquery-mobile - jquery-mobile 按钮数据图标在哪里?

php - 无法获取我的数组所需的模板

javascript - 如何通过复选框隐藏/显示显示具有不同标题的相同 div

javascript - 如何使链接在单击时打开多个页面

jquery - 使用自己的样式表在 JQuery Mobile 中定位 CSS

javascript - 在 Vue 项目中使 axios 全局化不起作用

javascript - 无论函数名称如何,如何执行递归?

php - jQuery Mobile PHP 站点 - 如何在 iOS 上使用 Web Clip 保持登录状态