【问题标题】:JQuery delegate multiples issueJQuery委托倍数问题
【发布时间】:2014-06-19 02:18:54
【问题描述】:

我有一个委托 Jquery 函数,它正在工作,但每次我单击一个字段时,它都会增加委托函数执行的次数。

示例:3 个字段输入,我单击一个,代表会响应,但如果我单击下一个字段或什至同一字段,则该函数将运行两次,3 次运行 3 次等。

Why is this happening and how can i prevent this?

我已经尝试在函数和委托函数这两个部分上使用return false,但这根本没有帮助。

JSfiddle

HTML

<div class="input-group marg_5">
          <span class="input-group-addon">Article Title</span>
          <input id='new_vid_form_title' type="text" class="form-control vid_form" placeholder="Article Title" autocomplete='off'>
          <span class="input-group-addon"> 
            <span id="new_vid_form_title_status" class="glyphicon glyphicon-asterisk orange pointer status_box" title="Required field"></span>
          </span>
</div>

<div class="input-group marg_5">
          <span class="input-group-addon">Short Desc.</span>
          <input id="new_vid_form_shortDesc_status" type="text" class="form-control vid_form" placeholder="Short Description" autocomplete='off'>
          <span class="input-group-addon"> 
            <span id="new_vid_form_shortDesc_status" class="glyphicon glyphicon-asterisk orange pointer status_box" title="Required field"></span>
          </span>
</div>

         <hr />

<div class="input-group marg_5">
          <span class="input-group-addon">Youtube ID</span>
          <input id="new_vid_form_youtubeID_status" type="text" class="form-control vid_form" placeholder="Youtube Video ID | watch?v=' this bit ' " autocomplete='off'>
          <span class="input-group-addon"> 
            <span id="new_vid_form_youtubeID_status" class="glyphicon glyphicon-asterisk orange pointer status_box" title="Required field"></span>
          </span>
</div>

         <hr /> 

JQuery/JS

function new_vid() {
    $("div").delegate("input","click",function(){
        $('.vid_form').keyup( function() {
                  alert('ddd'); 
        });

    });
}

【问题讨论】:

  • 你不应该在每次点击时都安装一个新的 keyup 处理程序——那是你的问题。
  • 我不确定我是否关注?我有一个需要基于keyup操作的功能。我该如何让委托正确地适应这个功能? @jfriend00
  • 我不知道你想在你的页面中完成什么,但希望你能理解每次点击事件发生时,你都在安装另一个 .keyup() 处理程序,这就是为什么你正在每个键上调用 N 个处理程序,所以显然这段代码是不正确的。我不知道您真正希望点击一下会发生什么。
  • 是的,我想我一直在以错误的方式考虑委托。我需要它,因为我正在将带有 ajax 的 div 加载到 DOM 中,并且预先加载了控制它们的脚本。我认为委托是正确的方法,但也许我应该尝试 on() 代替? @jfriend00
  • .on() 在这方面的工作方式与.delegate() 没有任何不同。那不是你的问题。

标签: jquery html delegates


【解决方案1】:

所以,虽然我认为您在这里使用委托来确保代码发生一次,但其中包含的代码会发生多次。澄清一下:每次单击 div 中包含的输入时,它都会执行 delegate 函数的主体。结果?您附加一个 keyup 处理程序。点击2?您附加一个 keyup 处理程序。点击 3?一样的。

您在函数体内拥有的是对 keyup 事件的绑定,而将来不会破坏该 keyup 事件,因此该事件的多次执行。你最好这样做:

http://jsfiddle.net/notsoluckycharm/NYdVA/

$("div").delegate(".vid_form","keyup",function(){
   alert('ddd'); 
 });

现在,委托已被弃用,但我按照您提出的方式回答了它。

较新版本的 jQuery 看起来像这样

$("div").on("keyup",".vid_form",function(){
   alert('ddd'); 
 });

【讨论】:

  • 是的,我对委托的使用是为了确保它在加载 js 文件后将 div 一致地加载到 DOM 中运行。这导致脚本中断,因此我尝试使用委托。您发布的on() 方法与我试图让delegate 工作时完全相同。我只是用错误的方法去做。非常感谢!
  • 没问题!很高兴我能帮上忙。随意接受我可爱的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多