2012-10-03 42 views
15

这里是场景,我的内容是基于一个类异步加载的。所以,如果我有这个类的链接ajaxLink它触发如下:防止多个点击事件触发JQuery

$('a.ajaxLink').click(function (e) { 
     e.preventDefault(); 
     var container = $(this).parents('div.fullBottomContent'); 
     var href = $(this).attr('href'); 
     container.fadeOut('fast', function() { 
      $.ajax({ 
       url: href, 
       dataType: "html", 
       type: "GET", 
       success: function (data) { 
        container.html(data); 
        BindEventHandlers(); 
        container.fadeIn(); 
        $.validator.unobtrusive.parse('form'); 
       }, 
       error: function() { 
        alert('An error has occurred'); 
       } 
      }); 
     }); 

    }); 

所有可爱。现在,在一种情况下我想,所以我已经写了显示一个警告用户confirm,他们要加载的页面并失去其所有的变化是:

$('a.addANewHotel').click(function (e) { 
     if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) { 
      e.stopPropagation(); 
     } 
    }); 

现在我已经试过return falsee.preventDefault()e.stopPropagation();但无论第一种方法总是被解雇?我怎样才能防止额外的点击事件发射?这是事件顺序吗?

看不出这是相关的,但我的HTML是:

<a style="" href="/CMS/CreateANewHotel?regionID=3&amp;destinationID=1&amp;countryName=Australia" class="button wideBorderlessButton ajaxLink addANewHotel">Add a new hotel</a> 
+0

什么是你的HTML是什么样子? – Asciiom

+0

我不认为HTML有任何阻碍,但无论如何加入 – Liam

+1

我不明白你为什么要通过绑定2个不同的事件到一个相同的元素。我只是显示/不显示确认消息,取决于哪个元素被点击,但所有内部相同的点击事件(例如使用hasClass if) – Th0rndike

回答

27

你试过了吗:event.stopImmediatePropagation

我相信这是你在找什么:

http://api.jquery.com/event.stopImmediatePropagation/

$('a.addANewHotel').click(function (e) { 
     if (!confirm('Adding a new hotel will loose any unsaved changes, continue?')) { 
      e.stopImmediatePropagation(); 
      e.preventDefault(); 
     } 
    }); 
+0

不起作用。他在同一个元素上有两个处理器,这只会阻止传播到父元素,并且不会帮助他解决这个问题。 – Asciiom

+2

从文档:“保持处理程序的其余部分不被执行,并防止事件冒泡DOM树。” – bstakes

+0

我的错误对不起,你完全正确! – Asciiom

1

stopPropagation会冒泡到父元素停止的情况下,不能防止在相同的元素触发其它单击处理。所以你的解决方案将无法工作。

你可以做这样的例子:

$('a.ajaxLink').click(function (e) { 
    e.preventDefault(); 

    if($(this).hasClass("a.addANewHotel") && 
      !confirm('Adding a new hotel will loose any unsaved changes, continue?')){ 
     return false; 
    } 

    var container = $(this).parents('div.fullBottomContent'); 
    var href = $(this).attr('href'); 
    container.fadeOut('fast', function() { 
     $.ajax({ 
      url: href, 
      dataType: "html", 
      type: "GET", 
      success: function (data) { 
       container.html(data); 
       BindEventHandlers(); 
       container.fadeIn(); 
       $.validator.unobtrusive.parse('form'); 
      }, 
      error: function() { 
       alert('An error has occurred'); 
      } 
     }); 
    }); 

}); 

如果你有很多不同类型的链接,你应该把公共代码的功能,并绑定使用差分类的处理程序。这些处理程序可以在适当的时候调用通用代码。

+0

+1是的我可以,如果我不需要用通用的ajaxLink点击很多其他的东西,会更好吗? – Liam

+0

取决于,如果你会有很多不同类型的链接需要不同的处理,这将变得混乱,但对于这个例外,我认为是可以接受的。额外的建议添加回答。 – Asciiom