6

我在我的 DOM 上使用event.preventDefault();for an时遇到问题。ahref

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

<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');
  });
});
4

4 回答 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;
    }
  });
于 2011-06-09T18:21:18.613 回答
5

你在使用导轨吗?看起来像。

原因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-remote, ,data-method您的事件处理程序将是唯一执行的事件处理程序。data-confirm

所以我建议你删除它们,然后在你自己的点击处理程序中重新创建你想要的任何行为。

于 2011-06-09T17:49:23.130 回答
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();
  });
});

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

于 2015-11-25T09:42:05.510 回答
0

这是一个老问题,但是如果您使用带有香草 UJS 而不是 jQuery 的 Rails 5.1+,那么无论从该方法event.preventDefault()返回还是返回都不会false阻止 rails-ujs 处理它。您需要显式调用Rails.stopEverything(event)

$('.trash_can a').click(function(event) {
  Rails.stopEverything(event);
  console.log('Clicked Delete');
});
于 2019-11-28T06:09:22.847 回答