循环遍及Iframe集合时出现Javascript错误 - >防止错误的索引问题

时间:2011-09-16 08:29:48

标签: javascript jquery iframe internet-explorer-8

我正在比较我的javascript中的所有iframe,看看其中一个iframe是否与我的元素(a -tag)body元素匹配。我遇到的问题是iframe的集合有时会发生变化,因为它们都是由框架生成的。因此,有时我会在IE8中收到“Access is denied”错误,有时我却没有。我没有引用任何外部Iframe,因为我的所有Iframe都是框架的一部分,因此具有相同的协议,端口等。这是我用来遍历iframe集合的代码:

var calculatedwidth = 0;
var calculatedheight = 0;

var searchbody = $(srcElement).closest('body');
//I store the Iframe-nodelist in var arrFrames
var arrFrames = document.getElementsByTagName("iframe");
LabelA1:
for(i = 0; i<arrFrames.length; i++){
    //console.log(i);
    //if(arrFrames[i].id != 'PeopleDetailsIframe'){

        if($(arrFrames[i].contentWindow.document.body).is(searchbody)){
        // This line is where the error occures normaly
               calculatedwidth = $(arrFrames[i]).offset().left;
               calculatedheight = $(arrFrames[i]).offset().top;
               break LabelA1;
        }
        else{
              //console.log("Forum Iframe not found");
            }
     }  
}  

我通过包含休息暂时解决了我的问题,如果找到了搜索到的iframe,就会突破循环。这大约有80%的时间是我的代码执行的。但由于网页是可自定义的,因此一些用户回答说我的代码运行时会出现javascript错误。基于我对主题Cross-Domain scriptingScripting with Iframe Collection所做的一些研究,我了解到Iframe集合是一个真人集合?所以这意味着当我循环时,集合必然会发生变化(有时候)。所以我认为这可能导致2个错误,无限循环或错误的索引错误。我认为将参考存储在var中的iframe可以防止错误。但显然我错了:

var arrFrames = document.getElementsByTagName("iframe");

这没有帮助。有什么建议我怎么能防止错误的索引问题?或者我完全错了我的问题所在? 非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

您可以在try-catch周围添加if()。这样循环应始终运行而没有错误。

var calculatedwidth = 0;
var calculatedheight = 0;

var searchbody = $(IframeDocument).closest('body');
var arrFrames = document.getElementsByTagName("iframe");
LabelA1:
for(i = 0; i<arrFrames.length; i++){
    //console.log(i);
    //if(arrFrames[i].id != 'PeopleDetailsIframe'){

        try {
            if($(arrFrames[i].contentWindow.document.body).is(searchbody)){
            // This line is where my the error occures normaly
                   calculatedwidth = $(arrFrames[i]).offset().left;
                   calculatedheight = $(arrFrames[i]).offset().top;
                   break LabelA1;
            }
            else{
                  //console.log("Forum Iframe not found");
                }
        } catch() {
            // the IFrame has security issue => avoid it
        }
     }  
}