很遗憾,您将无法访问 iframe 的任何有用属性,除非它与您的代码位于同一主机/域中。这是所有当前/有价值的浏览器都实现的安全功能 - 称为同源或跨域策略。
在第三方 iframe 中检测更改的唯一选项是第三方代码是否支持向周围框架发送消息。有几种方法可以做到这一点,但他们需要支持它。如果他们不这样做,那么您无能为力。如果是我,我会检查以下内容:
- 阅读第三方文档,看看他们是否支持触发任何js消息或事件
- 看看第三方系统是否提供了除 iframe 之外的其他方式来实现相同的功能。
脚本标签?
关于您可以添加的消息,您是否测试过是否可以向该消息添加任何 HTML 标记?这不太可能,但如果是这样,您可以添加自己的脚本标签以与您的框架进行通信,以触发您自己的功能(即`window.iframeSuccess`)并告诉您事件已经发生......
以下代码仅在双方都属于同一域(外框和 iframe) 时才有效。否则会被同源策略屏蔽。
<script>
if( window && window.parent && window.parent.iframeSuccess ){
window.parent.iframeSuccess();
}
</script>
相反,您可以实现以下为框架之间的通信而专门设计的。这是一个更现代的解决方案,因此不适用于旧版浏览器 - 要查看支持它的内容,您可以在此处阅读:
What browsers support the window.postMessage call now?
window.postMessage的使用示例——首先是外框内的代码:
function messageListener(event){
/// make sure we only get messages from where we expect
if ( event.origin != "http://the-domain-we-expect-from.com" ){ return; }
/// here you can do what you want depending on the message you get
alert(event.data);
}
/// define for nearly every modern browser
if (window.addEventListener){
addEventListener("message", messageListener, false);
} else {
/// fallback for internet explorer
attachEvent("onmessage", messageListener);
}
然后将代码放在iframe中:
if( window && window.parent && window.parent.postMessage ){
window.parent.postMessage('success',
'http://the-domain-we-are-sending-to.com');
}
有关更多信息,您可以在此处阅读:
https://developer.mozilla.org/en-US/docs/DOM/window.postMessage
图片标签?
如果他们阻止脚本标签,他们可能会允许图像标签。如果是这种情况,您有一个稍微棘手的选项可用,即嵌入一个图像报告回服务器端脚本,然后该脚本可以在数据库中标记事件...
<img src="http://mysite.com/image-that-is-actually-a-script.php?id=user-id" />
但是,要让您的 javascript 注意到此事件,您将需要某种轮询系统,该系统会不断地从您的 js 中检查您的服务器端数据库(通过 ajax 或 websockets) - 您将需要能够在双方(您的和第三方)上唯一地识别具有某种 id 的用户。所以这种方法只有在第三方系统允许你在显示给用户的消息中插入用户ID(或其他一些唯一的用户信息)时才真正可行。如果您别无选择,这几乎是最后的后备方案。