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


Автор: Alix36 19.4.2007, 19:58
Вот такой скриптик.
ajax.htm
Код

<!doctype html public "-//W3C//DTD HTML 4.0//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<script type="text/javascript" src="lib/ajax/zxml.js"></script>
<script> var oXmlHttp = null;
var iInterval = 10000;
var divT = null;
function checkComments() {
    if (!oXmlHttp) {
        oXmlHttp = zXmlHttp.createRequest();
    } else if (oXmlHttp.readyState != 0) {
        oXmlHttp.abort();
    }    
    
    oXmlHttp.open("get", "temp.php", true);
    oXmlHttp.onreadystatechange = function () {               
        
        if (oXmlHttp.readyState == 4) {
            if (oXmlHttp.status == 200) {

display(oXmlHttp.responseText);
                
                setTimeout(checkComments, iInterval);             
            }                         
        }
    };    

    oXmlHttp.send(null);       

}
function display(sText) {
            var div = document.getElementById("divT");
            div.innerHTML = "<script>"+sText+"</script>";
        }
//if Ajax is enabled, assign event handlers and begin fetching
window.onload = function () {
    if (zXmlHttp.isSupported()) {
        checkComments();              
    }
};</script>
<div id="divT"></div>
</body>
</html> 



TEMP.php
Код

alert('yyyy');

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

цель- сделать по этой схеме, чтобы раз в N мсек создавался алерт(цель можно достичь намного более простым способом, но мне важен именно сам процесс обмена AJAX )

Величайшее изобретение fireBug ajax возвращает не просто текст, а текст кокто размеченный
Код

<div class="sourceRow"><a class="sourceLine">1</a><span class="sourceRowText">alert('yyyy');</span></div>
<div class="sourceRow"><a class="sourceLine">2</a><span class="sourceRowText"></span></div>
<div class="sourceRow"><a class="sourceLine">3</a><span class="sourceRowText"></span></div>
<div class="sourceRow"><a class="sourceLine">4</a><span class="sourceRowText"></span></div>

на мой взгляд из-за этого и не пашет, но как избавится от всего этого я невкурсе(
скорее всего причина в Zxml творение http://nczonline.net/downloads/zXml.zip  от но там ничего немогу понять

Чтож я хочу от вас. Укажите мне хотябы путь в котором рыть, но лучше тыкните в определенную стрку.

Добавлено через 2 минуты и 53 секунды
Возможно можно не править сам ZXML а добавить доп обработчик транслируемого текста в функции 
Код

function display(sText) {
            var div = document.getElementById("divT");
            div.innerHTML = "<script>"+sText+"</script>";
        }

где sText - текст возвращаемый ajax/

Автор: Alix36 20.4.2007, 18:25
Мохбыть кто знаает другие кроссбраузеры

Автор: skyboy 20.4.2007, 19:48
чтоб инициировать выполнение блока script надо переписать аттрибут src. например, так:
Код

var scr= document.createElement('script');
scr.type="text/javascript";
scr.appendChild(document.createTextNode('alert(1);'));
document.getElementsByTagName('body')[0].appendChild(scr);
scr.src= ' ';
scr.src= '';

не знаю, как насчет кроссбраузерности(не нашел  в IE JavaScript - консоли  smile ), но в FireFox'e такая штука-дрюка честно вызывает алерт.
Собственно, если вставлять в созданный скрипт содержимое, пришедшее по AJAX - разницы особой  я не вижу...
---------------
подытожим: для запуска скрипта лучше использовать методы DOM, а не innerHTML

Автор: vasac 20.4.2007, 19:50
eval() есть такая функция.
а для подгрузки исполняемого js-кода гораздо правильнее идеологически, проще и кроссбраузернее — динамическое создание элемента SCRIPT. ну или json на худой конец.

___
опять Скайбой опередил smile

Автор: Alix36 20.4.2007, 22:45
skyboy, 
vasac, Во-первых спасибо что откликнулись, 
 smile я совсем блондинить начал про eval забыл с концами.
а про то что предложил skyboy  я несовсем понял, ты предлагаеш вместо всего кода это вставить, т.е. я несовсем врубился в принципе и целе твоего кода.

--- --- --- ---
Немного подумав
--- --- --- ---
Кажись доперло это ты предлагаеш посылать из PHP файла?

Автор: Alix36 21.4.2007, 07:23
--- --- --- ---
Немного подумав2
--- --- --- ---
Я понял этот скрипт в ajax.html ты предлагаешь.
Тока кинь ссылку на статью о свойстве Scr 

У мя такая идея может для экономии трафика PHP скрипт будет возвращать только 1 или2 или 3(там будет всетаки скрипт который динамически изменяется.)

а тогда в ajax.html можно делоть из результата серверного скрипта переменную, и по ее значению делать определенный евал.

Добавлено через 14 минут и 12 секунд
Код

function display(sText) {
            var result = sText;
            if(result=='1')
            {
            alert('E,kz!');
            }
            
        }

Примерно так

Автор: skyboy 21.4.2007, 08:38
я динамически создаю элемент <script>(переменная Scr - имя её никак не влияет на код, а свойства этой переменной - как атрибуты у элемента script), вот его http://wdh.suncloud.ru/dhtml08.htm#ref4841. Он наследует http://wdh.suncloud.ru/dhtml06.htm#ref464, который в свою очередь наследует http://wdh.suncloud.ru/dhtml04.htm#ref442, а он уналедовался от http://wdh.suncloud.ru/dhtml03.htm#ref431. Благодаря этим ссылкам, я думаю, узнаешь много чего интересного...
Я код привел для демонстрации динамической вставки скрипта в страницу и запуска этого блока на выполнение. Только и всего. Хочешь прикрутить этот код к своему AJAX'у - вместо 
Код

scr.appendChild(document.createTextNode('alert(1);'));

сделай вставку в элемент своего текста
Код

scr.appendChild(myXmlHttpRequest.responseText);

или ещё как...

Автор: Alix36 21.4.2007, 13:51
я сделал по своему всетаки. 
см пост выше 
Но есть такая трабла, почемуто с каждым разом скрипт посылает все больше и больше запросов к серверу, и я немогу понять почему. 
еще раз JS код.
Код

var oXmlHttp = null;
var iInterval = 10000;
var divT = null;
function checkComments() {
    if (!oXmlHttp) {
        oXmlHttp = zXmlHttp.createRequest();
    } else if (oXmlHttp.readyState != 0) {
        oXmlHttp.abort();
    }    
    
    oXmlHttp.open("get", "lib/ajax/atloc.php", true);
    oXmlHttp.onreadystatechange = function () {               
        
        if (oXmlHttp.readyState == 4) {
            if (oXmlHttp.status == 200) {

display(oXmlHttp.responseText);
                
                setTimeout(checkComments, iInterval);             
            }                         
        }
    };    

    oXmlHttp.send(null);       

}
function display(sText) {
            var result = sText;
            if(result=='1')<!-- goingend -->
            {
            alert("Èû ïðèøëè!")

            }
                if(result=='2')<!-- findYes -->
            {
            alert("ÓÐÀ! Âû ÷òîòî íàøëè!")
            
            }
                if(result=='3')<!-- findNO -->
            {
            alert("Êñîæàëåíèþ, âàø èíâåíòàðü ïåðåïîëíåí è âàì ïðèøëîñü âûêèíóòü òî, ÷òî âû íàøëè!")
            
            }
            
            
        }
//if Ajax is enabled, assign event handlers and begin fetching
window.onload = function () {
    if (zXmlHttp.isSupported()) {
        checkComments();              
    }
};

помойму все дело в этом.
Код

//if Ajax is enabled, assign event handlers and begin fetching
window.onload = function () {
    if (zXmlHttp.isSupported()) {
        checkComments();              
    }
};

но без него тоже работать не будет.

Добавлено через 6 минут и 39 секунд
в почемуто еще иногда вылетает ошибка 
[Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://test1.ru/lib/ajax/Chatloc.js :: anonymous :: line 15" data: no]
[Break on this error] 
if (oXmlHttp.status == 200) {

Добавлено через 9 минут и 42 секунды
гы получается клевая прогрессия 1-1-2-3-5-7-10-12 тока она не совсем прогрессия)
Этоя про количество запросов раз от раза 

Автор: Alix36 21.4.2007, 19:10
Может быть это из за кэша? 

Автор: Sardar 4.5.2007, 17:00
Лиса кидает исключение если в ответ приходит не 2хх, при чём делает это она на вызове .send(), который в асинхронном режиме уже по идее завершился. Хотя это удобно, обернул в try/catch, вызвал обработчик ошибки.

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