Fab*_*tté 14 javascript iframe jquery same-origin-policy
有没有标准的方法来知道我的脚本是否可以访问iframe文档?
我在网上找不到任何东西所以我想出了这个:
function checkifr() {
function errHandler() {
alert('Error. Try again later.');
}
var ifr = $('#ifr')[0]; //the iframe DOM element
try {
var d = ifr.contentWindow || ifr.contentDocument;
if (!d) {
errHandler();
return false;
}
var b = $('#ifr').contents().find('body');
//... manipulate iframe content
} catch(e) {
errHandler();
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,当我尝试访问iframe内容并最终在catch块中时,Firefox会抛出错误.Chrome Unsafe JavaScript attempt to access frame在控制台中显示警告但从未进入catch阻止状态,它似乎会返回null这些尝试,因此初始if (!d)处理它.Opera和IE的行为类似于FF.编辑:使用上面的代码,现在Chrome返回一个"空"Window对象(没有属性),它不会触发我的if块.检查Esailija的答案,它可以很好地跨浏览器!
这是小提琴.
我不能测试iframe的src反对window.location.
正当性背景:这是因为该功能是我正在开发(使用一个小的图像上载的插件的一部分
iframe作为靶标,因为IE <9不支持XHR2),目标主要是验证连接错误/超时/等.这些错误的默认浏览器页面受同一起源警察的影响,因此这个问题的目的.我不想发送ajax调用来检查页面是否可用,因为我想验证提交请求本身.jQuery的.load处理程序不会触发错误,jQuery的.error和onerrorHTML属性不适用于此.此处提供了工作脚本的说明,但您可以完全忽略它并简单地回答下面的问题.
请注意,上面的块仅用于说明为什么我不能使用iframe.src.
我确实认为应该有一种更简单/标准的方法来检查iframe"可访问性",但我在网络上找不到任何东西,除了半解决方案,只是检查iframe.src并且不适用于许多情况.如果我的hackish try/ catchblock被认为是技术上"干净"的解决方案,那么如果找不到更好的选择,其他人可能会重新使用它.
那么,有没有标准或简单的方式或jQuery插件来检查我的脚本可以访问一个iframe"没有比较小号文件iframeS" src与window.location?如果可能,在控制台中没有try/ catchblocks和错误/警告.
Esa*_*ija 12
这是另一种选择,如果没有尝试捕获就无法真正做到.
测试http://jsfiddle.net/LHjwZ/11/
function checkIframe( ifr ) {
var key = ( +new Date ) + "" + Math.random();
try {
var global = ifr.contentWindow;
global[key] = "asd";
return global[key] === "asd";
}
catch( e ) {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5760 次 |
| 最近记录: |