为什么这个功能不起作用?

时间:2013-02-21 15:24:32

标签: javascript

我有这段代码:

var frames = document.getElementsByTagName("iFrame");
var auto_resize_timer = window.setInterval("autoresize_frames()", 400);
function autoresize_frames() {
    for (var i = 0; i < frames.length; ++i) {
        if (frames[i].contentWindow.document.body) {
            var frames_size = frames[i].contentWindow.document.body.offsetHeight;
            if (document.all && !window.opera) {
                frames_size = frames[i].contentWindow.document.body.scrollHeight;
            }
            frames[i].style.height = frames_size + 'px';
        }
    }
}

这很好。

然后,我决定把它放在自己的模块中:

function autoResizeFrames() {
    var frames = document.getElementsByTagName("iFrame");
    window.setInterval("autoresize_frames(frames)", 400);
}

function autoresize_frames(frames) {

    for (var i = 0; i < frames.length; ++i) {
        if (frames[i].contentWindow.document.body) {
            var frames_size = frames[i].contentWindow.document.body.offsetHeight;
            if (document.all && !window.opera) {
                frames_size = frames[i].contentWindow.document.body.scrollHeight;
            }
            frames[i].style.height = frames_size + 'px';
        }
    }
}

然后在页面中运行它:

<script type="text/javascript">

    $(document).ready
(
     function () {
         autoResizeFrames();
     }

    );

</script>

但现在它不起作用?有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

当你跑步时:

    window.setInterval("autoresize_frames(frames)", 400);

您实际上是在窗口的上下文中eval代码。使用setInterval时,应该传递对函数的引用而不是字符串。您可以在Why is using the JavaScript eval function a bad idea?

了解为什么eval不好

通常你会这样做:

    window.setInterval(autoresize_frames, 400);

但是如果你的函数接受了参数,那么你需要将它包装在一个函数中。

以下内容可行:

window.setInterval(function() {
  autoresize_frames(frames);
}, 400);

答案 1 :(得分:0)

在你自己的函数中,“frames”在内部声明。 您可以尝试删除“var”关键字,使其成为全局变量。

答案 2 :(得分:0)

我认为问题可能出现在frames变量上,这可能无法在setInterval中访问。你可以试试这个

function autoResizeFrames() {
    window.setInterval(function(){
         autoresize_frames(document.getElementsByTagName("iFrame"))
    }, 400);
}