Iframe 加载回调被多次调用
Iframe load callback is called multiple times
我有一个简单的网页,我有一个以下脚本。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script>
function sendTraffic(typeOfTraffic){
var ipAddr = document.getElementById("serverIpaddr").value;
//alert(ipAddr);
$("#WAFTest").attr("src", '/cgi-bin/test.py?wat='+typeOfTraffic+'&ipaddr='+ipAddr);
$("#WAFTest").load(function () {
alert("Test done");
});
}
</script>
我有一个按钮,这个函数发送流量被调用。我看到的是测试完成警报第一次出现一次,第二次两次,第三次三次,并且它一直在继续。
<button type="button" id="btnSendPing" class="btn btn-primary btn-lg" onclick="sendTraffic('sendping')">Send Ping Traffic</button>
我无法弄清楚我做错了什么。我正在使用推特引导程序,仅供参考。
编辑:我在Mac上使用chrome.#WAFTest 是Iframe。我只是想从服务器获取数据并将其加载到 Iframe 中。
就像其他人说的那样,您的.load()
事件应该只注册一次。
如果其他答案中发布的解决方案对您不起作用(尽管它应该),还有另一种方法
.one()
:
将处理程序附加到元素的事件。处理程序在每个事件类型的每个元素最多执行一次
function sendTraffic(typeOfTraffic){
var ipAddr = document.getElementById("serverIpaddr").value;
//alert(ipAddr);
$("#WAFTest").attr("src", '/cgi-bin/test.py?wat='+typeOfTraffic+'&ipaddr='+ipAddr);
$("#WAFTest").one('load', function () {
alert("Test done");
});
}
演示
其他答案中张贴的 Althought 解决方案更合适。但是,我会删除onclick
属性并使用jQuery为元素设置单击事件处理程序。
为了避免歧义(因为.load()
也是用于 AJAX 请求的方法),我建议使用 .on()
来绑定load
事件处理程序
<iframe id="WAFTest"></iframe>
<button type="button" data-ping="sendping" class="btnSendPing btn btn-primary btn-lg">Send Ping Traffic</button>
<input id="serverIpaddr" value="something" />
$(document).ready(function(){
$('.btnSendPing').click(function(){
var ipAddr = $("#serverIpaddr").val();
var typeOfTraffic = $(this).data('ping');
$("#WAFTest").attr("src", '/cgi-bin/test.py?wat='+typeOfTraffic+'&ipaddr='+ipAddr);
});
$("#WAFTest").on('load', function () {
alert("Test done");
});
});
演示
每次调用sendTraffic()
绑定事件处理程序的新实例时,这解释了您描述的行为:第一次调用它时,附加一个load
事件处理程序,然后加载iframe
并触发事件。第二次调用该函数时,将事件处理程序的另一个副本绑定到load
事件,以便两个处理程序在下次加载iframe
时执行。
解决方案非常简单:只需将事件绑定放在sendTraffic()
外部:
<script>
function sendTraffic(typeOfTraffic) {
var ipAddr = document.getElementById("serverIpaddr").value;
//alert(ipAddr);
$("#WAFTest").attr("src", '/cgi-bin/test.py?wat='+typeOfTraffic+'&ipaddr='+ipAddr);
}
$("#WAFTest").load(function() {
alert("Test done");
});
</script>
希望这有帮助!
每次调用
$("#WAFTest").load(function () {
alert("Test done");
});
您正在将新的事件侦听器绑定到 iframe 的加载事件。
您必须将调用放在函数之外,因此它只被调用和绑定一次。
编辑:
为了防止代码失败,当调用代码片段时 DOM 还没有准备好时,你必须将其包装在 jQuery 的 ready
函数中。
$(document).ready(function(){
$("#WAFTest").load(function () {
alert("Test done");
});
})
- 使用同步ajax调用加载屏幕
- 调用加载的顺序函数会意外中断代码
- Requirejs:dist 失败,加载器插件没有在构建:文本中调用加载回调
- 使用 ajax 调用加载 php 文件并执行按钮单击事件
- jQuery函数在页面上调用加载和点击
- IMG 未使用 AJAX 调用加载图像
- 如何在 ag-grid 中从 http 调用加载动态列和行(列和记录都应该是动态的)
- 由 ajax 调用加载的页面文本框上的 Jquery 按键事件
- 在 ajax 调用加载的页面上隐藏多个
- 使用 Ajax 调用加载选项卡内容
- 调用/加载 Jquery 页面
- Ajax调用加载当前内容
- 如何在AngularJS Bootstrap模式中从AJAX调用加载JSON数据
- AngularJS-使用REST API调用加载图像
- 在angular js中通过ajax调用加载模板url
- 我正在做一个ajax调用加载内容到模态对话框;它似乎在所有其他浏览器上工作,而不是IE
- 尝试通过(jQuery)ajax调用加载Google图表
- 尝试通过jQuery ajax调用加载Google图表
- 从Javascript调用加载dll时出现java安全错误,但直接从applet调用时没有
- 通过Ajax调用加载元素后,单击事件不工作