Ошибки JavaScript при циклическом просмотре коллекции Iframe -> Предотвращение неправильных проблем с индексами - PullRequest
1 голос
/ 16 сентября 2011

Я сравниваю все iframes в моем javascript, чтобы увидеть, соответствует ли один из них элементу тела моего элемента (a -tag). У меня проблема в том, что коллекция iframes может иногда меняться, потому что все они генерируются фреймворком. Поэтому иногда я получаю ошибки «Отказано в доступе» в IE8, а иногда нет. Я не ссылаюсь ни на какие внешние 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 при запуске моего кода. Основываясь на некоторых исследованиях, проведенных мной по этому вопросу Междоменные сценарии , Создание сценариев с помощью коллекции Iframe , я узнал, что коллекция Iframe является живой коллекцией? Таким образом, это означает, что коллекция обязательно изменится (иногда), когда я буду проходить через нее. Поэтому я предположил, что это может вызвать 2 ошибки, бесконечный цикл или неправильные ошибки индекса. Я думал, что сохранение ссылки на iframes в var предотвратит ошибки. Но, очевидно, я был неправ:

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

Это не помогло. Какие-нибудь предложения, как я могу предотвратить неправильный индекс Проблема? Или я совершенно не прав насчет моей проблемы? Помощь очень ценится!

1 Ответ

0 голосов
/ 16 сентября 2011

Вы можете поставить 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
        }
     }  
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...