【问题标题】:Determine on onclick whether the clicked link is meant to open a new window or tab在 onclick 上确定单击的链接是否要打开新窗口或选项卡
【发布时间】:2012-01-10 17:44:52
【问题描述】:

大多数现代浏览器都支持使用ctrl+clickcommand+click 或类似命令在新选项卡或新窗口中打开链接。

在应用程序中,我希望链接在单击时被禁用。但仅当目标是同一个窗口时(例如,如果它在新选项卡中打开,我不希望链接被禁用,因为再次单击它是合理的)。

我做了一些尝试并调试了在单击时创建的事件对象 - 但我找不到有关目标是新选项卡还是新窗口的任何信息。

已知的解决方法:当然可以在单击特定链接时检查是否按下了某个键,这很容易 - 但由于这些命令因浏览器和操作系统而异,因此必须定义一个复杂的映射以及现在谁知道用户配置了什么等等。

有没有可靠的方法来确定该位置是否应该在新标签页或窗口中打开?

【问题讨论】:

    标签: javascript hyperlink tabs click target


    【解决方案1】:

    这里有一个工作示例:http://jsfiddle.net/pioul/eCuNU/4/

    此脚本仅当链接将在新选项卡/窗口中打开时才允许单击链接,基于target="_blank" 属性。

    HTML:

    <a href="http://google.fr" target="_blank">new window</a>
    <a href="http://google.fr" target="_self">same window 1</a>
    <a href="http://google.fr" target="">same window 2</a>
    

    jQuery:

    $("a").bind("click", function(e){
        if($(this).attr("target") != "_blank"){
            e.preventDefault();
        }
    });
    

    编辑:

    您可以像这样考虑 ctrl+click:

    $("a").bind("click", function(e){
        if($(this).attr("target") != "_blank"){
            if(!e.ctrlKey){
                e.preventDefault();
            }
        }
    });
    

    【讨论】:

    • 好吧,这只适用于固定目标属性。如果用户通过按住 ctrl (或类似的)“覆盖”它,则该属性当然不会改变,因此确定失败。
    • 我编辑了我的答案以匹配你谈到的情况,我想除了考虑用户可以在新窗口中打开链接并尝试在其中检测到它之外没有其他解决方案你的代码。
    【解决方案2】:

    有时浏览器设置会设置在新选项卡或同一窗口中打开链接。

    您可以检查链接对象的目标属性。

    <a href="http://your_link_to_page" target="_blank" >This open in new window</a>
    

    在页面加载时使用 javascript 操作锚标记并检查目标属性。如果目标值设置为 _blank,则启用它们,或者您可以在用户单击链接时执行此检查。

    您可以使用一种机制来查找单击链接时是否按下了 CTRL。有一些资源,如this。你可以建立一个系统。

    注意:如果您使用 JQuery,请使用不同的类对必须检查的链接进行分类。并在就绪状态或点击链接时禁用它们。

    【讨论】:

    • 很遗憾,如果用户通过按住 ctrl 强制打开新标签页,这仍然不适用,是吗?
    • 您必须首先检测鼠标按下事件发生时按下了哪些键。此检查必须在全局范围内(即在页面范围内)进行。根据按键设置一个 jS 变量。然后在点击事件中进行其余的检查。
    【解决方案3】:

    您无法阻止浏览器在新标签页或窗口中打开链接。可能有(无法检测到的)配置设置会强制执行此操作,或者考虑一下鼠标手势:右击和向下移动将在 Opera 中打开一个新选项卡,我想这是无法检测到的。

    此外,强制浏览器在新窗口中打开标签页(target="_blank" 甚至 window.open)被认为是不好的风格。你应该让用户选择他想做的事情。如果你真的想这样做,你也可以考虑window.onunload,它应该在大多数时候都可以工作。

    【讨论】:

    • 嗯,这根本不是为了阻止或强迫任何事情——它是关于检测链接是否会在新窗口中打开——仅此而已。
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 2010-12-01
    • 2013-03-11
    • 2010-09-12
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多