Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Подгрузка и выполнение JavaScript


Автор: Greendrake 16.3.2006, 18:27
Недавно обнаружил такую вещь, на которую я никак не рассчитывал. Динамически подгружаю контент для дива, и к нему же прилагается дополнительный JavaScript-код, который мне нужно немедля выполнить. Ничего не подозревая, просто шлю код в оболочке <script type="text/javascript" language="JavaScript"></script>, думая, что как только он встанет в innerHTML дива, тут же и выполнится. Хрен там!
Попытка выполнить этот фокус в DOM-овском стиле типа appendChild тоже ничего не дала.

Это что же получается, остаётся только слать чистый код и загонять его в eval ???

Автор: Alx 16.3.2006, 18:42
Greendrake,
обворачивай в функцию и вызывай её.
либо клади во внешний файл и подгружай, как <script src="*"></script>
Код


function change_src()
{var link = "scriptN.js";
var old_s = document.getElementById('dataloader');
if (old_s)
{old_s.parentNode.removeChild(old_s);            
}
var s = document.createElement('script');
s.setAttribute('type', 'text/javascript');
s.src = link;
s.id = 'dataloader';
document.getElementsByTagName('head')[0].appendChild(s);        
}

Автор: 12345c 16.3.2006, 20:21
innerHTML - не входной поток, ничего удивительного.

Автор: Greendrake 17.3.2006, 18:01
Цитата(Alx @ 16.3.2006, 18:42)
обворачивай в функцию и вызывай её.
либо клади во внешний файл и подгружай

Мда, видимо так и придётся.

Кто-нить может объяснить, почему вот в этом примере нажатие на кнопку 2 выдаёт сообщение "done" только в случае, когда eval стоит в глобальном контексте, а когда помещаешь его в doIt (где закомментировано) - перестаёт работать smile . Переменная code - глобальная, и доступна в doIt так же как и снаружи.

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <title>Fuck</title>
    <script type="text/javascript" language="JavaScript">
      var code = 'function doIt2(){alert(\'done\');};';
      eval(code);
      function doIt(){
      // eval(code);
        document.getElementById('div').innerHTML = '<input type="button" value="2" onclick="doIt2()" />';
      };
    </script>
  </head>
  <body>
    <input type="button" value="1" onclick="doIt()" />
    <div id="div"></div>
  </body>
</html>


Автор: 12345c 17.3.2006, 18:42
Функция объявляется как локальная во 2-м случае и перестаёт существовать по окончании doIt().

Автор: Ciber SLasH 17.3.2006, 19:05
Greendrake, ну можно было бы сообразить, у тебя во втром случае код в run-time получается такой:
Код

      function doIt(){
        function doIt2(){alert('done');};
        document.getElementById('div').innerHTML = '<input type="button" value="2" onclick="doIt2()" />';
      };

doIt2 у тебя внутри doIt получится, как сказал 12345c:
Цитата(12345c @ 17.3.2006, 18:42 Найти цитируемый пост)
Функция объявляется как локальная во 2-м случае и перестаёт существовать по окончании doIt().

Автор: Greendrake 17.3.2006, 22:03
Цитата(Ciber SLasH @ 17.3.2006, 19:05)
ну можно было бы сообразить, у тебя во втром случае код в run-time получается такой:

Да, ступил, впрочем до меня это доперло вскоре после поста, но подтереть не успел smile

Выходит, чтобы использовать решение сабжа "оборачивать в функцию и вызывать её", нужно все функции в начинке представить в виде
Код

functionName = fucntion(){code}

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

Автор: Alex_B 26.5.2007, 14:57
Цитата(Alx @ 16.3.2006,  18:42)
клади во внешний файл и подгружай, как <script src="*"></script>
Код


function change_src()
{var link = "scriptN.js";
var old_s = document.getElementById('dataloader');
if (old_s)
{old_s.parentNode.removeChild(old_s);            
}
var s = document.createElement('script');
s.setAttribute('type', 'text/javascript');
s.src = link;
s.id = 'dataloader';
document.getElementsByTagName('head')[0].appendChild(s);        
}

Я воспользовался функцией Alx

Когда гружу скрипты со своего же сайта, все отлично, но нужно еще и сдругих.

Вот, например, пытаюсь поключиться к Google maps:

Код

function change_src(link){
    var old_s = document.getElementById('dataloader');
    if (old_s){old_s.parentNode.removeChild(old_s);}
    var s = document.createElement('script');
    s.setAttribute('type', 'text/javascript');
    s.src = link;
    s.id = 'dataloader';
    document.getElementsByTagName('head')[0].appendChild(s);
}

change_src('http://maps.google.com/maps?file=api&amp;v=2&amp;
    key=ABQIAAAAOl-rMAdPBTAsVQkBODpEEBTyo-
    H9dFBSgWANgvLW3RUw7rauDBQ0-9lgN73iCT-bQtj8q23x4v5ulA');

Ничего не происходит.

В чем может быть причина?

Спасибо.

Автор: Alex_B 26.5.2007, 15:22
Посмотрел в FF, там внизу в строке состояния появляется надпись:
"Прочитано www.google.com"

Если же поключать скрипт вручную, неиспользуя функцию Alx, т.е. вот так:
Код

<head>
...
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAOl-rMAdPBTAsVQkBODpEEBTyo-H9dFBSgWANgvLW3RUw7rauDBQ0-9lgN73iCT-bQtj8q23x4v5ulA"
      type="text/javascript"></script>

Все нормально работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)