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


Автор: DeMONiZ 15.4.2010, 05:30
Здавствуйте! Проблема такова, или даже не проблема а вопрос.
есть код

Код

<script>
function getAXAH(url,elementContainer) {
    var theHttpRequest = false;
    try {
        theHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e) {
        try {
            theHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
        } catch(e) {
            theHttpRequest = new XMLHttpRequest();
        }
    }
    theHttpRequest.onreadystatechange = function() {processAXAH(elementContainer);};
    theHttpRequest.open("GET", url);
    theHttpRequest.send(false);

    function processAXAH(elementContainer){
    if (elementContainer!='status')
    
    {
        
        if (theHttpRequest.readyState == 4) {
            if (theHttpRequest.status == 200) {
                //document.getElementById(elementContainer).innerHTML = theHttpRequest.responseText;
                insertText(theHttpRequest.responseText);
            } else {
                alert('Данные недоступны!');
            }
        }
    }
    
    }
}
function insertText(text) {
document.getElementById('text').innerHTML = text;
    //alert(text);
}

setInterval("getAXAH('файл.php');", 1000);
</script>


и подгружаемая страница с js ( наш файл.php)

Код

<?
получаем данные.....
...........................
if ($r==$ru)
{
echo '
<script>
alert ("Сообщение......");
</script>
';
}
?>


Нужно каким нибудь методом образом сделать чтоб этот алерт выполнялся и выводилось сообщение......
Какие будут соображения?

Автор: EmilRegis 15.4.2010, 05:42
а чем alert(text); не устраивает?

Автор: DeMONiZ 15.4.2010, 10:12
Цитата(EmilRegis @ 15.4.2010,  05:42)
а чем alert(text); не устраивает?

Что вы имеее ввиду, возможно вы не поняли вопрос.

Опишу все подробнее.
Есть php страница она подргружается аяксом (скрипт выше) через setInterval c частотой в 1 секунду.
Это нужно для того чтобы видеть изменения информации без перезагрузки страницы.
Когда соответствующая информация на странице удовлетворит условие мне нужно выести текст алертом так сказать оповестить пользователя о том что условие удовлетворяется.

JS код на подгружаемой стрнице не выполняется и нужно сделать чтоб он выполнялся.

Автор: EmilRegis 15.4.2010, 11:47
Ну вообще говоря думаю php не подгружается, а выполняется на сервере...а то, что php выплёвывает в виде echo - возвращается в callback - функцию...поэтому думаю правильно будет в php написать условие и выплёвываемый результат 
Код

<?
получаем данные.....
...........................
if ($r==$ru)
{
echo 'Сообщение......';
}
?>

а в callback выводить уже алерт
Код

function insertText(text) {
    alert(text); -- тут text - ваше пэхэпэшное сообщение
}

Автор: skyboy 15.4.2010, 12:14
у jQuery есть метод http://api.jquery.com/jQuery.getScript/, можешь использовать или посмотреть, как там реализовано.
но, если ты планируешь, что этот подгружаемый скрипт будет перестраивать что-то на твоей странице, которая этот скрипт подгружает, я бы все же рекомендовал передавать только данные(XML, json, простой текст), так, чтоб решение о замене/удалении блоков принимал один и тот же код на основании пришедших данных. а не загружаемое творило, что "придет в голову". проще контролировать все же.

Автор: DeMONiZ 15.4.2010, 12:15
Данное ршение не подойдет,  у меня данных много вывдится.
Привожу пример:


выводится из базы циклом информация в таблице например 15 разных имен 

Код


<tr>
<td>Имя</td><td>Время</td>
</tr>

<tr>
<td>Имя_2</td><td>Время</td>
<tr>




Первая ячейка содежит имя вторая время.

в цикле есть условие если время текущее совпадает с временем выводимым из базы  то и должен выходить alert


Автор: DeMONiZ 15.4.2010, 12:43
Правильно сформулировать надо так "Подгрузка через AJAX HTML-кода, содержащего JavaScript"

Автор: EmilRegis 15.4.2010, 12:49
может всё таки кесарю кесарево, а джаваскрипту джаваскриптовое?
Цитата
так, чтоб решение о замене/удалении блоков принимал один и тот же код на основании пришедших данных. а не загружаемое творило, что "придет в голову". проще контролировать все же.

то есть получаете дажнные с сервера и уже в скрипте их обрабатываете как надо...в чём проблема то? или если у вас что-то специфичное, то приведите  более подробный пример

Добавлено через 6 минут и 53 секунды
если всё правильно понял, то надо просто в коллбек-функции пройтись по таблице и сравнивать текущее время с тем, что в ячейке таблицы, а если произошло совпадение - то выводить алерт, пришедший от сервера

Автор: DeMONiZ 15.4.2010, 13:01
Что то вроде этого я имел ввиду:

http://www.realcoding.net/articles/podgruzka-cherez-ajax-html-koda-soderzhashchego-javascript.html

Автор: DeMONiZ 15.4.2010, 13:26
Осталось только грамотно внедрить их код в мой.....

Автор: cha0t1k 15.4.2010, 13:33
Что Вас ограничивает использовать методы jquery get() post() ? Они корректно подгружают в пространство имен весь джаваскрипт в тегах <script> в получаемом через AJAX HTML.  Но с некоторыми проблемами столкнетесь. Из этого джаваскрипта будет недоступен весь джаваскрипт более верхнего уровня. 
Но вообще это плохая практика. Лучше получать чистый JS, либо чистый HTML. А для серьезных клиентских приложений практика получения AJAX'ом HTML'а не подходит. Лучше JSON. 

Автор: DeMONiZ 15.4.2010, 13:46
cha0t1k а пример можно чтоб работал с моим выше представленом коде? чтоб брал регуляркой вырезал весь код между <script> </script> обрабатывал его и засовывал в head. сейчс мне не важно как мне важно чтоб работало потому что времени осталось часа 2 на ешение этой проблемы у самого не выходит...

Автор: cha0t1k 15.4.2010, 13:51
Я так подгружал HTML используя jquery. И больше стараюсь так не делать. Когда проект разрастается, сложно поддерживать. Сейчас пишу с разделением логики и представления клиентскую часть. 
Если надо решить быстро, просто заюзай jquery. За два часа ты успеешь разобраться как работать в нем с AJAX.
http://jquery.com

Автор: IDVsbruck 15.4.2010, 14:12
Не стал подробно читать все посты, но так понял, что проблема не решена и она заключается в том, что скрипт, подгруженный динамически, автоматом не подгружается.
Уже давно пользуюсь jQuery, там это уже решено и отлично работает, но покопался в архивах и нашел старую реализацию:
Код
function run_script(_div) {
    var divContent = _div.childNodes;
    for (var i = 0; i < divContent.length; i++) {
        requestItem = divContent.item(i);
        if (requestItem.tagName)
            if (requestItem.tagName.toUpperCase() == 'SCRIPT') eval(requestItem.text);
        else run_script(requestItem);
    }
}

Это callback запроса. Если в ответе сервера встречается script, то он должен выполниться.

Автор: DeMONiZ 15.4.2010, 14:35
А пример работы этой функции есть? что то у меня не работает.....(( 

Автор: DeMONiZ 17.4.2010, 10:59
сделал такую функцию 

Код

function insertText(text) {
document.getElementById('text').innerHTML = text;
var result = text.match(/<script>(.*)<\/script>/im);
if(result) eval(result[1]);
}



алерты стали работать, а вот сетинтервал если попался на подгржаемой станице то он не выполняется подскажите почему? и как этого избежать?

Автор: DeMONiZ 17.4.2010, 12:24
Подгружающий код:

Код



<script>
function getAXAH(url,elementContainer) {
    var theHttpRequest = false;
    try {
        theHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e) {
        try {
            theHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
        } catch(e) {
            theHttpRequest = new XMLHttpRequest();
        }
    }
    theHttpRequest.onreadystatechange = function() {processAXAH(elementContainer);};
    theHttpRequest.open("GET", url);
    theHttpRequest.send(false);

    function processAXAH(elementContainer){
    if (elementContainer!='status')
    
    {
        
        if (theHttpRequest.readyState == 4) {
            if (theHttpRequest.status == 200) {
                //document.getElementById(elementContainer).innerHTML = theHttpRequest.responseText;
                insertText(theHttpRequest.responseText);
            } else {
                alert('Данные недоступны!');
            }
        }
    }
    
    }
}
function insertText(text) {
document.getElementById('text').innerHTML = text;
var result = text.match(/<script>(.*)<\/script>/im);
if(result) eval(result[1]);
}


setInterval("getAXAH('go.php');", 5000);
</script>

    <div id="text"></div>


и подгржаемый код:

Код

<span id='ti'>15</span>
<script>var d = document.getElementById('ti'); setInterval('d.innerText--;', 1000);</script>


если запустить код go.php все работает. если подгржать аяксом не работает. Может быть я и не прав но мне кажется что в результате код просто не видит <span id='ti".$j."'> и собственно не может менять содержимое блока.

Может как то надо зарегистрировать объект или еще что нибудь кто знает?

Автор: Любитель 18.4.2010, 21:44
Выполняется твой скрипт (я не проверял - но предполагаю). Проблема в том, что d у тебя вовсе не глобальная переменная, а setInterval, если ему передать строку - будет эвалютить это в глобальном контексте. Именно поэтому jQuery для выполнения скриптов использует маленький трюк (по сути всё сводится к созданию элемента script в DOM-дереве и добавлении с помощью appebdChild).

Добавлено через 1 минуту и 15 секунд
Код из jQuery, если что:
Код

// Evalulates a script in a global context
    globalEval: function( data ) {
        if ( data && /\S/.test(data) ) {
            // Inspired by code by Andrea Giammarchi
            // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
            var head = document.getElementsByTagName("head")[0] || document.documentElement,
                script = document.createElement("script");

            script.type = "text/javascript";
            if ( jQuery.support.scriptEval )
                script.appendChild( document.createTextNode( data ) );
            else
                script.text = data;

            // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
            // This arises when a base node is used (#2709).
            head.insertBefore( script, head.firstChild );
            head.removeChild( script );
        }
    }

Автор: DeMONiZ 19.4.2010, 09:55
Как его связать с моим кодом? я с jQuery не работал да и яву саму недавно изучать начал..?
В долгу не останусь очень надо!

Автор: Любитель 19.4.2010, 14:10
Мм.. Ну собственно это функция для выполнения кода в глобальном контексте. jQuery.support.scriptEval определяется один раз, в лоб (если отработает appendChild для текстового узла и скрипта - поддерживается, нет - используется проперти text).

Автор: DeMONiZ 19.4.2010, 14:36
Ладно попытаюсь сам если ни чего не выйдет, то снова напишу....

Автор: DeMONiZ 19.4.2010, 14:56
Все же давайте подробнее опишем что куда какой функции передавать на прмере вашего кода и моего. или я что то не так сделал (скорее всего ) или я не знаю в чем дело уже :-(

Автор: DeMONiZ 19.4.2010, 16:13
Сделал без всяких там квери:

Код

Ля ля ля ля ля ля <br />
<span id='ti'>15</span>
<script>setInterval('document.getElementById(\'ti\').innerText--;', 1000);</script>
<br />Ля ля ля ля ля ля 

Вроде такая ернуда а ни кто не догадался...

Автор: Любитель 19.4.2010, 17:50
Блин, я же писал изначально в чём дело smile
Понятно, что если весь подгружаемый код будет контекстнонезависимым - то будет работать и через ужасный ивал..
Я просто привёл код, как делается выполнение любого кода в глобальном контексте в "правильных" фреймворках.

Автор: DeMONiZ 19.4.2010, 20:44
Да я просто тебя не понял слегка. Сейчас регулярку надо переделать она у меня на один скрипт только евалит, а у меня их штук 16 может быть.

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