帧源变化检测
Frame Source change detection
我有以下代码:
<div class="row">
<div>
<iframe id="myFrame" name="myFrame" class="btn-block" ng-src="{{myframeSrc | trusted}}" onLoad="contentChanged()" scrolling="no"></iframe>
</div>
<script type="text/javascript">
var contentChanged = function() {
alert('frame content has changed');
};
</script>
我知道这应该是工作(它确实),因为警报弹出。然而,我得到一个[Uncaught ReferenceError: contentChanged is not defined]错误。我做错了什么?注意:我正在通过Angular加载src,但需要纯javascript来检测当链接在Angular外部的iFrame中被点击时帧源的变化。
你的代码片段完全正确。唯一的错误是你声明的方式,这是由于JavaScript变量提升。
你的代码应该如下所示:
<script type="text/javascript">
function contentChanged() {
alert('frame content has changed');
};
</script>
<div class="row">
<div>
<iframe id="myFrame" name="myFrame" class="btn-block" src="http://www.w3schools.com" onLoad="contentChanged()" height="400"></iframe>
</div>
不同之处在于你的函数只在到达该行时定义,而上述函数在其周围的函数或脚本执行时定义,由于提升。
参考这个简单的例子- http://www.w3schools.com/js/js_hoisting.asp
尝试用函数声明代替调用匿名函数的var
语句。参见var functionName = function() {} vs function functionName(){},这些声明(在JavaScript中)有什么区别?
<script type="text/javascript">
function contentChanged() {
alert('frame content has changed');
};
</script>
<div class="row">
<div>
<iframe id="myFrame" name="myFrame" class="btn-block" ng-src="{{myframeSrc | trusted}}" onLoad="contentChanged()" scrolling="no"></iframe>
</div>
我的猜测是,由于<iframe>
在<script>
之前,它在<script>
之前加载。
之后,<script>
被加载,angular最终加载并更新<iframe>
的src
属性,这导致<iframe>
重新加载并再次运行onLoad
中的代码。
要证实这个理论,试着这样做:
<div class="row">
<div>
<iframe id="myFrame" name="myFrame" class="btn-block" ng-src="{{myframeSrc | trusted}}" onLoad="console.log('iframe loaded'); contentChanged()" scrolling="no"></iframe>
</div>
<script type="text/javascript">
console.log('script tag is being executed');
var contentChanged = function() {
console.log('contentChanged() is being executed');
alert('frame content has changed');
};
</script>
你可能会在你的控制台中看到这样的输出顺序(你可能在angular或你的其他代码之间有其他行):
iframe加载
[Uncaught ReferenceError: contentChanged is not defined]
脚本标签正在执行
iframe加载
contentChanged()正在执行
window.frames -允许直接访问iframe窗口对象
frames.onload = function() {
alert('frame content has changed')
};
http://codepen.io/nagasai/pen/jrybgN 另一个选项是按文档。getElementsByTagName onloaddocument.getElementsByTagName (iframe的)[0]。Onload = function() {警告('框架内容已更改')
};Codepen: http://codepen.io/nagasai/pen/gMgaJd
- 检测数据的变化
- 如何检测和打印变化变量LESS
- 检测 DIV 的高度何时变化,而无需轮询或突变观察者
- 检测observableArray是否发生变化
- 检测Ionic中特定的应用程序状态变化
- 如何在呈现页面后使用 Java 脚本检测 dom 元素值的值是否有任何变化(例如,任何输入或复选框值更改)
- 使用 jquery 检测变量变化
- 如何动态检测浏览器视口大小的变化
- 角度2的变化检测是否总是从根部开始
- 变化检测中的角度2+GridStack错误
- jquery ui:检测输入中的首次时间变化
- 只有在检测到变化时才会报废
- 如何在JQuery中检测按钮值的变化
- Angular2指令:如何检测DOM变化
- 角度 2 服务中的变化检测
- Firefox中的Angular2变化检测无限循环
- angular2在变化检测后在画布上绘制图像
- angularjs 2 rc4变化检测:检查后表达发生变化
- Angular2:可观察对象内部的变化检测
- 帧源变化检测