Я пытаюсь получить страницу с 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();