JavaScript, возвращенный AJAX, не работает. Как работать с JavaScript? - PullRequest
0 голосов
/ 15 декабря 2009

это моя страница Test1.asp

<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
<script type="text/javascript">
function Alex()
{
var xmlHttp;
try
  {  
  xmlHttp=new XMLHttpRequest();  }
catch (e)
  { 
   try
    {    
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");   
     }
  catch (e)
    {   
     try
      {     
       xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
          }
    catch (e)
      {      
      alert("Your browser does not support AJAX!");      
      return false; 
           }    
           } 
            }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.getElementById("Alex").innerHTML =xmlHttp.responseText;//Get Google Destination Map 
      }
    }
    xmlHttp.open("GET","Test2.asp" ,true);
    xmlHttp.send(null); 
   }
</script>
</head>

<body>
<div id ="Alex"></div>
<label onclick="Alex()" >ssss</label>
</body>
</html>

Это запрашиваемая страница Test2.asp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>New Page 1</title>
</head>
<body>
<div id="Mathew"></div>
</body>
<script type="text/javascript" >
{
document.getElementById("Mathew").innerHTML='ajax is working';      
}
</script>
</html>

На странице (Test2.asp) не работает javascript

Как мне вызвать test2.asp к моему test1.asp с помощью ajax

Ответы [ 6 ]

1 голос
/ 15 декабря 2009

В HTML, вставленном Javascript, не выполняется автоматически (по крайней мере, в IE наверняка). Единственное решение - собрать каждый из блоков скрипта в загруженном HTML и оценить их каждый.

EDIT

Я использую YUI здесь ... класс Dom может собирать все теги скрипта из данного блока.

var domElement = document.getElementById("Alex");
var scriptBlocks = YAHOO.util.Dom.getElementsBy(function() {return true;},'script',domElement);
for (var i = 0 ; i < scriptBlocks.length ; ++i){
    eval(scriptBlocks[i].innerHTML);
}

Все просто. Также будьте осторожны с Internet Explorer ... если вы загружаете в HTML, используя ajax, и он возвращается с блоком скрипта в качестве одного из первых элементов, он по какой-то странной причине проигнорирует блок скрипта и не включит его в ответ , Чтобы исправить это, поместите div над блоком скрипта с текстом в нем с атрибутом стиля display: none;

Если этот HTML-код возвращен в IE, он не будет включать блок сценария в ответ

<div>
   <script type="text/javascript">
     /* Some javascript */
   </script>
</div>

Это решит проблему

<div style="display:none;">some text</div>
<div>
   <script type="text/javascript">
     /* Some javascript */
   </script>
</div>

Очень странно, но вот как IE катится.

0 голосов
/ 16 декабря 2009

Прототип имеет хороший способ справиться с этим. См. Их stripScripts , extractStrips и evalScripts методы для объекта String. Если вы просто удалите сценарии, поместите свой текст в div, а затем в evalScripts, это сработает для всех brwosers, поэтому сценарии выполняются ровно один раз.

0 голосов
/ 15 декабря 2009

Ваша методология немного ошибочна. Как правило, AJAX используется для отправки и получения данных в форматах, отличных от HTML, таких как XML, JSON или иногда даже CSV (однако HTML иногда возвращается клиенту, но обычно в виде фрагментов страницы , а не целые страницы, как в вашем примере).

Логика передается редко и обычно поддерживается на соответствующих сторонах передачи. Другими словами, сторона клиента / запроса имеет всю свою собственную логику и уже знает, что делать с данными, возвращаемыми со стороны сервера / ответа (которая также не принимает или не требует никакой логики, сгенерированной со стороны клиента). Кроме того, использование eval, которое обычно необходимо для последовательного выполнения логики, найденной в ответе, обычно осуждается на и считается плохой практикой , таким образом, высказывание "eval это зло".

В некоторых случаях может быть необходимо, выгодно или просто проще получать логику как часть ответа от сервера. Однако в этих ситуациях все еще считается лучшей практикой отделять ваши данные от вашей логики.

Все это, чтобы приятно сказать, что вы делаете это неправильно. Я рекомендую вам прочитать о том, как работает AJAX и как его лучше использовать: w3schools , Введение в Mozilla MDC , AJAX и обработка XML , обновление страницы (похоже на то, что вы пытаетесь сделать) и, наконец, документы AJAX API для jQuery , Prototype и Dojo .

0 голосов
/ 15 декабря 2009

Добавление элемента <script> в документ через innerHTML не (*) не выполняет его содержимое в виде скрипта.

Вы также пытаетесь вставить весь HTML-документ, включая <html>, <head> и <body> внутри <div>, что совершенно недопустимо.

Если вам нужно вернуть и HTML, и какой-то скрипт для выполнения, лучше вернуть объект JSON, например ::

{
    "html": "<div id="Mathew"></div>",
    "js": "document.getElementById(\"Mathew\").innerHTML='ajax is working';"
}

, затем проанализируйте объект JSON, установите innerHTML на obj.html и eval на js. (Хотя обычно сомнительно возвращать и выполнять произвольные сценарии, иногда это может быть полезно.)

(*: Да, обычно нет. Точно, когда содержимое элемента <script> выполняется, зависит от браузера. Например, Firefox выполняет скрипт, когда вы добавляете / вставляете DOM HTMLScriptElement или предка в элемент, который является частью документ, в то время как IE выполняет его, когда вы впервые вставляете элемент в любой родительский элемент, будь то внутри документа или нет. В целом, избегайте вставки содержимого JavaScript-in-HTML в HTML.)

0 голосов
/ 15 декабря 2009

По умолчанию JavaScript, содержащийся в ответах AJAX, не выполняется.

Нет смысла создавать обработчик Ajax с нуля, когда эта проблема уже решена в различных библиотеках, таких как jQuery и Prototype.

0 голосов
/ 15 декабря 2009

Используйте абсолютный URI вместо относительного URL.

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