【问题标题】:Why does redirect happen before my jquery click event is fired for a html anchor element?为什么在为 html 锚元素触发我的 jquery click 事件之前会发生重定向?
【发布时间】:2012-03-27 12:09:30
【问题描述】:

我试图仅在用户关闭选项卡或浏览器窗口时触发 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 控件创建的。当我点击链接时,我被重定向到 otherPage 而没有触发点击事件。所以我无法设置标志并显示内置的 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>

一切正常。但这不是我想要解决的方法。

谁能解释一下我在这里犯了什么错误?

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

我找到了这个帖子Preventing Links before jQuery is Loaded 但我不知道这是否与我的问题有关,因为我只有一个链接。

提前感谢您的帮助。

【问题讨论】:

    标签: jquery html onbeforeunload event-bubbling event-propagation


    【解决方案1】:

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

    例如:

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

    从 jquery 1.7 版开始使用:

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

    jQuerylive()

    查看在线示例here

    【讨论】:

    • 这对我不起作用,因为点击事件永远不会被触发。还是我错过了您的回答? live方法有什么作用?它与 $("a").click(function () { ... }); 有什么不同吗? ?
    • "为现在和将来匹配当前选择器的所有元素附加一个事件处理程序。"您应该在加载 jquery 后由其他 js 创建您的 html 元素时使用 live。在您的情况下,我不确定您的自定义 Web 控件是否通过 js 创建元素?您提到您的事件从未被触发,这意味着您的事件未附加到 DOM 元素。
    • @ThdK - 如果你不理解代码,不要说它不起作用。现在,即使 an 元素将被删除/添加到页面,“实时”绑定也将起作用,因此它实际上可能会解决您的问题。
    • 好吧,抱歉,如果你早早放弃了。我会试试这个。但这是我刚刚在 jquery 文档中找到的内容:“从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。旧版本 jQuery 的用户应优先使用 .delegate()到 .live()。”
    • 哦,我现在觉得这太愚蠢了,我以为这行不通!因为它有效!但我必须看看这种方法已被弃用的事实。非常感谢!
    【解决方案2】:

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

    $('a[href]').click(function (event) {
        buttonOutsidePageClicked = false;
    });
    

    你的答案可能在于:

    这些 html 是由自定义 Web 控件创建的

    他们要么劫持 click 事件,以便不调用 jQuery 点击处理程序,要么在内部 &lt;span&gt; 元素上使用 click 事件。

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

    【讨论】:

    • 哦,是的,你是对的。这是尝试其他代码以查看其响应是否不同的遗留问题。我在我的问题中更新了它。如何在 firebug 中查看所有事件监听器?
    • 当我选择我的链接并打开 dom 面板时看到:click click() 我不知道这是不是什么意思。
    猜你喜欢
    • 2012-05-26
    • 2015-11-02
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多