Выполнить JavaScript в рамках responseHTML - PullRequest
1 голос
/ 28 июня 2010

При использовании responseHTML с XHR Firefox выполняет сценарии javascript внутри загруженного responseHTML, а хром - нет.если я добавлю скрипт, который будет анализировать и выполнять скрипты, он будет работать с хромом, но в Firefox они выполняются дважды.Любая идея, как узнать, будет ли браузер выполнять загруженные сценарии или нет, кроме как через сниффинг агента?PS: я использую JS-фреймворк, который НЕ является jQuery или Prototype или чем-то еще

Ответы [ 3 ]

1 голос
/ 28 июня 2010

Я уже не первый раз отвечаю на этот вопрос:)

// response is the data returned from the server
var response = "html\<script type=\"text/javascript\">alert(\"foo\");<\/script>html";

var reScript = /\<script.*?>(.*)<\/script>/mg;
response = response.replace(reScript, function(m,m1) {
    eval(m1); //will run alert("foo");
    return "";
});
alert(response); // will alert "htmlhtml"
0 голосов
/ 28 июня 2010

Не используйте responseHTML. Вместо этого используйте responseText и используйте следующую функцию. Функция onSuccess важна для вас. Используйте его в вашем успешном обработчике ajax-запроса.

 function showHtmlInElement(targetId, htmlUrl)  {
    var target = document.getElementById(targetId);
    var Util = jaf.core.Util;
    Util.ajax({
       url: htmlUrl,
       dataType: "text/html",
       // ---------------------------------------------------------------
       onSuccess: function(xhr) {
          var responseText = xhr.responseText;
          target.innerHTML = responseText;
          // collect all the script tag content...
          var scriptText = "";
          var arrScripts = target.getElementsByTagName("script");
          for(var i = 0, len = arrScripts.length; i < len; i++) {
             var se = arrScripts[i];
             scriptText += se.innerHTML;
          }
          if((scriptText = Util.trim(scriptText)).length != 0)  {
             eval.call(window, scriptText);
          }
       },
       // ---------------------------------------------------------------
       onError: function(xhr, code, message) {
          var responseText = xhr.responseText;
          var content = "<p class='error'>" + responseText + ": " 
                       + message + "(" + code + ")</p>";
          target.innerHTML = content;
       }
    });
 }

Я тестировал эту оперу, Firefox, Chromium, Safari. Хотя не проверялось в IE6.

0 голосов
/ 28 июня 2010

Не нюхайте. Тестовое задание. Я не помню механизм точно, когда Mozilla запускает сценарии, но должна быть возможность создать внутренний тест, который определяет, запускаются ли сценарии, и затем исправлять их соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...