Добавленный HTML, содержащий javascript, не запускается, как я могу его запустить?

Я добавляю некоторый HTML, содержащий javascript.

<td onclick="toggleDay('+data+',this,'tue');">T</td>

и

<img src="img/cross.png" onclick="deleteAlarm('+data+');">

эти две части кода находятся в большом количестве HTML, которое я добавляю.

Они работают нормально, если они уже есть, когда страница загружается, но когда я добавить.

что вы предлагаете мне сделать? Нужен ли какой-то запрос для DOM для повторной интерпретации JavaScript после добавления или?

EDIT:

еще немного информации, Я с этой проблемой, потому что я добавляю некоторые вещи с AJAX в базу данных, и при успехе я добавляю html туда, где он должен быть. Вроде же так же с комментариями.

Edit2:

даже со всей дискуссией об этом, спасибо за ответы, заставил его работать.

5 ответов


Я бы сделал так:

Сначала добавьте атрибуты id в свой html:

<td id="toggleDayCell">T</td>

<img src="img/cross.png" id="crossImg">

затем есть Javascript, который работает на событии onload страницы и присоединяется к событиям, которые вас интересуют.

на PrototypeJS, это может выглядеть так:

Event.observe(window, 'load', function(){
  if( $('toggleDayCell') ) {
    Event.observe( $('toggleDayCell'), 'click', function(event){
      //do stuff here
    }
  }

  if( $('crossImg') ) {
    Event.observe( $('crossImg'), 'click', function(event) {
       //do stuff here
    }
  }
});

использование чего-то вроде Prototype (или jQuery) приятно, потому что оно заботится о кросс-браузерной совместимости.


вы добавляете HTML через AJAX? Если это так, вам придется вручную eval() JavaScript, который вы возвращаете. Вы могли бы обернуть в div и сделать что-то вроде этого:

wrapper.getElementsByTagName("script")
// for script in wrapper...
eval(script.innerHTML)

Если вы используете библиотеку, такую как prototype, было бы намного проще, поскольку вы можете передать ответ методу evalScripts ().


добавьте HTML в документ, затем программно добавьте событие onclick в объект.

это с моей головы, но... Я думаю, вы можете сделать это так:

IE:

Object.onclick = someFuntion

FF:

Object.addEventListener('click', someFunction);

У AJAX есть некоторые причуды... особенно с IE. Пример: вы не можете использовать свойство innerHTML для вставки / обновления чего-либо в элементе таблицы (в IE). Лучше использовать функции DOM для вставки/обновления / удаления узлов элементов (или добавления обработчиков событий). Вы можете использовать упомянутую функцию eval () для запуска динамически загружаемого javascript, который изменяет документ с помощью объектов DOM.


вы должны использовать addEventListener('click', /*...*/) вместо установки onclick в innerHTML или что-то еще.

IE вызывает addEventListener что-то совсем другое, так что вам придется компенсировать это.

(Edit: IE называет это attachEvent(). Надеюсь, это поможет.)