将文件加载到div的innerHTML中,但文件中的javascript无法正常工作

时间:2011-10-18 23:36:07

标签: php javascript ajax innerhtml

我正在将.php文件加载到我创建的div中。 我可以成功地将文件加载到div中,除了javascript之外一切正常。 当我在浏览器中测试文件时,javascript可以正常工作,但是当它被注入我的div时就不行了。

的index.php

<?php
$filename = $_GET["filename"];  
if($filename != ""){        
    $fileData = file_get_contents($filename);
    $fileData = trim($fileData);
    $fileData = str_replace("\n", "", $fileData);
    $fileData = str_replace("\r", "", $fileData);
    echo $fileData;
    die;
}?>

<body>
<script>
function LoadFile(filename, javascriptDiv){
    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){
            javascriptDiv.innerHTML = xmlhttp.responseText;
        }
    }

    xmlhttp.open("GET","index.php?filename="+filename,true);
    xmlhttp.send();
}

var javascriptDiv = document.createElement('div');
javascriptDiv.setAttribute('id', 'javascriptDiv');
javascriptDiv.style.position = 'absolute';  
javascriptDiv.style.top = 50;
javascriptDiv.style.left = 50;
javascriptDiv.style.height = 200;
javascriptDiv.style.width = 300;
javascriptDiv.style.background = '#CCCCCC'; //so we can see that the DIV was created

LoadFile('http://127.0.0.1/Debug/test.php', javascriptDiv);

document.body.appendChild(javascriptDiv); //Display the Window
</script>
</body>

test.php &lt; - 我正在加载到div中的文件

Plain text works
<?php echo "<br>php works <br>"; ?>
<a>html works</a><br>

<script>
function Test(){
    alert('javascript works');
}
</script>

<input type="button" value="Test Javascript" onclick="Test()"/>

以下是我网站上的内容。 index.php

以下是test.php文件的直接链接 test.php

我需要在不改变test.php文件的情况下使用它。

4 个答案:

答案 0 :(得分:0)

当您从AJAX中提取内容时,是否可以解析您包含的任何脚本标记[从我的经验来看,它们非常罕见]

我不建议使用AJAX获取明文/ html,而是建议获取JSON编码信息,然后适当地解析返回的JSON,例如。

new test.php

$html=<<<EOT
<input type="button" value="Test Javascript" onclick="Test()"/>
EOT;
$js=<<<EOT
function Test(){
    alert('javascript works');
}
EOT;
echo json_encode(array('html'=>$html,'js'=>$js));

新的readystatechange函数

xmlhttp.onreadystatechange=function(){
    if(xmlhttp.readyState==4 && xmlhttp.status==200){
     try{
        respJSON = new Object(xmlhttp.responseText);
        javascriptDiv.innerHTML=respJSON.html;
        eval(respJSON.js);
     }catch (e){
        //!!!
     }
    }
}

答案 1 :(得分:0)

我认为你可以在父文档中定义Test函数,或者只是这样:

<input type="button" value="Test Javascript" onclick="alert('javascript works');"/>

在您的子文档中。

答案 2 :(得分:0)

不,你不能用延迟加载来评估标签。

一般来说,我认为允许用户运行自定义JavaScript的想法是一个开放的漏洞。我不确切地知道你想要实现什么以及为什么,但你最好自己创建一组函数并发布一个简单的公共API(例如,获取一个灯箱,为你的元素添加一个'lightbox'类或者那种事情。)

或者,您可以获取标记的内容并运行eval()。但同样,这很危险。

This page很好地解释了您可以用来实现这一目标的不同方法。当然,所有人都假设您正在运行自己的代码而不是某些用户代码。

答案 3 :(得分:0)

使用document.createElement或创建隐藏标记附加任何带有display none的HTML标记,然后将其附加到您的文件中。

像这样:

 var d = document.createElement("hidden");
 div.innerHTML = d + content;

我测试它会正常工作。