我习惯于做这样的事情:
$(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/