Добавляем элемент <script> в DOM и выполняем javascript?

Я хочу добавить элемент в существующую DOM, чтобы запустить javascript-код.

Я сделал это с YUI:

var scriptNode = Y.Node.create('<script type="text/javascript" charset="utf-8">alert("Hello world!");<\/script>');
var headNode = Y.one('head');
headNode.append(scriptNode);

Он успешно добавлен в DOM, но он не дает мне оповещения.

Кто-нибудь знает, в чем проблема?

Ответ 1

Я не знаю, как работает функция YUI Node.create(), поэтому не комментируйте это. Но простой кросс-браузер script:

  window.onload = function() {
    var s = document.createElement('script');
    s.type = 'text/javascript';
    var code = 'alert("hello world!");';
    try {
      s.appendChild(document.createTextNode(code));
      document.body.appendChild(s);
    } catch (e) {
      s.text = code;
      document.body.appendChild(s);
    }
  }

Блок try..catch необходим, как и большинство браузеров, таких как первый метод, но некоторые не делают и бросают ошибку. Второй метод охватывает их. Вы также можете просто оценить код, который более или менее эквивалентен и что делают некоторые библиотеки.

Ответ 2

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

function DOMEval( code, doc ) {
    doc = doc || document;

    var script = doc.createElement( "script" );

    script.text = code;
    doc.head.appendChild( script ).parentNode.removeChild( script );
}