【问题标题】:jquery event delegation variable scope with consecutive calls具有连续调用的jQuery事件委托变量范围
【发布时间】:2011-11-28 12:37:13
【问题描述】:

借助 jQuery 1.6 中的事件委托,您可以响应已冒泡到共同父级的事件。

一个示例实现是这样的:

(function($){
  $.fn.myeventhandler = function () {

     return this.delegate('a.next, a.prev', 'click customEvent', function (event) {

       var target=$(event.target);
       var bar = null;

       if('click' == event.type) {              /*~[ call this 'a' ]~*/

          // handle the click event
          $('#next-element').animate({width:'200px'},1300,function(){
             bar = 'value1';
             $('#next-element').animate({width:'100px'},1300,function(){
                 bar = 'value2';
                 console.log(bar);
             });
          });

       } else if('customEvent' == event.type) { /*~[ call this 'b' ]~*/

          // handle the customEvent event
          $('#my-element').animate({height:'200px'},1300,function(){
             bar = 'my-event1';
             console.log(bar);
          });

       }

       return false;
     });
  }
})(jQuery);

当您想在页面上绑定许多事件触发器时,这种结构可以很好地工作。但是,我注意到了一个奇怪的行为,想知道是否有人可以在以下范围内启发我:

如果你在'a'之前定义了一个变量'var bar;'并在'a'中使用它并且'a'需要很长时间才能执行,那么如果'click'被第二次触发,'bar ' 变量被重新赋值还是会创建一个新的?

问题的原因是我有一个“未完成”的动画,其中动画需要 1.3 秒才能完成。如果我触发了两个连续的点击事件,则目标和类型设置正确,但第二个动画似乎影响了第一个动画,并且两个范围似乎对彼此可用。

我还没有完成动画,所以我还没有一个工作集可以在 jsFiddle 中上线,但是这里有没有我应该研究的范围的经验法则或者对范围的更清晰的解释?可能找到了?

编辑: 在上面,我添加了类似于我正在使用的情况。在上面的简化情况下,'bar' 的值在 2 次连续调用中仍然保持预期值,但在更复杂的情况下,我正在处理(仍然),除非我专门将参数传递给回调函数,否则仍然存在允许 2 次连续调用更改参数值的条件,以便回调看到由后续调用创建的值 - 而不是在其自己的触发调用中逻辑设置的值。如果有人可以在简化的示例中复制这种效果,我将不胜感激。我正在缩减我的函数以尝试生成一个复制它的 jsFiddle。

谢谢, 自动曝光

【问题讨论】:

  • 嗨,Interstellar_Coder,cmets 中的“a”指的是第一个 if() 代码块,“b”指的是“else”代码块 - 抱歉,如果 cmets 没有帮助 - 什么一个更好的例子来说明它?

标签: jquery scope event-delegation


【解决方案1】:

如果您再次单击它,则会创建一个新的条形变量,两个条形值将彼此独立。为了看到这一点,我创建了一个fiddle。快速单击两次,您会注意到第二个时间柱采用默认值,而不是初始柱变量所具有的值,这是预期的。

【讨论】:

  • 这是一个很好的例子(略微编辑以更紧密地匹配没有外部变量范围的问题)一个调用不应影响另一个调用。我还没有看到我做了什么导致它,但它看起来更像是一个错误而不是范围问题。您能否扩展范围本身并解释每个事件触发器会发生什么?它是独立的吗?
【解决方案2】:

事件对象被传递而不是新创建的各种事件,因此,“a”不会被重新分配,但会受到两个事件操作的影响。

【讨论】:

  • 嗨@swatkins,我不确定我是否遵循了你的意思。有趣的是,jsfiddle.net/BHaEj/4 链接(已更改)显示当第二个事件到来时 bar 变量没有被闪击,并且在我还没有完成的代码中,我可以影响 if 循环中的变量后续调用。我会再尝试一下我的变量名,看看是否有单独的问题在起作用。
  • 好吧,在小提琴中,您在全局空间中有count。所以它根本不依赖于事件对象——事件对象正在修改count,这就是为什么这个小提琴按预期工作的原因。但是,如果您在点击操作的回调函数中声明count,那么每次点击发生时都会重新声明它。事件对象本身是相同的(属性值不同),但声明的特定变量将在每个操作中重新声明。这是 jQuery 事件对象的文档:api.jquery.com/category/events/event-object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2013-01-18
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多