LINUX.ORG.RU

Установить через setAttribute замыкание в роли обработчика события

 ,


0

2

Можно ли в ДжС установить через setAttribute замыкание в роли обработчика события

Вот код, который нужно заработать:

<html>
  <body>
    <button id="testit">Test it!</button>
    <script type="text/javascript">
      var data = 'Go to hell';
      var scope = function() {alert(data);}
      document.getElementById('testit').setAttribute('onclick', scope);
    </script>
  </body>
</html>

А что мешает воспользоваться jquery

$('#testit').click(function () { ... })

Иначе есть риск что не во всех браузерах будет работать.

psp13
()

document.getElementById('testit').onclick = scope;

Разве атрибуты могут принимать значение функций?

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

Почему спрашиваю — нужно атрибуты из JSON'а добавить. Судя по всему второй параметр setAttribute всегда имеет строковый тип. Буду писать так:

this.__setAttrs = function(element, attrs) {
      var attr, attrname;
      for (attrname in attrs) {
        attr = attrs[attrname];
        if (typeof attr === 'function') {
          element[attrname] = attr;
        } else {
          element.setAttribute(attrname, attr);
        }
      }
    };

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

P.S. В IE6 скорее всего есть только свой собственный attachEvent(2 параметра вместа трёх), но вроде на него уже забили.

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

s/frame.parentNode.removeChild frame/frame.parentNode.removeChild(frame)/

// coffeescript fix

sphericalhorse ★★★★★
() автор топика

Надо было так:

document.getElementById('testit').setAttribute('onclick', 'scope()');
У тебя scope преобразуется в строку и втыкается в хтмл. Да к тому же если в коде функции была бы кавычка, всю страницу бы разорвало.

А вообще правилый вариант - это addEventListener().

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

Эт потому что у объекта Window нет родителя. Попробуй найти тег фрейма и удалить его.

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

Ещё если у тебя два фрейма, можно тот который надо оставить распахнуть на всё окно через location или линком с target = «_top».

А вообще, тебе действительно так нужны фреймы?

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

jQuery ненужно. Особенно, когда пишешь библиотеку в фичлисте которой написано, что она работает без jQuery.

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

Ах да, IE6 понимает attachEvent() но это if()'ы писать, так что и так пойдёт.

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