Выполнение javascript-скрипта после загрузки ajax-страницы – не работает

Я пытаюсь получить страницу с AJAX, но когда я получаю эту страницу, и она включает в себя код Javascript – она ​​не выполняет ее.

Зачем?

Простой код на моей странице ajax:

<script type="text/javascript"> alert("Hello"); </script> 

… и он не выполняет его. Я пытаюсь использовать API Карт Google и добавлять маркеры с помощью AJAX, поэтому, когда я добавляю один, я запускаю страницу AJAX, которая получает новый маркер, сохраняет его в базе данных и добавляет маркер «динамически» к карте.

Но так как я не могу выполнить одну функцию javascript таким образом, что мне делать?

Являются ли мои функции, которые я определил на странице, заранее защищены или закрыты?

** ОБНОВЛЕНО С ФУНКЦИЕЙ AJAX **

 function ajaxExecute(id, link, query) { if (query != null) { query = query.replace("amp;", ""); } if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { if (id != null) { document.getElementById(id).innerHTML=xmlhttp.responseText; } } } if (query == null) { xmlhttp.open("GET",link,true); } else { if (query.substr(0, 1) != "?") { xmlhttp.open("GET",link+"?"+query,true); } else { xmlhttp.open("GET",link+query,true); } } xmlhttp.send(); } 

** Решение Деукалиона **

 var content = xmlhttp.responseText; if (id != null) { document.getElementById(id).innerHTML=content; var script = content.match("<script[^>]*>[^<]*</script>"); if (script != null) { script = script.toString().replace('<script type="text/javascript">', ''); script = script.replace('</script>', ''); eval(script); } } 

и на некоторых событиях я должен был в сценарии addevent listeners вместо того, чтобы просто делать «select onchange =» executeFunctionNotIncludedInAjaxFile (); «Мне пришлось добавить addEventListener (« change », functionName, false) для этого. В скрипте, который оценивается.

Когда вы обновляете свою страницу, делая что-то вроде установки innerHTML контейнера для некоторого обновленного контента, браузер просто не будет запускать в нем скрипты. Вы можете найти теги <script> , получить их innerHTML (IE может предпочесть innerTEXT ), а затем eval() сами скрипты (что в значительной степени является тем, что делает jQuery, хотя оно находит скрипты с регулярным выражением перед обновлением DOM).

Используйте эту функцию:

 function parseScript(_source) { var source = _source; var scripts = new Array(); // Strip out tags while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) { var s = source.indexOf("<script"); var s_e = source.indexOf(">", s); var e = source.indexOf("</script", s); var e_e = source.indexOf(">", e); // Add to scripts array scripts.push(source.substring(s_e+1, e)); // Strip from source source = source.substring(0, s) + source.substring(e_e+1); } // Loop through every script collected and eval it for(var i=0; i<scripts.length; i++) { try { eval(scripts[i]); } catch(ex) { // do what you want here when a script fails } } // Return the cleaned source return source; } 

затем выполните parseScript(xmlhttp.responseText); когда вы заменяете / добавляете контент.

В случае, если некоторые другие люди наткнутся на этот старый поток, есть одна проблема с принятым ответом Deukalion, есть одна проблема, которая, возможно, была упущена: как написано, сценарий ищет только первый тег скрипта. Если существует несколько тегов сценариев, все остальные игнорируются.

Несколько мелких изменений позволят решить проблему. Измените одну строку:

  var script = content.match("<script[^>]*>[^<]*</script>"); 

Для того, чтобы:

  var script = content.match(/<script[^>]*>[^<]*<\/script>/g); 

И еще один:

  script = script.toString().replace('<script type="text/javascript">', ''); 

Для того, чтобы:

  script = script.join("").replace(/<script type="text\/javascript">/g, ''); 

Теперь он соберет весь код <script> и выполнит их в порядке, указанном на странице. В противном случае это было отличное решение.

После запроса AJAX вы можете сделать функцию «on success», которая может взять возвращенный html и что-то сделать с ним. Тогда что-то будет выполнено.

Если бы был пример кода, я мог бы предоставить кодовое решение ситуации. Но используя только стандартный xmlhttprequest, можно было бы сделать следующее:

 xhr = new XMLHttpRequest(); xhr.open("GET","ajax_info.txt",true); xhr.onreadystatechange=function() { if (xhr.readyState==4 && xhr.status==200) { document.getElementById("myDiv").innerHTML = xhr.responseText; } } xhr.send();​