Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获得;这";jQuery live/delegate中有超时的元素ID_Javascript_Binding_Jquery - Fatal编程技术网

Javascript 获得;这";jQuery live/delegate中有超时的元素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

我试图获取与jQuery delegate()函数绑定的元素的ID。我想把元素的ID传递给另一个函数。返回的ID总是“未定义”,我不知道为什么。这是我的密码:

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