如何阻止 iframed 页面中的外部超链接?

How to block external hyperlinks in an iframed page?

我正在制作一个显示 iframe(跨域)中的另一个网站的网站。问题是 iframe 中的站点有外部超链接,我想以某种方式阻止或禁用它们。我只想阻止外部超链接。

也就是说,如果 iframed 页面是 example.com/info:

我该怎么做? Greasemonkey 和某种脚本?或者别的什么?

为此,您必须使用 Javascript 函数比较您的 url href 属性,如下所示

// this function will give host name
function get_hostname(url) {
    var m = url.match(/^http:\/\/[^/]+/);
    return m ? m[0] : null;
}

   var hostName =  get_hostname("http://example.com/path");

这将 return http://example.com/ 与您的示例输出相同。

使用上述功能,您可以比较您的 URL,如果它与您的主机名匹配 - 那么您可以允许重定向页面,否则您可以显示外部链接的消息

用户脚本或浏览器扩展都可以做到这一点。 Greasemonkey 脚本将 运行 显示在页面上,无论它是否在 iframe 中(除非您告诉它不要这样做)。
要阻止外部 link,请将每个 link 的 hostname 与 iframed 页面的 hostname.

进行比较

这是一个完整的 Greasemonkey 脚本,说明了该过程:

// ==UserScript==
// @name     _Block cross-domain links
// @include  http://www.puppylinux.com/*
// @grant    GM_addStyle
// ==/UserScript==

//-- Only run if the page is inside a frame or iframe:
if (window.top !== window.self) {
    var linkList = document.querySelectorAll ("a");

    Array.prototype.forEach.call (linkList, function (link) {
        if (link.hostname !== location.hostname) {
            //-- Block the link
            link.href = "javascript:void(0)";
        }
    } );

    //-- Mark the links, so the user knows what's up.
    GM_addStyle ( "                             \
        a[href='javascript:void(0)'] {          \
            white-space: nowrap;                \
            cursor: default;                    \
        }                                       \
        a[href='javascript:void(0)']::after {   \
            background: orange;                 \
            content: 'X';                       \
            display: inline-block;              \
            margin-left: 0.3ex;                 \
            padding: 0 0.5ex;                   \
        }                                       \
    " );
}


您可以针对 this test page on jsFiddle.

安装和 运行 该脚本

注:

  • 包含的页面是 fiddle.jshell.net/9aQv5/3/show/
  • iframed 页面是 www.puppylinux.com
  • 当您 运行 该脚本时,外部 link 被禁用,被禁用的 link 被标记为 "X"。
  • 此方法适用于简单的静态页面。对于 AJAX 个驱动页面,使用 waitForKeyElements().