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


Автор: Tony 25.9.2006, 09:29
На странице обнавляется контент 4ерз ajax.Проблема в том что в ответ возвращается html+<script type="text/javascript">alert('some_text')</script>

Полу4енный скрипт не отрабативет на странице.Как заставить работать его smile .

Автор: pythonwin 25.9.2006, 09:32
может поместить в innerHTML тега <div/>?

Автор: skyboy 25.9.2006, 09:43
как ты этот ответ вставляешь: через innerHTML или путем парсинга дерева для Response?

Автор: Tony 25.9.2006, 09:44
Код

<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            updatepage(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(null);
}

function getquerystring() {
    var form     = document.forms['f1'];
    var word = form.word.value;
    qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
    return qstr;
}

function updatepage(str){
    document.getElementById("result").innerHTML = str;
}
</script>
</head>

<form name="f1">
  <p>word: <input name="word" type="text">  
  <input value="Go" type="button" onclick='JavaScript:xmlhttpPost("test.html")'></p>
  <div id="result"></div>
</form>
</body>
</html>



ответ:
Код

<h1>test</h1>
<script type="text/javascript">alert('killer')</script>
<h2>=====</h2>

Автор: 12345c 25.9.2006, 13:47
На подобное вроде бы отвечали, что скрипт надо обернуть в функцию, а потом вызвать её по eval('имя_функции();');.

Автор: Tony 25.9.2006, 14:25
eval не подходит.Как то по другому можно?

Автор: skyboy 25.9.2006, 15:22
средствами DOM создаешь элемент типа SCRIPT, наполняешь его скриптом, меняешь свойство src на что угодно(например - " "), а потом - обратно обнуляешь. Насколько мне известно, скрипт "перезагрузится" с выполнением контента.

Автор: pythonwin 25.9.2006, 17:04
Цитата(skyboy @  25.9.2006,  22:22 Найти цитируемый пост)
средствами DOM создаешь элемент типа SCRIPT, наполняешь его скриптом, меняешь свойство src на что угодно(например - " "), а потом - обратно обнуляешь. Насколько мне известно, скрипт "перезагрузится" с выполнением контента.

а код сможешь показать?

Автор: Tony 25.9.2006, 17:04
Цитата(skyboy @ 25.9.2006,  15:22)
средствами DOM создаешь элемент типа SCRIPT, наполняешь его скриптом, меняешь свойство src на что угодно(например - " "), а потом - обратно обнуляешь. Насколько мне известно, скрипт "перезагрузится" с выполнением контента.

Ты предлогаешь разделить полу4енные данные на хтмл и скрипт(не покатит т.к. сервер рендерит одно целое).Тоесть сна4ала рендерится хтмл затем идёт яваскрипт,каторый регулурует предыдуший html http://forum.vingrad.ru/index.php?showtopic=110775 posmotitam vnizy <script type="text/javascript">document.onload=selectDefaultTab('s3475394dfbgf_1');</script>

Автор: pythonwin 25.9.2006, 17:07
Цитата(Tony @  26.9.2006,  00:04 Найти цитируемый пост)

Ты предлогаешь разделить полу4енные данные на хтмл и скрипт(не покатит т.к. сервер рендерит одно целое).Тоесть сна4ала рендерится хтмл затем идёт яваскрипт,каторый регулурует предыдуший html tabControl posmotitam vnizy <script type="text/javascript">document.onload=selectDefaultTab('s3475394dfbgf_1');</script> 


Tony, ты это для TabControl делаешь?

Добавлено @ 17:11 
здесь посмотри - может это поможет?
http://mochikit.com/doc/html/MochiKit/DOM.html
http://mochikit.com/doc/html/MochiKit/index.html

Добавлено @ 17:12 
http://mochikit.com/doc/html/MochiKit/Async.html

Автор: skyboy 25.9.2006, 17:25
Цитата(pythonwin @  25.9.2006,  16:04 Найти цитируемый пост)

а код сможешь показать? 

что-то я попутал smile вот так создаю:
Код

<html>
<head>
<script type="text/javascript">
function foo()
{
 var script= document.createElement('script');
 script.type= "text/javascript";
 script.text= 'alert("!");';
 document.getElementsByTagName('body')[0].appendChild(script);
}
</script>
</head>
<body onload="foo();">
</body>
</html>

Алерт видно и под ФФ1.5.0.7, и под ИЕ 6.0 без изменения источника скрипта...

Автор: Tony 25.9.2006, 17:48
Цитата(pythonwin @ 25.9.2006,  17:07)
Цитата(Tony @  26.9.2006,  00:04 Найти цитируемый пост)

Ты предлогаешь разделить полу4енные данные на хтмл и скрипт(не покатит т.к. сервер рендерит одно целое).Тоесть сна4ала рендерится хтмл затем идёт яваскрипт,каторый регулурует предыдуший html tabControl posmotitam vnizy <script type="text/javascript">document.onload=selectDefaultTab('s3475394dfbgf_1');</script> 


Tony, ты это для TabControl делаешь?

Добавлено @ 17:11 
здесь посмотри - может это поможет?
http://mochikit.com/doc/html/MochiKit/DOM.html
http://mochikit.com/doc/html/MochiKit/index.html

Добавлено @ 17:12 
http://mochikit.com/doc/html/MochiKit/Async.html

угу.Спасибо посматрю.

Добавлено @ 17:57 
Цитата(skyboy @ 25.9.2006,  17:25)
Цитата(pythonwin @  25.9.2006,  16:04 Найти цитируемый пост)

а код сможешь показать? 

что-то я попутал smile вот так создаю:
Код

<html>
<head>
<script type="text/javascript">
function foo()
{
 var script= document.createElement('script');
 script.type= "text/javascript";
 script.text= 'alert("!");';
 document.getElementsByTagName('body')[0].appendChild(script);
}
</script>
</head>
<body onload="foo();">
</body>
</html>

Алерт видно и под ФФ1.5.0.7, и под ИЕ 6.0 без изменения источника скрипта...

Ты предлагаешь эту страницу 4ерз ajax загрузить?

Автор: skyboy 25.9.2006, 17:59
нет, конечно. я говорю, что при таком создании(а не через innerHTML) скрипт выполняется. только и всего.

Автор: Tony 25.9.2006, 18:05
Конечно developer'ы будут перегружать отделный tab(содержимое таба) ,а не весь tabbedPane 4ерз аях.Тоесть это вопрос снимает,но...Если нужно будет весь tabbedPane ?  smile .Поэтому вопрос не решён.А то потом будут бегать :"ААА у меня не работает 4то за ........." smile 

Автор: skyboy 25.9.2006, 18:19
Tony, не совсем понятно. это ты к моему посту говоришь? 
у меня вот формируется ответ в виде валидного XHTML-кода. Полученное я парсю рекурсивно при помощи DOM функций, причём при объеме передачи 50-100 элементов критического падения скорости в сравнении с использованием innerHTML не наблюдаю. А ко всему имею полный контроль над воссозданием дерева. Потому для меня остаётся загадкой, почему ри передаче tabbedPanel должны быть проблемы. Впрочем, я вообще не знаю, что это такое. Шаблон, что ли?

Автор: Sardar 25.9.2006, 18:27
Цитата(Tony @  25.9.2006,  13:25 Найти цитируемый пост)
eval не подходит.Как то по другому можно? 

Нда, что "религя" с людьми делает...  smile 

Если изначально получаем JS, то смысл пользовать XMLHttpRequest отпадает (ну ради POST запросов только), можно, как уже сказал skyboy, грузить инфу создавая <script>.

Также можно глянуть в http://prototype.conio.net/ либу, там есть удобные функции вырезающие JS код из ответов, а затем кидающие его на eval (как будто догадывались парни о извратах что будет писать народ... smile ).


M
Sardar
К AJAX это всё не имеет никакого отношения, тему переименовал.

Автор: Tony 25.9.2006, 21:59
Цитата(skyboy @ 25.9.2006,  18:19)
Tony, не совсем понятно. это ты к моему посту говоришь? 
у меня вот формируется ответ в виде валидного XHTML-кода. Полученное я парсю рекурсивно при помощи DOM функций, причём при объеме передачи 50-100 элементов критического падения скорости в сравнении с использованием innerHTML не наблюдаю. А ко всему имею полный контроль над воссозданием дерева. Потому для меня остаётся загадкой, почему ри передаче tabbedPanel должны быть проблемы. Впрочем, я вообще не знаю, что это такое. Шаблон, что ли?

net ne k tvoemu.

Добавлено @ 22:02 
a nasjot virezanij(prototype.js) posmotrju funkciju.Ok.Vsem spasibo za u4astie

Автор: Tony 25.9.2006, 22:31
Всё ресшил так
 
Код

new Ajax.Updater("result","test.html","evalScripts:true");

Правда опера ругается на скрипт.А так в ИЕ и ФФ срабатывает.

Автор: pythonwin 26.9.2006, 10:57
Цитата(skyboy @  26.9.2006,  00:25 Найти цитируемый пост)
Выделить всёРазметка HTML
Код

<html>
<head>
<script type="text/javascript">
function foo()
{
 var script= document.createElement('script');
 script.type= "text/javascript";
 script.text= 'alert("!");';
 document.getElementsByTagName('body')[0].appendChild(script);
}
</script>
</head>
<body onload="foo();">
</body>
</html>

Алерт видно и под ФФ1.5.0.7, и под ИЕ 6.0 без изменения источника скрипта... 


У меня прекрасно работает.


Tony, покажи пожалуйста весь код! smile

Автор: Tony 26.9.2006, 16:00
ну а 4то показивать, просто исползуй prototype.js.С помощю него и перегружай содержимое дива.Саное глабное укажи
evalScripts:true.
Код

<input type="button" onclick="new Ajax.Updater('result','test.html','evalScripts:true')" />;
<div id="result">
</div>


я и ранше его испoльзовал(Ajax.Updater),но не знал 4то есть evalScripts.Если 4тото не догоняешь напиши.

Автор: pythonwin 27.9.2006, 07:01
Цитата(Sardar @  26.9.2006,  01:27 Найти цитируемый пост)

Также можно глянуть в prototype.js либу, там есть удобные функции вырезающие JS код из ответов, а затем кидающие его на eval (как будто догадывались парни о извратах что будет писать народ... smile ).

спасибо, за ссылку! smile

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