Динамически добавленный JavaScript не выполняется в Safari & IE - PullRequest
1 голос
/ 15 января 2011

У меня проблемы с выполнением блока javascript, который динамически загружается и вставляется на страницу.Это загруженный (упрощенный) код:

<p>i am html-code</p>

<script type="text/javascript">
 alert("i'm here");
</script>

Этот фрагмент кода внедряется с помощью этой команды Mootools:

new Element('div', {
  'class': 'foo'+item_data[id].contenttype,
  'id': '123',
  'html': code
}).inject($('presentation'));

(Код переменной содержит первый фрагмент кода.)

В Firefox это работает.Когда вызывается команда ввода, отображается абзац и выполняется javascript.В IE и Safari отображается только абзац.

Любые подсказки, как я могу справиться с этой проблемой без 'eval'?Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 15 января 2011

Вот хорошая короткая статья о том, как справиться с этим.

Основная проблема заключается в том, что IE & Safari не оценивают узел DOM после загрузки его по умолчанию; это, возможно, функция безопасности.

Основная хитрость, которую нужно исправить, состоит в том, что вы должны написать ее как функцию и установить эту функцию для оценки при событии onload; это гарантирует, что код будет оценен.

Кража , следуя примеру статьи, код будет выглядеть примерно так:

var script = document.createElement('script');
script.setAttribute('src','myjavascriptfile.js');
script.setAttribute('type','text/javascript');
var loaded = false;
var loadFunction = function()
{
  if (loaded) return;
  loaded=true;
  // your code goes here
  alert("I'm here!");
};
script.onload = loadFunction;
script.onreadystatechange = loadFunction;

Обновление

Похоже, у вас здесь есть пара переменных. Попробуйте немного упростить - вместо зависимости от MooTools создайте простую базовую HTML-страницу и просто вставьте в нее свой код.

Вот пример:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
<head>
  <meta http-equiv='content-type' content='text/html; charset=utf-8' />

  <title>Trial</title>
  <meta name='generator' content='BBEdit 9.6' />
  <script type="text/javascript">
  //<![CDATA[
  var script = document.createElement('script');
  script.setAttribute('src','myjavascriptfile.js');
  script.setAttribute('type','text/javascript');
  var loaded = false;
  var loadFunction = function(){
    if (loaded) return;
    loaded=true;
    // your code goes here
    alert("I'm here!");
  };
  script.onload = loadFunction;
  script.onreadystatechange = loadFunction;
  //]]>
  </script>
</head>

<body>
</body>
</html>

Это чистый Tidy-ed-код, который должен работать на самых невротических из приемлемых браузеров, а также на IE. Предполагая, что у вас есть исходный файл javascript для загрузки как myjavascriptfile.js, он должен работать.

Тогда я бы предложил использовать это как myjavascriptfile.js, чтобы начать с:

// myjavascriptfile.jx
alert("My java script has loaded YAY!!");
0 голосов
/ 01 мая 2015

Я понимаю, что это 4 года спустя, но у меня недавно была такая же проблема.

Возвращаясь к паре версий Mootools (3.x, 4.x и 5.x), addEvent работал для меня, используя:

new Element('script', {
    src: 'myscript.js',
    async: true
}).addEvent('load', myFunc).inject(document.getElement('body'), 'top');

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

Вы можете добавить задержку в методе onLoad или запустить даже в загруженном JS и прослушать это вместо этого:

window.addEvent('myscripEvent', myFunc);

new Element('script', {
    src: 'myscript.js',
    async: true
}).inject(document.getElement('body'), 'top');

Тогда в myscript.js:

/* my code here */

window.fireEvent('myscripEvent');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...