iframe加载回调被多次调用

ban*_*ana 5 javascript iframe jquery

我有一个简单的网页和以下脚本。

<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>
Run Code Online (Sandbox Code Playgroud)

我有一个按钮,并且调用了这个函数 sendTraffic 。我看到的是测试完成警报第一次出现一次,第二次出现两次,第三次出现三次,并且它一直持续下去。

<button type="button" id="btnSendPing" class="btn btn-primary btn-lg" onclick="sendTraffic('sendping')">Send Ping Traffic</button>
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚我做错了什么。我正在使用 twitter bootstrap 仅供参考。

编辑:我在 Mac 上使用 chrome。#WAFTest 是一个 Iframe。我只是想从服务器获取数据并将其加载到 Iframe。

ran*_*per 0

每次调用时,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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!