Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用event.preventDefault()后,是否有[通用]方法调用默认操作?_Javascript_Jquery - Fatal编程技术网

Javascript 调用event.preventDefault()后,是否有[通用]方法调用默认操作?

Javascript 调用event.preventDefault()后,是否有[通用]方法调用默认操作?,javascript,jquery,Javascript,Jquery,这个问题是为了开发jQuery插件和其他自包含的JavaScript代码段,这些代码段不需要修改其他脚本文件以实现兼容性 我们都知道event.preventDefault()将阻止默认事件,因此我们可以运行自定义函数。但是,如果我们只想在调用默认事件之前延迟它呢?我见过各种各样的、针对具体情况的忍者技巧和变通方法来重新调用默认操作,但正如我所说的,我的兴趣是以一种通用的方式重新触发默认操作,而不是逐个处理默认触发 $(submitButton).click(function (e) {

这个问题是为了开发jQuery插件和其他自包含的JavaScript代码段,这些代码段不需要修改其他脚本文件以实现兼容性

我们都知道event.preventDefault()将阻止默认事件,因此我们可以运行自定义函数。但是,如果我们只想在调用默认事件之前延迟它呢?我见过各种各样的、针对具体情况的忍者技巧和变通方法来重新调用默认操作,但正如我所说的,我的兴趣是以一种通用的方式重新触发默认操作,而不是逐个处理默认触发

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    e.invokeDefault(); // Imaginary... :(
});
即使是像表单提交这样简单的事情,似乎也没有普遍的答案。
$(选择器).closest(“form”).submit()
解决方案假定默认操作是标准表单提交,而不是ASP.NET中的
\u doPostBack()
函数。在调用ASP.NET回调结束之前,这是我最接近的一个通用、设置它、忘记它的解决方案:

$(submitButton).click(function (e) {

    e.preventDefault();

    // Do custom code here.

    var javascriptCommand = e.currentTarget.attributes.href.nodeValue;
    evalLinkJs(javascriptCommand);
});


function evalLinkJs(link) {
    // Eat it, Crockford. :)
    eval(link.replace(/^javascript:/g, ""));
}
我想我可以开始写一些特殊的案例来处理带有
窗口的普通链接。location
重定向,但随后我们打开了一个全新的蠕虫罐头——为默认事件调用积累越来越多的案例会产生比解决方案更多的问题


那怎么样?我一直在寻找的魔弹是谁的?

看看这个:

你可以试试

if(!event.mySecretVariableName) {
   event.preventDefault();
} else {
   return; // do nothing, let the event go
}

// your handling code goes here
event.originalEvent.mySecretVariableName = "i handled it";

if (document.createEvent) {
   this.dispatchEvent(event.originalEvent);
} else {
    this.fireEvent(event.originalEvent.eventType, event.originalEvent);
}
使用以下答案:和jQuery事件引用:


标记您收到的事件对象,这样如果您再次收到它,就不会循环。

这不可能像JamWaffles已经证明的那样。这是不可能的简单解释:如果你重新触发默认动作,你的事件监听器会再次拦截,你会有一个无限循环

还有这个

click(function (e) {
    e.preventDefault();
    // Do custom code here.
    e.invokeDefault(); // Imaginary... :(
});
这和你想象的函数是一样的


似乎您想要操纵单击元素的url。如果你这样做的话,效果很好

首先不要调用
preventDefault()
。然后,默认操作将在事件处理程序之后发生。

这应该会起作用。不过我只在firefox上测试过

<html>
<head>
<script>
    window.addEventListener("click",handleClick,false);
    function handleClick(e){
        if (e.useDefault != true){
            alert("we're preventing");
            e.preventDefault();
            alert(e.screenX);
            //Firing the regular action
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent(e.type,e.bubbles,e.cancelable);
            evt["useDefault"] = true;
            //Add other "e" attributes like screenX, pageX, etc...
            this.dispatchEvent(evt);
        }
        else{
            alert("we're not preventing");
        }
    }
</script>
</head>
<body>

</body>
</html>

window.addEventListener(“单击”,handleClick,false);
函数handleClick(e){
如果(例如,使用默认值!=true){
警惕(“我们正在阻止”);
e、 预防默认值();
警报(e.screenX);
//发动常规行动
var evt=document.createEvent(“HTMLEvents”);
evt.initEvent(e.type,e.bubbles,e.cancelable);
evt[“useDefault”]=true;
//添加其他“e”属性,如screenX、pageX等。。。
本次调度事件(evt);
}
否则{
警惕(“我们没有阻止”);
}
}

当然,您还必须复制所有旧的事件变量属性。我只是没有编写那部分代码,但应该很简单。

我需要在单击后禁用一个按钮,然后触发默认事件,这是我的解决方案

$(document).on('click', '.disabled-after-submit', function(event) {
    event.preventDefault();
    $(event.currentTarget).addClass('disabled');
    $(event.currentTarget).removeClass('disabled-after-submit');
    $(event.currentTarget).click();
    $(event.currentTarget).prop('disabled', true);
});

我真的不明白你想做什么。。。事件处理程序代码不是在默认操作发生之前运行的吗(例如,
submit
事件处理程序的代码将在表单实际提交之前运行……这不是您试图实现的吗?)自定义代码是异步的吗?这也许可以解释为什么你觉得你需要这样一种方法,但即使有这种想象的方法也不能解决你的问题。你肯定需要更清楚地知道你想要什么。如果要在处理程序中运行代码,该代码将在“默认”行为之前运行。
preventDefault
阻止默认操作。如果希望发生默认操作,请不要阻止它。似乎很明显。也许@Jake的意思更像这样,只要在自定义处理后不需要异步执行默认处理,这就是正确的答案。在我的
copy
处理程序中没有true,我需要返回
true
才能复制文本。不做任何事情或返回错误的值也不起作用。但这不是OP的问题。这是正确的方法。您应该尝试创建正确类型的事件-请参阅
$(document).on('click', '.disabled-after-submit', function(event) {
    event.preventDefault();
    $(event.currentTarget).addClass('disabled');
    $(event.currentTarget).removeClass('disabled-after-submit');
    $(event.currentTarget).click();
    $(event.currentTarget).prop('disabled', true);
});