使用jQuery跨域访问:在ie浏览器中访问子域框架失败



如果带有子域源的iframe标签在加载时已经在文档中,它可以被IE9访问,但如果相同的iframe插入到文档中,IE9无法访问它(所有其他浏览器都可以)。请参阅下面的代码片段。

这是正常的IE9行为还是可以以某种方式修复?这次谷歌没有帮上忙,所以我非常感谢你的帮助。

这适用于Internet Explorer 9和所有其他浏览器

example.com的主文档:

<div class="container">
    <iframe src="sub.example.com/index.html"></iframe>
</div>
<script>
    document.domain = 'example.com';
    var frame = $('iframe', 'container')
        , el = frame.contents().find('div.hello'); // usually returns 1 element
    if (el.length > 0)
        el.html('Hello'); // sets div content in iframe
    else // sometimes it gets here, if script runs before iframe loads
        frame.on('load', function(){
            el = frame.contents().find('div.hello'); // works if the 1st one fails
            el.html('Hello');
        });
</script>

子域文档(sub.example.com/index.html):

<script>document.domain = 'example.com'</script>
<div class="hello"></div>

此操作适用于所有浏览器,但不适用于IE9(错误:Access is denied)

example.com的主文档:

<div class="container"></div>
<script>
    $('div.container').html('<iframe src="sub.example.com/index.html"></iframe>');
    document.domain = 'example.com';
    var frame = $('iframe', 'container')
        , el = frame.contents().find('div.hello'); // throws error
    // ...
</script>

子域中的文档相同。

在实际代码中,.container的内容是由模板函数生成的,因此使用.html()将其作为简单文本插入,例如:

发生错误是因为在第二种情况下,脚本设置框架的文档。域在帧的加载事件触发后执行。将代码放入frame.ready()中并没有帮助——在脚本执行之前,frame就已经准备好了。在所有浏览器中都是这样,但只有在IE中由于某种原因才会导致错误。

所以目前的解决方案是一个hack真的- 100ms超时后,帧准备好,使脚本内的帧执行之前,帧被访问

相关内容

  • 没有找到相关文章

最新更新