Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > frames undefined, в начале функции


Автор: 4epT 27.2.2012, 17:23
Всем привет. Пишу скрипт под плагин greasemonkey (для мозилы) и Tampermonkey (для google chrome). Для мозилы сделал все работет идеально. А вот под chrome проблемы.

Суть скрипта в следующем - добавить свою кнопку ко всем прикрепленным файлам в письме (речь о GMail).

У них сделано так, что окно с текстом письма это iFrame, я пытаюсь получить к нему доступ через frames[3], в мозиле работает, в хроме не успевает (в хроме уже только после полной загрузки страницы, написав в консоли frame[3], будет видин DOMWindow).

Подскажите какие могут быть варинты испаравления этой ситуации ? в какую сторону смотреть ?

Код очень запутанный и разобраться в нем будет крайне сложно, поэтому не вижу смысла его постить. Буду рад любым советам =)

Автор: Amphiluke 27.2.2012, 18:31
Ну так вы запускайте свой код после окончания загрузки страницы. smile:

Автор: 4epT 27.2.2012, 18:33
Каким образом ?

У меня код обернут в $(document).ready

результат тот же =(

Автор: Amphiluke 27.2.2012, 18:35
Ну, к примеру, так:
Код

$(window).bind("load", function() {
    // your code
});

Автор: 4epT 27.2.2012, 18:41
Цитата(Amphiluke @ 27.2.2012,  18:35)
Ну, к примеру, так:
Код

$(window).bind("load", function() {
    // your code
});

Так мой код вообще не вызывается  smile 

Автор: Amphiluke 27.2.2012, 18:53
То есть событие "load" окна не возникает?  smile  
Только что открыл GMail, проверил в консоли. Все нормально срабатывает.
Код

window.addEventListener("load", function() { console.log("!!!!!!!!!!!!"); }, false);

Автор: 4epT 27.2.2012, 19:04
Вставил Ваш пример) Да, событие произошло ... frames там тоже undefined =(

Попробовал в интервале ждать пока он будет готов, тоже никаких результатов. 

Автор: Amphiluke 27.2.2012, 19:16
А вы можете проверить на отдельном чистом user script`е, выкинув весь посторонний код? Просто прям вот такой скрипт из одной строчки:
Код

window.addEventListener("load", function() { console.log(typeof top.frames); }, false);

Я хз, у меня всё нормально пишет: «object», frames.length = 4. Правда, всё это при написании обработчика через консоль, но по большому счету, какая разница, наверное..

Автор: 4epT 27.2.2012, 19:36
Выводит object, но мне почему то кажется что это не показатель ) так как в моем скрипте frames.length выводит 5

Внесу немного ясности в данный вопрос. У меня через интервал, проверяется измнение урла, как только в урле я вижу что пользователь зашел в письмо, я запускаю свою функцию .. и уже там frames undefined. Может как то можно задержать выполнение функции ? До того момента как будет доступен frames.

Автор: Amphiluke 27.2.2012, 19:48
Цитата(4epT @  27.2.2012,  23:36 Найти цитируемый пост)
Может как то можно задержать выполнение функции ? До того момента как будет доступен frames.

А вы проверяли, что он в конце концов таки станет доступен? Именно из userscript?
Код

setTimeout(function() { alert(frames); }, 15000); // к примеру, так


Вообще говоря, если обработчик события 'load" у вас добавлен, все фреймы должны быть уже доступны к моменту его срабатывания. Но можно попытаться организовать опрос с интервалом
Код

setTimeout(function() {
    if (frames) {
        /* your code */
    } else {
        setTimeout(arguments.callee, 500);
    }
}, 500);


Добавлено через 2 минуты и 18 секунд
Правильнее так:
Код

var iid = setInterval(function() {
    if (frames) {
        clearInterval(iid);
        /* your code */
    }
}, 500);

Автор: 4epT 27.2.2012, 20:01
Цитата

setTimeout(function() { alert(frames); }, 15000);


Выводит DOMWindow object, то есть все хорошо.

Цитата

Код

var iid = setInterval(function() {
    if (frames) {
        clearInterval(iid);
        /* your code */
    }
}, 500);



Не помогло  smile 


Автор: Amphiluke 27.2.2012, 20:13
Цитата(4epT @  28.2.2012,  00:01 Найти цитируемый пост)
Не помогло

Что-то не верю.  smile
Единственное, чем отличается вариант с опросом через каждые полсекунды от варианта с 15-тисекундной задержкой, — это то, что в первом варианте о доступности frames станет известно раньше. 

Автор: 4epT 29.2.2012, 19:11
В общем проблема была в самом хроме .... это его примочки с безопасностью =) он блокирует доступ к frames. Данную "фичу" обойти можно только написаем непосредственно плагина под хром, и самое решение проблемы далеко не самое легкое, поэтому решил пока что на хром забить ..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)