10

我有一个这样的脚本

function resizeCrossDomainIframe(id, other_domain) {
    var iframe = document.getElementById(id);
    window.addEventListener('message', function (event) {
        if (event.origin !== other_domain) return; // only accept messages from the specified domain
        if (event.data === "reload") top.location.reload(); // If child page sends reload request - reload it without any questions asked 
        if (isNaN(event.data)) { //If this isn't integer than it is alert
            alert(event.data); // Show alert if not integer
        } else {
            var height = parseInt(event.data) + 5; // add some extra height to avoid scrollbar
            iframe.height = height + "px";
            alert(event.data);
        }
    }, false);
}

它所做的是动态调整 iframe 的大小。现在在第一个 iframe 页面上,我只收到一个警报,但在 iframe 页面中,我有链接,当我转到第二页时,我看到 2 个警报,当我转到第三页时 - 我收到 3 个警报,第 4 个链接触发 4 个警报等...

在每个 iframed 页面中,我都调用 parent 来调整大小,例如:

<body class="settingspage" onload="parent.postMessage(document.body.scrollHeight, '<?php echo $_SESSION['SESS_ACCESSING_FROM']; ?>');">

我试图清除“事件”数组,但我仍然得到警报,但这次它们是空的,但警报的数量等于 iframe 内的链接点击次数?

为什么是这样 ?

4

2 回答 2

1

问题是,每次单击 iframe 中的链接时,都会触发 load 事件。

因此,每次单击链接时都绑定消息事件。第一次一切都正确,因为你绑定了一次,第二次你收到两个警报,因为你绑定了两次,依此类推......

所以解决方案是删除 iframe 卸载时的“消息”事件。

因此,您必须稍微清理一下代码:

var listener = function (event) {

    if (event.data === "reload") top.location.reload(); // If child page sends reload request - reload it without any questions asked 
    if (isNaN(event.data)) { //If this isn't integer than it is alert
        alert(event.data); // Show alert if not integer
    } else {
        var height = parseInt(event.data) + 5; // add some extra height to avoid scrollbar
        iframe.height = height + "px";
        alert(event.data);
    }
};

然后你有你调用 onLoad 和 onUnload 的函数。

function iframeOnLoad(id) {
    var iframe = document.getElementById(id);
    window.addEventListener('message', listener, false); 
}

function iframeOnUnload(id) {
    var iframe = document.getElementById(id);
    window.removeEventListener('message', listener, false); 
}
于 2013-02-13T08:18:57.940 回答
0

我通过将功能移动到“加载时的主页主体”并将其从 iframe 中删除来解决了这个问题......

于 2013-02-15T15:37:37.837 回答