2014-01-27 41 views
1

使用Ajax,我打电话给一个包含javascript的php文件,但这样,javaScript不起作用。当使用Ajax调用php文件时,php文件中的JavaScript不起作用

main.html文件在这里给出。它只是使用Ajax调用一个名为test1.php的php文件来更新客户端的所有页面。

<!DOCTYPE html> 
<html> 
<body> 
     <!-- run php file to fill the page --> 
     <script> 
      var xmlhttp = new XMLHttpRequest(); 

      xmlhttp.onreadystatechange=function() 
      { 
       if (xmlhttp.readyState==4 && xmlhttp.status==200) 
       { 
        document.body.innerHTML = xmlhttp.responseText;   
       } 
      } 

      xmlhttp.open("GET","test1.php",true); 
      xmlhttp.send(); 
     </script> 
</body> 
</html> 

而且test1.php文件是非常简单的测试如下:

<p id="demo">Hi there</p> 
<script> 
     document.write("Yes! Hi there");  
     alert('Welcome!'); 
</script> 

现在,只是为了检查test1.php是好的,我把浏览器的URL行:

localhost/test1.php

和一切工作正常,html和js文本显示和一个警告窗口与欢迎词!被展示。

但如果我所说的主网页

本地主机/ main.html中

那么只有HTML文本 '您好' 显示。 JS被忽略。

有人知道这是为什么吗? 感谢

+0

它应该与append一起使用,而不是将它赋予innerHTML。追加将追加作为HTML和js应该执行。昆汀是正确的,该线程有解决方案。 – fray88

回答

0

这里是您可以使用Ajax &,你应该怎么做怎么做3点基本的例子:

主HTML

JS

function ajax(a,b,c){ // Url, Callback, just a placeholder 
c=new XMLHttpRequest; 
c.open('GET',a); 
c.onload=b; 
c.send() 
} 

function changeHTML(){ 
document.getElementById('mytext1').innerHTML=this.response; 
} 

function executeJS(){ 
(new Function(this.response))() 
} 

var array=[]; 
function loadJSON(){ 
array=JSON.parse(this.response); 
updateFields(); 
} 

function updateFields(){ 
for(var a=0,b;b=array[a];++a){ 
    document.getElementById(b.id).textContent=b.data; 
} 
} 

window.onload=function(){ 
ajax('getHTML.php',changeHTML); 
ajax('getJS.php',executeJS); 
ajax('getJSON.php',loadJSON); 
// even if this works you should execute ajax sequentially 
} 

HTML

<div id="mytext1"></div> 
<div id="mytext2"></div> 

getHTML.php

<?php 
echo "<div>i'm html</div>"; 
?> 

getJS.php

<?php 
echo "var a='hello';alert(a);"; 
?> 

getJSON.php

<?php 
$arr=array(array('id'=>'mytext2','data'=>'data')); 
echo json_encode($arr);//json_decode 
?> 
如果你想执行一个JavaScript函数中使用 executeJS功能,并通过有效的

javascript字符串。

EVAL没有必要!


提示:使用JSON可以传递一个功能数据,但作为解析不喜欢在一开始的字符串函数一个很好的技巧就是对JavaScript为Base64转换并返回到一个正常的字符串用JavaScript与atob(base64)和有这样的事情:

function updateFields(){ 
for(var a=0,b;b=array[a];++a){ 
    if(b.func){ 
    (new Function(atob(b.func)))() 
    }else{ 
    document.getElementById(b.id).textContent=b.data; 
    } 
} 
} 

PHP

<?php 
$arr=array(
array('id'=>'mytext2','data'=>'data'), 
array('func'=>base64_encode("alert('jsonfunc')")) 
); 
echo json_encode($arr);//json_decode 
?> 

也许有一些小错误...我现在写了。并不能检查阿贾克斯atm。

如果您有任何问题,只要问!

+0

感谢您的非常详细的教学答案。无论如何,我可以从中学到很多东西。但是对于我出现的具体问题,请根据Krasimir Tsonev的看法回答我的答案。 – user3198805

+0

你读过TIP的部分吗?这解释了如何在同一时间发送HTML和JavaScript。 – cocco

+0

是的。感谢这一点。您提供了几种可用于其他问题的技术,这是一套很好的工具。 – user3198805

0

我想给你insted的使用,你可以使用JavaScript的jQuery阿贾克斯这将是容易和最新的东西阿贾克斯一个建议。

您可以使用$ .ajax函数。你可以当你做一个AJAX调用您联系到服务器的URL使用此功能

+0

如果你正确地读出这个问题,他已经使用ajax –

+0

谢谢,这是正确的,但我想深入纯粹的代码(没有jquery,以了解机制),之后,当然,为什么不。 – user3198805

+0

好的。我只是给你一些关于Ajax新东西的想法。因为这种类型的Ajax是在浏览器不支持jQuery时使用的。 :) –

0

轻松使用JSON。如果你的url在本例中是一个php页面,它将在服务器上执行,并返回到你的AJAX调用它生成的HTML ...现在你可以使用该HTML并使用它进行管理或发布到当前页面DOM。

-AJAX是一个服务器调用执行服务器代码。

内嵌一个PHP页面上

-A script标签是HTML解析,并通过浏览器执行时将执行客户端所包含的代码。

所以......你的代码没有执行,因为它从来没有被称为......你的AJAX调用的响应将完全

<p id="demo">Hi there</p> 
<script> 
    document.write("Yes! Hi there");  
    alert('Welcome!'); 
</script> 

PHP页面执行,并返回到当前的页面text/html的。

如果你想从你的javascript执行客户端代码,你应该在同一个.js文件或其他包含的文件中包含它,但是如果你将它包含在服务器页面上,你需要将浏览器重定向到该页面,如果你用AJAX调用它,代码将不会执行,因为客户端浏览器不会解析它。

0

克拉西米尔Tsonev有克服所有问题的最佳解决方案。他的方法不需要使用eval,所以不存在性能和安全问题。它允许你设置innerHTML字符串包含html和js,并立即将其转换为DOM元素,同时还执行沿代码存在的js部分。简短,简单,并且完全按照您的要求工作。 因此,在这种情况下,来自ajax的响应是根据Krasimir Tsonev转换为DOM对象的src字符串,然后您可以使用它执行的js部分。

var el = str2DomElement(xmlhttp.responseText); 
document.body.innerHTML = el.innerHTML; 

享受他的解决方案:

http://krasimirtsonev.com/blog/article/Convert-HTML-string-to-DOM-element

重要提示:

  1. 你需要用div标签
  2. 你需要用的SRC字符串包装目标元素div标记。
  3. 如果您直接编写src字符串并且它包含js部分,请注意正确编写关闭脚本标记(使用\ before /),因为这是一个字符串。