我在将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');
});
});
[有可能不仅需要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;
}
});
您使用滑轨吗?看起来像。
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
,您的事件处理程序将是唯一执行的事件。
因此,建议您删除它们,然后在自己的单击处理程序中重新创建所需的任何行为。
我也遇到了同样的问题,但是好几个小时后都没有得到好的解决方案。因此,根据此处建议的答案,我做了类似的事情:
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();
});
});
我接受这不是一个好的解决方法。但是,那帮助了我。
这是一个古老的问题,但是如果您将Rails 5.1+与香草UJS而不是jQuery一起使用,则event.preventDefault()
或从该方法返回false
都不会阻止Rails-ujs对其进行处理。您需要显式调用Rails.stopEverything(event)
Rails.stopEverything(event)