LINUX.ORG.RU

eval javascript'а для только что обновлённого DOM-дерева.

 , , , jquip


0

1
new_elements = '<a id="wow" href="#">Link</a>';
ol.html(new_elements);

js_code_text_using_those_elements = '$("a#wow").bind("click", ...)';

setTimeout('', 1000);
setTimeout('eval(js_code_text_using_those_elements)', 1000);

Как вы видите, сперва я добавляю в дерево новый элемент, затем запускаю eval на код с селектором для этого элемента. Если попробовать сделать eval на странице, не содержащей a#wow, то eval провалится.

Проблема в том, что если запустить eval сразу после ol.html(...), то DOM ещё не будет обновлён, элемента на странице не будет и eval провалится. Как вы понимаете, костыль с таумаутами - это костыль.

Собственно, три вопроса: а) какой таймаут минимален, б) как написать без тайматуов, в) что это вобще такое?


как написать без тайматуов

Написать без эвала.

var element = $('<a что то там>'); 
element.on('click', handler); 
parent.append(element); 

А вообще, телепат во мне подсказывает что тебе нужно делегирование.

Kalashnikov ★★★
()

а) какой таймаут минимален

Минимален для чего? Для вставки новых элементов в DOM? Это все зависит от: 1) используемого браузера его скорости работы с DOM (у IE обычно очень медленная вставка); 2) машины пользователя, т.к. скорость операции будет напрямую зависеть и от этого. Вывод? Никакой таймаут не будет гарантией.

б) как написать без тайматуов

Что мешает использовать try-catch с повторным вызовом eval, если провален? Естественно, что пытаться снова стоит с неким минимальным таймаутом (50мс будет достаточно), дабы снизить лишнюю загрузку проца.

в) что это вобще такое?

Кто здесь? (о_О )

Boba_Fett
()
Ответ на: комментарий от Boba_Fett

Обработка эксепшена годится. Спасибо.

daris
() автор топика
Ответ на: комментарий от Kalashnikov

У меня старый проект в котором вместо JQuery используется jQuip. А у него проблемы с bind и live. А кроме того, я уже ответил что вопрос решён, что тут обсуждать?

daris
() автор топика
Ответ на: комментарий от daris

1. Используй классы для определения элементов, которые должны быть обработаны одинаково. 2. Используй обработчик события для document, уже в нем определяй, для какого конкретно элемента сработало событие, и нужно ли его обрабатывать. 3. Не используй евал. Использовать евал не нужно никогда.

Yasenfire
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.