我在使用event.preventDefault()时遇到问题;在我的DOM上找到一个ahref

问题描述 投票:6回答:4

我在将DOM上的event.preventDefault();用作ahref时遇到麻烦。

如何防止URL发布nofollow删除,如HTML使用JQuery指定的那样?

<td class="trash_can">
<a rel="nofollow" data-remote="true" data-method="delete" data-confirm="Are you sure you want to delete Greek Theater at U.C. Berkeley?" href="/promotions/2/places/46">
<img id="trash_can" src="http://test.dev/images/trash.png?1305741883" alt="Trash">

以下代码应颠覆HTML,但HTML会在发出“您确定”警告之前发布删除操作。什么都不起作用:

  $(function(){
  $('.trash_can a').click(function(event) {
    event.preventDefault();
    console.log('Clicked Delete');
  });
});
jquery ruby-on-rails events preventdefault
4个回答
7
投票

[有可能不仅需要event.preventDefault(),还需要执行return false。 preventDefault()阻止默认操作,但事件仍然冒泡,可能会到达下一个处理程序,该处理程序可能是Fredrik指出的rails处理程序:

 $(rails.linkClickSelector).live('click.rails', function(e) {
    var link = $(this);
    if (!rails.allowAction(link)) return rails.stopEverything(e);

    if (link.data('remote') !== undefined) {
      rails.handleRemote(link);
      return false;
    } else if (link.data('method')) {
      rails.handleMethod(link);
      return false;
    }
  });

4
投票

您使用滑轨吗?看起来像。

event.preventDefault()不起作用的原因是因为魔术是在其他地方完成的。Rails附带了一些帮助程序,这些帮助程序为Rails生成的所有“删除”操作创建事件处理程序。因此,在您的情况下,我认为您需要了解如何覆盖帮助程序,或者只是为该特定的删除操作创建自定义事件处理程序。

这是Rails使用的JQuery代码:

https://github.com/rails/jquery-ujs/blob/master/src/rails.js

基于此(来自链接):

linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]'

如果从链接中删除data-remotedata-methoddata-confirm,您的事件处理程序将是唯一执行的事件。

因此,建议您删除它们,然后在自己的单击处理程序中重新创建所需的任何行为。


0
投票

我也遇到了同样的问题,但是好几个小时后都没有得到好的解决方案。因此,根据此处建议的答案,我做了类似的事情:

function enableLink() {
  jQuery("#link_id").removeClass("disabled");
  jQuery("#link_id").attr("data-remote", true);
}


function disableLink() {
  jQuery("#link_id").addClass("disabled");
  jQuery("#link_id").removeAttr("data-remote");
}

jQuery(document).ready(function(){
  jQuery(document).on("click", "disabled", function(e){
    e.preventDefault();
  });
});

我接受这不是一个好的解决方法。但是,那帮助了我。


0
投票

这是一个古老的问题,但是如果您将Rails 5.1+与香草UJS而不是jQuery一起使用,则event.preventDefault()或从该方法返回false都不会阻止Rails-ujs对其进行处理。您需要显式调用Rails.stopEverything(event)

Rails.stopEverything(event)
© www.soinside.com 2019 - 2024. All rights reserved.