2011-02-11 36 views
1

我有一个主页,将其称为Main.php。在这个页面上,是一个按钮,当点击它时,会使用Results.php的结果设置div的innerHTML(已经在Main.php上,名为divResults)。javascript XMLHttpRequest打开php文件并执行更多javascript

当调用Results.php时,返回的HTML“这些就是结果”被正确接收并设置为Main.php上divResults的内容。但是,不会执行任何来自Results.php的JavaScript。作为一个例子,我试图做一个简单的window.alert。下面是示例代码:

Main.php链接按钮,开始动作:

<img src="$MyImageSource" onclick=\"ExpandDropdownDiv()\" /> 

Main.php javascript函数ExpandDropdownDiv():

function ExpandDropdownDiv(){ 

    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) */ 
     { 
      document.getElementById("divResults").innerHTML=xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("GET","Results.php",true); 
    xmlhttp.send(); 

} 

Results.php代码例如:

<script type="text/javascript"> 
    alert("Success"); 
</script> 
These Are The Results 

------------------编辑 - 更新------------------

来自Results.php的简单警报就是一个例子。如果我能够得到这个工作,我相信我可以自己解决我剩下的问题。不过,我注意到有一些评论建议在我设置div的innerHTML后,将警报放在Main.php的javascript中。所以,让我解释一下,在div设置后,我真的想用javascript来做什么。显示一些正常的“选择”html元素,这些元素已经使用jquery和下拉列表扩展名(.js)进行了转换。当用户点击最下面的彩色向下箭头时,div展开,(图片2),并在这个其他.php文件中生成两个“选择”元素... html被返回,并放置在div 。因此,我不需要重新加载整个页面,并且可以将新的选择下拉框放置在现有的下拉菜单下方。

的问题是,以“改造”这些正常选择元素,有一些JavaScript需要进行针对HTML执行:

$(document).ready(function() { 
    $(".MultiSelect").dropdownchecklist( {firstItemChecksAll: true, maxDropHeight: 300 , searchTextbox: true, width: 100, textFormatFunction: function(options) { 
     var selectedOptions = options.filter(":selected"); 
     var countOfSelected = selectedOptions.size(); 
     var size = options.size(); 
     switch(countOfSelected) { 
     case 0: return "All"; 
     case 1: return selectedOptions.text(); 
/*  case size: return "All"; */ 
     default: return countOfSelected + " selected"; 
     } 
    } 
    } 
    ); 
} 

所以,不知何故,我需要能够对执行JavaScript的从其他.php文件生成的HTML。只需调用上面的代码,在我的div内容被填充之后,只重新生成已经存在的下拉菜单,而不是两个新的下拉菜单。

实施例图像

enter image description here

enter image description here

+0

为什么不只是把警报(“成功”);里面的阿贾克斯回调? – kjy112 2011-02-11 16:09:07

+0

@ kjy112 - 你能给我一个例子,我会尝试吗?我几乎没有得到这个代码的工作,甚至没有完全理解它 – Adam 2011-02-11 16:13:27

+0

最简单方法去了解它亚当是不嵌入在您的PHP中的JavaScript,而是在您将ajax回调函数注入php结果后执行JavaScript。 – kjy112 2011-02-11 16:51:18

回答

6

这是一个良好的阅读是了解你在做什么:Eval embed JavaScript Ajax: YUI style

使你的代码工作,使用eval();但它不推荐用于各种原因:

让我们把你的PHP和修改它是这样的:

<script type="text/javascript"> 
    function result() { 
     alert("Success"); 
    } 
</script> 
These Are The Results 

,这是从AJAX回调函数。结果();不会执行,因为它没有得到评估,因此不存在。这是你的情况

if (xmlhttp.readyState==4)/* && xmlhttp.status==200) */ 
     { 
      document.getElementById("divResults").innerHTML=xmlhttp.responseText; 
      result(); // this function is embedded in the responseText 
         // and doesn't get evaluated. I.e. it doesn't exist 
} 

为了使浏览器识别result();你必须在所有的JavaScript语句在脚本标记,你注入的div与id divResults做一个eval();

if (xmlhttp.readyState==4)/* && xmlhttp.status==200) */ 
     { 
      document.getElementById("divResults").innerHTML=xmlhttp.responseText; 
      var myDiv = document.getElementById("divResults"); 
      var myscripz = myDiv.getElementsByTagName('script'); 
      for(var i=myscripz.length; i--;){ 
        eval(myscripz[i].innerHTML); 
      } 
      result(); //alerts success 
} 

简单的办法:

我会做它基本上是从PHP中删除JavaScript和显示内容最简单的方法,和回调后,刚刚做的JavaScript其余的回调函数中 PHP:

echo 'These Are The Results'; 

的JavaScript:

xmlhttp.onreadystatechange=function() 
{ 
    if (xmlhttp.readyState==4)/* && xmlhttp.status==200) */ 
    { 
     document.getElementById("divResults").innerHTML=xmlhttp.responseText; 
     alert('success'); // or whatever else JavaScript you need to do 
    } 
} 
0

尝试从结果包裹的JavaScript代码。PHP的功能并将其插入等之后叫它:

<script type="text/javascript"> 
    function result() { 
     alert("Success"); 
    } 
</script> 
These Are The Results 

if (xmlhttp.readyState==4)/* && xmlhttp.status==200) */ 
    { 
     document.getElementById("divResults").innerHTML=xmlhttp.responseText; 
     if(result) result(); 
    } 
0

你results.php需要是这样的......

echo 'eval("function results() { alert(\'success\'); }");'; 

然后调用结果函数。