Javascript 获得;这";jQuery live/delegate中有超时的元素ID
我试图获取与jQuery delegate()函数绑定的元素的ID。我想把元素的ID传递给另一个函数。返回的ID总是“未定义”,我不知道为什么。这是我的密码:Javascript 获得;这";jQuery live/delegate中有超时的元素ID,javascript,binding,jquery,Javascript,Binding,Jquery,我试图获取与jQuery delegate()函数绑定的元素的ID。我想把元素的ID传递给另一个函数。返回的ID总是“未定义”,我不知道为什么。这是我的密码: $(document).ready(function() { var timeout = undefined; $('body').delegate( '#tab-form input[type="text"]', 'keypress', function(){ if(timeout != un
$(document).ready(function() {
var timeout = undefined;
$('body').delegate(
'#tab-form input[type="text"]',
'keypress',
function(){
if(timeout != undefined) {
clearTimeout(timeout);
}
timeout = setTimeout(function() {
timeout = undefined;
alert($(this).attr('id'));
}, 500);
}
);
});
和我的标记:
<form id="tab-form">
<input type="text" value="" id="Tab_name" name="Tab[name]">
<input type="text" value="" id="Tab_text" name="Tab[text]">
</form>
在文本输入中按一个键会弹出一个JS警报,上面写着“未定义”,而不是我想象中的“Tab_名称”或“Tab_文本”
我最初在谷歌上搜索时认为,attr('id')未定义的原因是“this”实际上不是单个DOM元素,而是delegate()所附加的元素数组。我还没有弄清楚如何在jQuery对象数组中访问当前绑定元素的DOM对象
非常感谢您的帮助 上下文是
window
,因为window
拥有setTimeout
。只需缓存它:
$(document).ready(function() {
var timeout = undefined;
$('body').delegate(
'#tab-form input[type="text"]',
'keypress',
function(){
var el = this;
if(timeout != undefined) {
clearTimeout(timeout);
}
timeout = setTimeout(function() {
timeout = undefined;
alert($(el).attr('id'));
}, 500);
}
);
});
这是因为
这个
不是你想要的匿名函数,它是窗口
。有几种方法可以解决这一问题,例如使用以下方法:
timeout = setTimeout($.proxy(function() {
timeout = undefined;
alert(this.id);
}, this), 500);
meder
已经指出了这种行为的原因。您还可以传入事件对象
并使用目标
:
$(document).ready(function() {
var timeout = undefined;
$('body').delegate(
'#tab-form input[type="text"]',
'keypress',
function(event){
if(timeout != undefined) {
clearTimeout(timeout);
}
timeout = setTimeout(function() {
timeout = undefined;
alert($(event.target).attr('id'));
}, 500);
}
);
});
旁注:在document.body上使用
.delegate()。您可以使用.live()
将这些事件绑定到您的元素 由于其他选项都有,我将给出结束
选项:o)
EDIT:为了解释发生了什么,基本上您创建了一个函数,调用该函数并将此
作为参数同时传递给该函数
这样想:
// Create a new function that accepts one argument
function myFunc( th ) {
timeout = setTimeout(function() {
timeout = undefined;
alert(th.id);
}, 500);
}
// Immediately call the function, and pass "this" in to it
myFunc( this );
这是完全相同的事情。这样,将整个函数包装在()
中,通过删除函数名myFunc
使其匿名,然后从函数调用中获取执行操作符(this)
,并将其直接放在函数后面
当您这样做的时候,您实际上是在创建函数之后调用它。这只是一种立即执行未命名(匿名)函数的简单方法。我对您的问题没有答案,但您可能希望将该按键更改为keydown或keydup,因为keypress在某些浏览器中存在一些问题。谢谢,我将在侧边说明,您是对的(我认为)在研究了live和delegate之间的差异之后。我复制了Yii进行绑定的方式,他们只是将其从live更改为delegate,以进行一些bug修复()。但是,是的,我可能只是绑定到形式而不是身体。这是什么语法巫毒?刚刚运行了它,它工作了,但是,伙计,我还没看到before@thaddeusmt-它是一个闭包,是javascript的一个非常有用的功能。基本上,您正在函数体内部创建一个新的作用域,调用函数并将
this
作为参数传入,并使用th
参数引用该参数。我将更新我的答案,进一步解释闭包。这就是我最后所做的,因为在这种情况下,这似乎是对我来说最简单、最直接的方法
// Create a new function that accepts one argument
function myFunc( th ) {
timeout = setTimeout(function() {
timeout = undefined;
alert(th.id);
}, 500);
}
// Immediately call the function, and pass "this" in to it
myFunc( this );