Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задачки на сообразительность (https://javascript.ru/forum/misc/9351-zadachki-na-soobrazitelnost.html)

Riim 12.05.2010 13:38

Нужно просто вспомнить что js - ООП язык, и все легко решается.

Skipp 12.05.2010 13:39

Ну тогда brain.destroy() уж точно подойдёт!

Kolyaj 12.05.2010 13:42

Skipp,
вопрос не о профессиональных качествах того, кто создал такое окружение, а о том, как с таким окружением жить.

Octane 12.05.2010 13:43

Тогда не знаю, что делать с attachEvent для window в IE.

Kolyaj 12.05.2010 13:46

Кстати, живой пример первой задачи: _http://www.kingsland.ru/

MeFCorvi 12.05.2010 13:49

Хм, со второй задачей всё понятно. Для addEventListener тоже есть рабочий вариант, но attachEvent в IE вызвать пока не получилось)

Kolyaj 12.05.2010 13:56

Упс, а attachEvent-то я и не проверял. Вобщем для красоты решения в первой задаче лучше оставить только addEventListener.

Хотя если кто найдёт красивое решение для attachEvent, с удовольствием посмотрим.

Riim 12.05.2010 13:59

Что-то вторая задачка так же как первая решаться не хочет :( .

Riim 12.05.2010 14:19

Вторую тоже решил :) .

Kolyaj 14.05.2010 11:57

Что-то забыл про тему. Итак мои варианты.

1. С addEventListener всё просто, вытаскиваем его у любого элемента и вызываем в контексте window
document.createElement('div').addEventListener.call(window, 'resize', fn, false);



2. С глобальными функциями идеей многие тоже прониклись. Создаём iframe и берём оттуда. Идея проста, реализация сложней.

Во-первых, я уже как-то писал, IE не создает js-контекст на странице, если там нет ни одного скрипта. Т.о. в iframe нужно написать хотябы <body onload=""></body>

Во-вторых, во всех браузерах все эти операции с iframe'ом синхронны, а в Опере, как всегда, всё наоборот, там нужно ждать onload (при этом не во всех браузерах он срабатывает).

В-третьих, после уничтожения iframe (зачем нам его держать в DOM'е?) IE через некоторое время убивает добытые функции. Мне помогло после добытия функций
setTimeout(function() {}, 3600 * 24 * 1000);



Оба эти подхода, кстати, не академические, и вполне себе работают в боевых условиях.


Часовой пояс GMT +3, время: 05:11.