Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.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
为什么重定向发生在为html锚元素触发jquery单击事件之前?_Jquery_Html_Onbeforeunload_Event Bubbling_Event Propagation - Fatal编程技术网

为什么重定向发生在为html锚元素触发jquery单击事件之前?

为什么重定向发生在为html锚元素触发jquery单击事件之前?,jquery,html,onbeforeunload,event-bubbling,event-propagation,Jquery,Html,Onbeforeunload,Event Bubbling,Event Propagation,仅当用户关闭选项卡或浏览器窗口时,我才尝试触发OnBeforePageUnload。当用户在我的网站上导航时,我有一个自定义机制,它将触发一个警告对话框,以防止用户丢失输入的数据。因此,每次单击我页面上的链接时,我都会设置a标志: $('a[href]').click(function (event) { buttonOutsidePageClicked = false; }); 然后,触发onbeforepageunload事件。我检查标志的值,查看是否应显示内置的onbeforeu

仅当用户关闭选项卡或浏览器窗口时,我才尝试触发OnBeforePageUnload。当用户在我的网站上导航时,我有一个自定义机制,它将触发一个警告对话框,以防止用户丢失输入的数据。因此,每次单击我页面上的链接时,我都会设置a标志:

$('a[href]').click(function (event) {
    buttonOutsidePageClicked = false;
});
然后,触发onbeforepageunload事件。我检查标志的值,查看是否应显示内置的onbeforeunload对话框:

function OnBeforeUnload(oEvent) {
if (buttonOutsidePageClicked)
    return navAwayMessage;   
}
这适用于页面上的所有我的链接,但以下链接除外:

 <a id="cpm_UploadLink" class="button" rel="no" href="/pages/otherPage">
    <span class="btnLeft"></span>
    <span class="btnMiddle">Click Me</span>
    <span class="btnRight"></span>
 </a>

这些html由自定义web控件创建。当我点击链接时,我会被重定向到其他页面,而不会触发点击事件。因此,我无法设置该标志,并显示内置的onbeforeunload消息

当我添加内联时,直接在控件中添加onclick属性,如下所示:

 <a id="cpm_UploadLink" class="button" rel="no" href="/pages/otherPage"
     onclick="javascript:buttonOutsidePageClicked = false;">
        <span class="btnLeft"></span>
        <span class="btnMiddle">Click Me</span>
        <span class="btnRight"></span>
 </a>

一切正常。但这不是我想要解决这个问题的方式

有人能解释一下我犯了什么错误吗

我一直在寻找和尝试很多代码,但没有成功

我找到了这个帖子 但我不知道这是否与我的问题有关,因为我只有一个链接


提前感谢您的帮助。

首先:您可以将代码重构为:

$('a[href]').click(function (event) {
    buttonOutsidePageClicked = false;
});
你的答案可能在于:

这些html由自定义web控件创建

它们要么劫持click事件,使jQuery click处理程序不被调用,要么在内部
元素上使用click事件


您可以使用firebug或chrome开发工具查看所有事件侦听器。确保其中一个是jQuery。

首先:您可以将代码重构为:

$('a[href]').click(function (event) {
    buttonOutsidePageClicked = false;
});
你的答案可能在于:

这些html由自定义web控件创建

它们要么劫持click事件,使jQuery click处理程序不被调用,要么在内部
元素上使用click事件


您可以使用firebug或chrome开发工具查看所有事件侦听器。请确保其中一个是jQuery。

因为您的html是由自定义web控件创建的,您可能需要使用jQuery 1.7及更高版本的
live()
on()
来绑定您的单击事件

例如:

$("body").delegate("a","click", function () {
        buttonOutsidePageClicked = false;
    });
在jquery 1.7版中,使用以下命令:

$("body").on("click", "a", function () {
    buttonOutsidePageClicked = false;
});
JQuery


查看联机示例

由于您的html是由自定义web控件创建的,您可能需要对JQuery 1.7及更高版本使用
live()
on()
来绑定您的单击事件

例如:

$("body").delegate("a","click", function () {
        buttonOutsidePageClicked = false;
    });
在jquery 1.7版中,使用以下命令:

$("body").on("click", "a", function () {
    buttonOutsidePageClicked = false;
});
JQuery


查看在线示例

哦,是的,你是对的。这是尝试其他代码以查看其响应是否不同的遗留问题。我在问题中更新了它。如何在firebug中查看所有事件侦听器?当我选择我的链接并打开dom面板时,我不知道这是否意味着什么。哦,是的,你是对的。这是尝试其他代码以查看其响应是否不同的遗留问题。我在问题中更新了它。如何在firebug中查看所有事件侦听器?当我选择我的链接并打开dom面板时,我不知道这是否意味着什么。这对我不起作用,因为单击事件从未被触发。还是我在你的回答中遗漏了什么?live方法的作用是什么?它与$(“a”)不同。单击(函数(){…})?“现在和将来为所有匹配当前选择器的元素附加一个事件处理程序。”当其他js加载jquery后创建html元素时,应该使用live。在您的情况下,我不确定您的自定义web控件是否通过js创建元素?您提到您的事件从未被触发,这意味着您的事件未附加到DOM元素。@ThdK-如果您不理解代码,请不要说它不起作用。现在,即使将删除/添加到页面中的an元素,“活动”绑定也会起作用,因此它实际上可能会解决您的问题。我试试这个。但这就是我在jquery文档中发现的:“从jquery 1.7开始,.live()方法已被弃用。使用.on()来附加事件处理程序。jquery旧版本的用户应该使用.delegate()而不是.live()。”噢,我现在觉得自己太笨了,我以为这行不通!因为它有效!但是我必须看一看这个方法被弃用的事实。谢谢!这对我不起作用,因为从未触发单击事件。还是我在你的回答中遗漏了什么?live方法的作用是什么?它与$(“a”)不同。单击(函数(){…})?“现在和将来为所有匹配当前选择器的元素附加一个事件处理程序。”当其他js加载jquery后创建html元素时,应该使用live。在您的情况下,我不确定您的自定义web控件是否通过js创建元素?您提到您的事件从未被触发,这意味着您的事件未附加到DOM元素。@ThdK-如果您不理解代码,请不要说它不起作用。现在,即使将删除/添加到页面中的an元素,“活动”绑定也会起作用,因此它实际上可能会解决您的问题。我试试这个。但这就是我在jquery文档中发现的:“从jquery 1.7开始,.live()方法已被弃用。使用.on()来附加事件处理程序。jquery旧版本的用户应该使用.delegate()而不是.live()。”噢,我现在觉得自己太笨了,我以为这行不通!因为它有效!但是我必须看一看这个方法被弃用的事实。谢谢!