Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подгрузка и выполнение JavaScript, почему не выполняется 
:(
    Опции темы
Greendrake
Дата 16.3.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



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

Это что же получается, остаётся только слать чистый код и загонять его в eval ???
PM MAIL   Вверх
Alx
Дата 16.3.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: 10
Всего: 78



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);        
}


Это сообщение отредактировал(а) Alx - 16.3.2006, 18:46


--------------------
PM MAIL WWW ICQ   Вверх
12345c
Дата 16.3.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



innerHTML - не входной поток, ничего удивительного.
PM WWW   Вверх
Greendrake
Дата 17.3.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



Цитата(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>


PM MAIL   Вверх
12345c
Дата 17.3.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Функция объявляется как локальная во 2-м случае и перестаёт существовать по окончании doIt().
PM WWW   Вверх
Ciber SLasH
Дата 17.3.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



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().


Это сообщение отредактировал(а) Ciber SLasH - 17.3.2006, 19:05
PM   Вверх
Greendrake
Дата 17.3.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 364
Регистрация: 14.7.2005

Репутация: нет
Всего: 6



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

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

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

functionName = fucntion(){code}

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

Это сообщение отредактировал(а) Greendrake - 17.3.2006, 22:04
PM MAIL   Вверх
Alex_B
Дата 26.5.2007, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.4.2007

Репутация: нет
Всего: 1



Цитата(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');

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

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

Спасибо.
PM MAIL   Вверх
Alex_B
Дата 26.5.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.4.2007

Репутация: нет
Всего: 1



Посмотрел в 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>

Все нормально работает.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.