1

我有一个主页,称之为 Main.php。在此页面上,是一个按钮,当单击该按钮时,将使用来自 Results.php 的结果设置一个 div 的 innerHTML(已经在 Main.php 上,称为 divResults)。

当调用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 做什么。

图 1显示了一些普通的“选择”html 元素,这些元素已使用 jquery 和下拉检查列表扩展 (.js) 进行了转换。当用户单击底部的彩色向下箭头时,div 展开,(图 2)并在另一个 .php 文件中生成另外两个“Select”元素......返回 html,并放置在 div 中。因此,我不需要重新加载整个页面,并且可以将新的选择下拉菜单放在现有下拉菜单的下方。

问题是,要“转换”这些普通的选择元素,需要针对该 HTML 执行一些 javascript:

$(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";
        }
    } 
    }
    ); 
}

所以,不知何故,我需要能够针对从另一个 .php 文件生成的 HTML 执行 javascript。只需调用上面的代码,在我的 divs innerHTML 被填充后,只会重新生成已经存在的下拉菜单,而不是两个新的下拉菜单。

示例图像

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

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();你必须eval();在你注入到 div 的脚本标签中的所有 JavaScript 语句上执行id divResults

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 并显示内容,在回调之后只需在回调函数 php 中执行其余的 JavaScript:

 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
    }
}
于 2011-02-11T16:29:17.973 回答
0

尝试将 Result.php 中的 javascript 代码包装在一个函数中,并在插入后调用它,如下所示:

<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();
    }
于 2011-02-11T16:09:51.967 回答
0

您的 results.php 需要类似于...

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

然后调用结果函数。

于 2011-02-11T16:31:46.603 回答