【问题标题】:How to disable chrome from opening up "new window" and "tabs"?如何禁用 chrome 打开“新窗口”和“标签”?
【发布时间】:2013-12-16 08:20:16
【问题描述】:

他们是否可以通过 Chrome 浏览器设置将 Internet 上的所有页面保留在一个窗口中?还是我可以使用的插件/插件?

当我点击某些链接时,我不希望网页在新标签和/或新窗口中打开。

如果有人有任何建议,请告诉我!谢谢!

        <a href="http://www.bing.com" target="_blank">Opens a New Tab!</a>

        <i>Thtats not what i want..., I want this link to stay in same url bar.</i>

        <p>Like this!</p>
        <a class="click" href="http://www.bing.com">Click Here</a>

【问题讨论】:

  • 如果您想在新选项卡中打开新窗口,我会理解的。但是在一个窗口中打开所有页面是什么意思?
  • 我想禁止页面在新窗口和新标签页中打开,并将所有内容保持在同一个窗口中。例如:jsfiddle.net/2nJxa

标签: google-chrome google-chrome-extension window settings browser-support


【解决方案1】:

可能的方法:

一种方法可能是构建一个在每个页面中注入 content script 的扩展程序。此内容脚本将解析 DOM 并 从锚元素中删除所有 target 属性并将锚元素的所有 target 属性设置为 _self

注意事项:

  1. 许多页面上都有动态插入的元素(包括锚元素)。
  2. 某些页面上有动态变化的元素(包括锚元素)。
  3. 并非所有页面/选项卡都通过链接打开(例如,某些页面可以使用 window.open())。

解决办法:

您可以使用 MutationObserver 来监视插入的锚元素或修改其target 属性并进行适当的调整。

如果它对您来说非常重要,您仍然需要注意通过其他方式打开的标签(例如window.open())(但这些情况应该非常少,因此可能不值得麻烦)。

示例代码:

ma​​nifest.json:

{
    "manifest_version": 2,

    "name":    "Test Extension",
    "version": "0.0",

    "content_scripts": [{
        "matches":    ["*://*/*"],
        "js":         ["content.js"],
        "run_at":     "document_start",
        "all_frames": true
    }]
}

content.js:

/* Define helper functions */
var processAnchor = function(a) {
    //if (a.hasAttribute('target')) {
    //    a.removeAttribute('target');
    //}
    a.setAttribute('target', '_self');
};

/* Define the observer for watching over inserted elements */
var insertedObserver = new MutationObserver(function(mutations) {
    mutations.forEach(function(m) {
        var inserted = [].slice.call(m.addedNodes);
        while (inserted.length > 0) {
            var elem = inserted.shift();
            [].slice.call(elem.children || []).forEach(function(el) {
                inserted.push(el);
            });
            if (elem.nodeName === 'A') {
                processAnchor(elem);
            }
        }
    });
});

/* Define the observer for watching over
 * modified attributes of anchor elements */
var modifiedObserver = new MutationObserver(function(mutations) {
    mutations.forEach(function(m) {
        if ((m.type === 'attributes') && (m.target.nodeName === 'A')) {
            processAnchor(m.target);
        }
    });
});

/* Start observing */
insertedObserver.observe(document.documentElement, {
    childList: true,
    subtree: true
});
modifiedObserver.observe(document.documentElement, {
    attributes: true,
    substree: true
});

【讨论】:

  • 感谢您的出色回答。您在谈论使用 javascript 从外部网站中删除 targe=_blank's 吗?由于安全目的,我认为这是不可能的。为了更好地解释我的问题,请查看我之前提出的第一个问题:stackoverflow.com/questions/20601259/…
  • 这是我之前问的第二个问题:stackoverflow.com/questions/20604534/… ,,,,,你可以看到这个问题对我来说真的很麻烦;)
  • 我的第一种方法是使用 iframe 并为我的 Web 应用程序提供底部导航,但由于其他网页中的外部目标 _blanks 我无法控制阻止新窗口/选项卡的打开.并且它是我创建的这个应用程序的必备要求,因为它将用于触摸屏信息亭......所以网页浏览有 2b 限制
  • 您询问是否可以使用扩展程序实现此目的。答案是你可以,我也给了你一些示例代码来实现这一点。 (我稍微修改了代码以确保在其 iframe 中打开链接(如果有)。)我不太了解您的 cmets。请尝试上述建议的解决方案,如果遇到任何问题,请报告。 (至少对我来说,它适用于 iframe 和外部的链接。)
  • 啊哈哈哈。因为(除其他原因外)后台脚本不知道哪个选项卡/iframe 打开了选项卡以重新打开该选项卡/iframe 内的 URL,并且因为用户会看到一个选项卡被打开然后关闭,这是一个糟糕的用户体验.
猜你喜欢
  • 2014-11-05
  • 1970-01-01
  • 2016-12-27
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2017-04-07
  • 2014-12-26
相关资源
最近更新 更多