JS:更改 iframe 链接标签内

Posted

技术标签:

【中文标题】JS:更改 iframe 链接标签内【英文标题】:JS: change inside iframe link tags 【发布时间】:2012-03-02 13:14:08 【问题描述】:

我正在尝试从 iframe 外部更改 iframe 内所有 a 标记的 href 属性。

这是我目前所拥有的:

<html>
<Head>
    <Title>change links</Title>
</Head>
<body>
    <iframe style="width:100%;height: 100%;border:0;" id="tab" src="http://www.anyside.co.il" ></iframe>
    <script type="text/javascript">
        var frame = document.getElementById("tab");   
        var tags = frame.getElementsByTagName("a");   
        for (var i = 0; i < tags.length; i++)    
            tags[i].href = 'javascript:alert("")';  
         
</script>
</body>
</Html>

这段代码有什么问题导致它不起作用?

【问题讨论】:

frame.document.getElementsByTagName("a") 【参考方案1】:

首先必须是同一个域

其次应该是:

        var frame = window.frames["tab"].document;
    var tags = frame.getElementsByTagName("a");   
    for (var i = 0; i < tags.length; i++)    
        tags[i].href = 'javascript:alert("")';  
     

或:

var frame = document.getElementById("tab").contentDocument;   
    var tags = frame.getElementsByTagName("a");   
    for (var i = 0; i < tags.length; i++)    
        tags[i].href = 'javascript:alert("")';  
    

(在你的代码中你只有 iframe 标签,但你需要这个标签的框架的文档)

第三,您应该在加载 iframe 时执行代码(请参阅 iframe 的 onload 事件),或者使用 setTimeout 的超时时间足以满足任何连接速度。

编辑:

在 cmets 中,似乎更多的是在不同的域中,如果是这种情况,您不能使用 javascript 或框架来访问或修改跨域的内容。

如果是静态页面,请自行托管,如果是动态的并且可以获取页面的代理副本,则可以使用多种方式:

    在同一台服务器上使用服务器端语言(如 php)来获取和显示页面,然后在 iframe 中使用同一台服务器上的该页面(然后您将能够访问它) yql 也可能是一种使用 javascript 获取网页的方法

嗯,很难说不知道你想做什么,也许网站的所有者可以做一些事情,或者例如,如果你只是想在网站上为你的用户添加提示,让他们安装一个用户脚本,这将在网站上执行可能是更好的方法,但不知道为什么需要这样做以及情况如何,很难说。

【讨论】:

这意味着我不能使用这个代码,否则它在同一个域上? 搜索 same domain policy 了解更多信息,我已经更新了关于跨域的更多答案【参考方案2】:

由于安全限制,您的 JS 代码无法从 iframe 访问 DOM 元素(iframe 元素位于不同的域中)。

【讨论】:

以上是关于JS:更改 iframe 链接标签内的主要内容,如果未能解决你的问题,请参考以下文章

使用数据属性更改 iframe 内元素的 CSS

检测 iframe 内 SPA(单页应用程序)的 URL 更改

通过单击链接更改 iframe src

在 iframe 中更改网站的链接 [关闭]

用一个链接更改两个iframe

JavaScript 使用一个链接更改两个iFrame