jQuery切换默认情况下会调用preventDefault(),因此默认设置无效。您不能单击复选框,您不能单击链接等
是否可以恢复默认处理程序?
preventDefault
调用它的效果。当前,这个问题实际上是“如何将事件侦听器与jQuery绑定?”。
jQuery切换默认情况下会调用preventDefault(),因此默认设置无效。您不能单击复选框,您不能单击链接等
是否可以恢复默认处理程序?
preventDefault
调用它的效果。当前,这个问题实际上是“如何将事件侦听器与jQuery绑定?”。
Answers:
就我而言:
$('#some_link').click(function(event){
event.preventDefault();
});
$('#some_link').unbind('click');
是还原默认操作的唯一方法。
如在这里看到的那样:https : //stackoverflow.com/a/1673570/211514
它相当简单
让我们假设你做类似的事情
document.ontouchmove = function(e){ e.preventDefault(); }
现在将其恢复为原始状态,请执行以下操作...
document.ontouchmove = function(e){ return true; }
从这个网站。
无法还原,preventDefault()
但是您可以欺骗它:)
<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
if($(this).hasClass('prevented')){
e.preventDefault();
$(this).removeClass('prevented');
}else{
$(this).addClass('prevented');
}
});
</script>
如果您想更进一步,甚至可以使用触发按钮来触发事件。
在某些情况下*,最初可以return false
代替e.preventDefault()
,然后在要将默认值恢复为时使用return true
。
*表示当您不介意事件冒泡并且不e.stopPropagation()
与e.preventDefault()
另请参见类似的问题(也在堆栈溢出中)
或使用复选框,您可以输入以下内容:
$(element).toggle(function(){
$(":checkbox").attr('disabled', true);
},
function(){
$(":checkbox").removeAttr('disabled');
})
您可以通过执行以下操作恢复默认操作(如果遵循HREF):
window.location = $(this).attr('href');
如果它是一个链接,$(this).unbind("click");
则将重新启用该链接单击,并且将恢复默认行为。
我创建了一个演示JS小提琴来演示其工作原理:
这是JS小提琴的代码:
HTML:
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>
Javascript:
<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
event.preventDefault();
$( "<div>" )
.append( "default " + event.type + " prevented "+counter )
.appendTo( "#log" );
if(counter == 2)
{
$( "<div>" )
.append( "now enable click" )
.appendTo( "#log" );
$(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
}
else
{
$( "<div>" )
.append( "still disabled" )
.appendTo( "#log" );
}
counter++;
});
});
</script>
最好的方法是使用名称空间。这是一种安全的方法。.rb是命名空间,可确保取消绑定功能在特定的keydown上起作用,而不在其他keydown上起作用。
$(document).bind('keydown.rb','Ctrl+r',function(e){
e.stopImmediatePropagation();
return false;
});
$(document).unbind('keydown.rb');
ref1:http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/
禁用:
document.ontouchstart = function(e){ e.preventDefault(); }
启用:
document.ontouchstart = function(e){ return true; }
事件接口的preventDefault()方法告诉用户代理,如果未明确处理事件,则不应像通常那样采取其默认操作。该事件将继续照常传播,除非事件监听器之一调用stopPropagation()或stopImmediatePropagation(),它们中的任何一个都会立即终止传播。
在事件流的任何阶段调用preventDefault()都会取消事件,这意味着实现通常不会由于事件而执行任何默认操作。
您可以使用Event.cancelable检查事件是否可取消。为不可取消的事件调用preventDefault()无效。
window.onKeydown = event => {
/*
if the control button is pressed, the event.ctrKey
will be the value [true]
*/
if (event.ctrKey && event.keyCode == 83) {
event.preventDefault();
// you function in here.
}
}
我有一个问题,只有在完成一些自定义操作(在表单上启用否则被禁用的输入字段)后,才需要默认操作。我将默认操作(submit())包装到了自己的递归函数(dosubmit())中。
var prevdef=true;
var dosubmit=function(){
if(prevdef==true){
//here we can do something else first//
prevdef=false;
dosubmit();
}
else{
$(this).submit();//which was the default action
}
};
$('input#somebutton').click(function(){dosubmit()});
if (predef == true)
更加明确,但是您无缘无故地在JS代码中添加了7个字符。if (prevdef)
可读性强。另外,您在.click(dosubmit)
执行与.click(function(){dosubmit()})
未传递任何参数相同的操作时添加了一个冗余的匿名事件处理程序。
您可以设置为2个班级。将JS脚本设置为其中之一后,当您想要禁用脚本时,只需从此表单中删除具有绑定脚本的类。
HTML:
<form class="form-create-container form-create"> </form>
JS
$(document).on('submit', '.form-create', function(){
..... ..... .....
$('.form-create-container').removeClass('form-create').submit();
});
我不确定您的意思是什么:但这是解决类似(可能相同)问题的解决方案...
我经常使用preventDefault()来拦截项目。但是:这不是唯一的拦截方法...通常,您可能只需要一个“问题”,其后行为将像以前一样继续或停止。在最近的情况下,我使用以下解决方案:
$("#content").on('click', '#replace', (function(event){
return confirm('Are you sure you want to do that?')
}));
基本上,“防止默认设置”是指拦截并执行其他操作:“确认”旨在用于...很好-确认!