阻止父脚本启动

Prevent parent script from firing

本文关键字:启动 脚本      更新时间:2023-09-26

我有一个DotNetNuke网站。烘焙到DNN代码中的是以下脚本

<script type="text/javascript">
//<![CDATA[
function WebForm_OnSubmit() {
    dnn.controls.submitComp.onsubmit();
    return true;
}
//]]>
</script>

问题是,我在我的网站上的一个执行搜索的页面上放了一个表格,然后我连接了一个jquery监听器,它说如果按下回车键,就会触发我的按钮点击事件。问题是,上面的父脚本还触发了WebForm_OnSubmit()函数,而无论OnSubmit(()函数''return true做了什么,都会导致我的页面刷新。

那么,如果我能做些什么来"覆盖"或"防止"WebForm_OnSubmit()函数也触发呢?


编辑1:回答"你的听众设置如何"的问题:

我有一个叫做canISearch:的函数

function canISearch() {
    if (event.keyCode == 13) {
        event.stopPropagation();
        $("#btnSearch").click();
    }
}

我使用onkeydown属性启动这个函数:

<input type="text" id="txtblah" onkeydown="canISearch()" />

如果WebForm_OnSubmit在全局空间中,则可以覆盖它并为您的案例创建异常。在定义了原始函数后的某个时间,重新定义它。也许是这样的:

(注:已更新以包含Samy以下回答中的信息)

(function () {
    var originalFn = dnn.controls.submitComp.onsubmit;
    dnn.controls.submitComp.onsubmit = function() {
        if ([your element is in focus]) {
            ... do your thing ...
        } else {
            originalFn();
        }
    };
})()

当您的函数出现在页面上时,您可以对dnn代码进行猴子补丁,以便该方法不执行任何操作:

dnn.controls.submitComp.onsubmit = function() {/*doing nothing, ladida*/};

这可能有点苛刻,因为你的修改会对其他行为产生影响。相反,您可以添加一个方法,在相应地路由代码之前检查控件是否具有焦点。这很可能是最简单的破解方法。

正如布伦南所建议的那样,你也可以阻止事件的爆发;这实际上取决于事件是如何连接的。如果我没记错的话,DNN可以以多种方式侵入你的活动,这可能不容易做到。

或者,您可以创建自己的皮肤,以控制推送到页面上的所有组件,并防止从包装表单自动提交。

如何设置侦听器?您应该能够停止事件的传播,以防止它在事件层次结构中向上移动:

$(".element").keyup(function(e){
    e.stopPropagation();
});