Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Javascript в Ajax
 
 автор: lors   (25.04.2009 в 00:58)   письмо автору
 
 

Как выполнить javascript полученный динамически из Ajax?

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 12:44)   письмо автору
 
   для: lors   (25.04.2009 в 00:58)
 

ужас какой
eval

  Ответить  
 
 автор: Lors   (25.04.2009 в 13:46)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 12:44)
 

ужас использовать eval

  Ответить  
 
 автор: Lors   (25.04.2009 в 14:03)   письмо автору
 
   для: Lors   (25.04.2009 в 13:46)
 

вернее eval тут совершенно не к месту

function getData3(dataSource,divID)
    {
        if(request3)
            {
                var obj = document.getElementById(divID);
                request3.open("GET", dataSource);
                request3.onreadystatechange = function ()
                    {
                        if (request3.readyState == 4 && request3.status == 200)
                        {
                            obj.innerHTML = request3.responseText;
                        }
                    }
                request3.send(null);
            }
    }    


Javascript генерируется на сервере(вместе с обычным html), а при использовании ajax и innerHTML будет возвращаться просто текст, который браузером не интерпретируется как javascript и все что между "<script language="javascript"></script>" игнорируется вообще. То есть при определенных обстоятельствах на сервере может с генерироваться такой текст(не в head):

<script language="javascript">
    alert('privet!');
</script>

задача в том что бы этот участок браузер понимал как javascript.

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 14:28)   письмо автору
 
   для: Lors   (25.04.2009 в 14:03)
 

а я Вам еще раз говорю, что если Вам нужно выполнить ЭТО, то нужно выкинуть первую и последние строчки и пропустить через eval.

а если не хотите так делать, то придумайте свои флаги, при получении которых будет выполняться соотвествующий JS код.

Вот только нужно ли Вам что первое, что второе...

  Ответить  
 
 автор: Lors   (25.04.2009 в 14:32)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 14:28)
 

можно поподробнее про флаги? есть пример?

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 14:47)   письмо автору
 
   для: Lors   (25.04.2009 в 14:32)
 

ну это зависит от того, что Вы "мутите"...
просто как пример:
в качестве ответа получили Вы, допустим, число, а дальше делаете

switch (myop)
{
  case 1:   func1(param1); break;
  case 1:   func2(); break;
  case 1:   func3(param1,param2,param3); break;
  default: error_func();    
}

причем параметры, также ведь могут быть получены "через AJAX"

  Ответить  
 
 автор: Lors   (25.04.2009 в 14:36)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 14:28)
 

а что будет если выкинуть первую и последую строчки?


eval(alert('privet!'); );


в итоге у нас браузер просто выведет "eval(alert('privet!'); );" .

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 14:43)   письмо автору
 
   для: Lors   (25.04.2009 в 14:36)
 

как это выведет? Вы хоть проверяли то, что написали?
"выведет", если Вы это в html засунете.
А если Вы это сделаете на JS (Вы ведь через него получаете эту злополучную строку:), то будет сообщение!

  Ответить  
 
 автор: Lors   (25.04.2009 в 14:50)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 14:43)
 

Ну так в том то и дело, что я программировал все на php потом поставил все на ajax. Если бы не было ajax страница перезагружалась бы и все что помечено как <script lang..></script> как надо работало бы. Ну дело в том что открытие и чтение php сценариев происходит через Ajax, я выше указал через какую именно функцию (getData) и там текст возвращается как innerHTML,
obj.innerHTML = request3.responseText;    

конечно если кроме скрипта JS в браузер ничего не надо было бы возвращать тогда все можно было бы сделать без проблем, но вместе с обычным html должен вернуться и выполниться JS. по этому возникает данная проблема.

а request3 это у нас:

function requestObj3() 
    { 
        var request3 = null;
        try 
            {
                request3 = new ActiveXObject("Msxml2.XMLHTTP");
                //alert (1);
            } 
        catch (e1)
            {
                try
                    {
                        request3 = new ActiveXObject("Microsoft.XMLHTTP");
                        //alert (2);
                    } 
                catch (e2)     
                    {
                        request3 = false;
                    }
            }
        if (!request3 && typeof XMLHttpRequest != 'undefined') 
          {
            request3 = new XMLHttpRequest();
            request3.overrideMimeType ('text/xml');
            //alert (3);
          }
        else if (window.ActiveXObject)
            {
                request3 = new ActiveXObject ("Microsoft.XMLHTTP");
                //alert (4);
            }
        return request3;
    }
var request3;
request3 = requestObj3();

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 14:55)   письмо автору
 
   для: Lors   (25.04.2009 в 14:50)
 

да уж, это не гуд!
можно, конечно, и тут сделать изврат - типа вытащить содержимое тегов script а потом его выполнить, но лично мне это очень не нравится. Дело ,конечно, Ваше.

я бы посоветовал Вам "перепродумать" всю систему.

  Ответить  
 
 автор: Lors   (25.04.2009 в 15:01)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 14:55)
 

да действительно, искать и вытаскивать содержимое тегов <script></script> не совсем адаптивный подход. Но видимо действительно иного решения просто не существует.

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 14:25)   письмо автору
 
   для: Lors   (25.04.2009 в 13:46)
 

а я, по-Вашему, к чему написал слово "ужас"?
а если Вас интересует не "как выполнить полученный javascript",то пишите по-нормальному

  Ответить  
 
 автор: Lors   (25.04.2009 в 14:30)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 14:25)
 

Искренне прошу меня простить :). Проблема актуальна, находил много обсуждений но не нашел решения.

  Ответить  
 
 автор: PAT   (25.04.2009 в 15:13)   письмо автору
 
   для: Lors   (25.04.2009 в 14:30)
 

Сто и один раз эту проблему уже поднимали на этом форуме.
При этом более половины ответивших в этой ветке, в тех ветках тоже отвечали.
И просто ОБЯЗАНЫ были в тех старых ветках прочитать ПРАВИЛЬНЫЙ ответ.
Но... товарищи у нас - БЕСпамятные (но при этом - очень ЗЛОпамятные)... такой вот парадокс :-)
И отвечать на любой вопрос (совершенно будучи не в теме) - лезут и лезут...


В общем, получив через AJAX строку, содержащую блок <script>...</script>, надо просто в любой тег на станице прописать это дело через innerHTML.
Но предварительно надо в этой строке к тегу <script> добавить "волшебное слово" - атрибут defer, т.е. получить <script defer>...</script>.

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 15:24)   письмо автору
 
   для: PAT   (25.04.2009 в 15:13)
 

да ладно =)
что-то не помню, чтобы я отвечал в какой-то похожей теме и еще вдобавок пропустил правильный ответ

P.S.: и я вообще не злопамятный ;-)

P.P.S: кстати у меня тоже пока не заработало, но вечером обязательно добьюсь до истины...
P.P.P.S: на w3sch написано, что поддерживается только ИЕ, но это тоже еще конечно предстоит проверить...

  Ответить  
 
 автор: Lors   (25.04.2009 в 15:38)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 15:24)
 

ну если что то получиться дайте знать )

  Ответить  
 
 автор: PAT   (25.04.2009 в 21:38)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 15:24)
 

>"на w3sch написано, что поддерживается только ИЕ"

Как раз в ИЕ с этим и возникают проблемы чаще всего.
А в других браузерах работает как часы:
<html>
<head>
<script>
//положим, получили от сервера респонс-текст, содержащий JS-код:
var x = "alert ('YES');\ndocument.body.style.backgroundColor = 'red';";

function myFunc ()
{
var y = document.createElement ('script');
y.defer = true;
y.innerHTML = x;
document.body.appendChild (y);
}
</script>
</head>
<body>
<hr><h1 align="center" onclick="myFunc ()">Click</h1><hr>
</body>
</html>

Если у кого-то возникнет вопрос - "а что делать, если от сервера приходит строка с УЖЕ прописанными <script> и </script>?" - то я буду долго смеяться над этим вопросом.

  Ответить  
 
 автор: ddhvvn   (25.04.2009 в 22:01)   письмо автору
 
   для: PAT   (25.04.2009 в 21:38)
 

хм проверил,
но пока нигде кроме как в ИЕ6-8 не заставил работать..
как нужно прописывать? я пробовал <script defer> и как в w3 <script defer="defer">

а ^пример^ работает везде, кроме ИЕ

  Ответить  
 
 автор: PAT   (26.04.2009 в 00:23)   письмо автору
 
   для: ddhvvn   (25.04.2009 в 22:01)
 

В ИЕ тоже работает, но со своими особенностями. В общем, держите кроссбраузерный код:
<html>
<head>
<script>
//положим, получили от сервера респонс-текст, содержащий JS-код:
var x = "alert ('YES');\ndocument.body.style.backgroundColor = 'red';";

function myFunc ()
{
var y = document.createElement ('script');
y.defer = true;
y.text = x;
document.body.appendChild (y);
}
</script>
</head>
<body>
<hr><h1 align="center" onclick="myFunc ()">Click</h1><hr>
</body>
</html>

  Ответить  
 
 автор: ddhvvn   (26.04.2009 в 13:11)   письмо автору
 
   для: PAT   (26.04.2009 в 00:23)
 

Да, теперь везде работает, спасибо.

  Ответить  
 
 автор: Lors   (27.04.2009 в 13:08)   письмо автору
 
   для: PAT   (25.04.2009 в 21:38)
 

Так можно сделать и вместо eval использовать этот код, для обработки скрипта и внедрения в документ через DOM, взятого из дива.

  Ответить  
 
 автор: Lors   (25.04.2009 в 15:24)   письмо автору
 
   для: PAT   (25.04.2009 в 15:13)
 

к сожалению волшебство у меня не удалось :)

<script defer type="text/javascript">
alert('privet!');
</script>


Вот такой вот innerHTML приходит через ajax, но скрипт не работает.

  Ответить  
 
 автор: Lors   (25.04.2009 в 18:49)   письмо автору
 
   для: Lors   (25.04.2009 в 15:24)
 

defer не везде работает. И у меня не получилось чего то добиться добавлением этого атрибута.
вариант:

function checkReport()
    {
        var scripts = document.getElementsByTagName("script");
        var script;
        for (var i = 0; script = scripts[i]; i++)
            {
               eval(script.innerHTML);      
            }
    }


не работает в IE.

  Ответить  
 
 автор: PAT   (25.04.2009 в 21:42)   письмо автору
 
   для: Lors   (25.04.2009 в 15:24)
 

>"Вот такой вот innerHTML приходит через ajax, но скрипт не работает."

А теги <body>, </body> и <!DOCTYPE> через ваш ajax, видимо, не приходят?
А почему? :-)))

  Ответить  
 
 автор: Lors   (26.04.2009 в 14:54)   письмо автору
 
   для: PAT   (25.04.2009 в 21:42)
 

потому что Ajax я для того и использую что бы не перезагружать всю страницу. Там в коде видно что ajax содержимое скидывается в div. Есть другие варианты?) Ресурс таким образом устроен, что перезагрузки страницы вообще нет, только в одном диве меняется контекст. вот теперь появилось необходимость в зависимости от ответа сервера скидывать в этот див или в другой, потому и надо "серверный" ява скрипт делать читабельным. Я вчера посидел и решил скинуть в невидимый div содержимое js, потом обращаться через getElementById в момент ответа, то есть

if (request3.readyState == 4 && request3.status == 200)
                        {
                            obj.innerHTML = request3.responseText;
                            alert(document.getElementById('t').innerHTML);
                        }


к этому диву и прогонять ЭТО через eval(), вроде как все работает. Время покажет стоило ли изобретать велосипед или нет.))

  Ответить  
 
 автор: PAT   (26.04.2009 в 16:36)   письмо автору
 
   для: Lors   (26.04.2009 в 14:54)
 

eval - самый тормозящий метод изо всех существующих.
Употреблять метод eval любой нормальный программёр считает для себя стыдным.
Это тоже самое, что копаться в песочнице мобильным телефоном (помните анекдот?)

В общем, если не поняли, то объясню на пальцах: не формируйте на сервере теги <script></script>, а передавайте странице только JS-код. Тогда вам не надо будет засовывать в див, потом читать это и эвалировать. Способ создания тега script и обработки в нем полученного с сервера JS-кода смотри выше -
автор: PAT   (26.04.2009 в 00:23)
.

  Ответить  
 
 автор: Lors   (26.04.2009 в 17:41)   письмо автору
 
   для: PAT   (26.04.2009 в 16:36)
 

с сервера приходит не только javascript а еще много, много, много чего другого, причем javascript может приходить, может не приходить. )
автор: Lors   (25.04.2009 в 14:50)


Что касается eval(), то существуют ситуации когда его не использовать нельзя, возможно это и плохо, но с другой стороны, если взглянуть в общем, то использовав eval получается, что общее время загрузки сократилось втрое (в моем случаи), то есть при старой архитектуре все тормозило (почти не тормозило) гораздо сильнее. а теперь тормозит (вообще не тормозит) в 3 раза меньше, тем более что от eval мне всего то надо запустить 1 строку JS. :)

  Ответить  
 
 автор: PAT   (27.04.2009 в 13:58)   письмо автору
 
   для: Lors   (26.04.2009 в 17:41)
 

>"Что касается eval(), то существуют ситуации когда его не использовать нельзя"
НЕТ таких ситуаций.

>"использовав eval получается, что общее время загрузки сократилось втрое"
Бред.

>"от eval мне всего то надо запустить 1 строку JS"
"Наше дело - предложить, ваше дело - отказаться" (с)

  Ответить  
 
 автор: Lors   (27.04.2009 в 18:39)   письмо автору
 
   для: PAT   (27.04.2009 в 13:58)
 

Слишком патетичный ответ. ) Ситуации бывают разные. Вы не понимаете сущности задачи, Ваш метод является только частичным решением проблемы. Он позволяет избежать использования функции eval(), но проблемы заключается не в этом.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования