Php 是否可以使用XMLHttpRequest评估JavaScript代码

Php 是否可以使用XMLHttpRequest评估JavaScript代码,php,javascript,ajax,xmlhttprequest,eval,Php,Javascript,Ajax,Xmlhttprequest,Eval,我试图使用这个AJAX请求调用一个文件,其中一些PHP工作正常,一些JavaScript工作不正常。有什么想法吗 function showpart2(){ if(window.XMLHttpRequest){ xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false); xmlhttp.send(null);

我试图使用这个AJAX请求调用一个文件,其中一些PHP工作正常,一些JavaScript工作不正常。有什么想法吗

function showpart2(){
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false);
        xmlhttp.send(null);
    }

    document.getElementById('part2').innerHTML = xmlhttp.responseText;
    eval(xmlhttp.responseText.getElementById('part2').innerHTML)

    setTimeout('showpart2()',15000);

}

showpart2();

您需要实际评估JS标记(手动,通过
eval
或通过DOM插入)。像jQuery这样的库可以为您做到这一点,但如果您需要使用自定义解决方案,则还需要添加该解决方案。

您可以编写:

xmlhttp.responseText.getElementById('part2')

responseText是一个字符串,没有任何getElementById方法。
您可以使用xmlhttp.responseXML.getElementById(“part2”)或使用字符串方法来提取第二部分。

像Adam Rackis一样,我建议您使用$。ajax确实很容易,请尝试一下……但如果您不选择它,这里有一个在IE和Firefox中进行ajax调用时使用的函数,如果您不能使用Jquery,我建议您使用Chrome。 函数中的问题在IE中不起作用,因为它没有xmlhttprequest对象。 希望这对你有帮助

function newAjaxObject()
{
    var oHttp=false;
    var asParsers=[
         "Msxml2.XMLHTTP.5.0", 
         "Msxml2.XMLHTTP.4.0", 
         "Msxml2.XMLHTTP.3.0", 
         "Msxml2.XMLHTTP", 
         "Microsoft.XMLHTTP"
    ];

    if ( !oHttp && typeof XMLHttpRequest != 'undefined')
    {
        oHttp=new XMLHttpRequest();
    }

 if( !oHttp){
    for (var iCont=0; !oHttp && iCont < asParsers.length; iCont++)
    {
        try
        {
            oHttp=new ActiveXObject(asParsers[iCont]);
        }
        catch(e)
        {
            oHttp=false;
        }
    }
}

   return oHttp;
}
函数newAjaxObject()
{
var oHttp=假;
天冬氨酸变种=[
“Msxml2.XMLHTTP.5.0”,
“Msxml2.XMLHTTP.4.0”,
“Msxml2.XMLHTTP.3.0”,
“Msxml2.XMLHTTP”,
“Microsoft.XMLHTTP”
];
如果(!oHttp&&typeof XMLHttpRequest!=“未定义”)
{
oHttp=新的XMLHttpRequest();
}
如果(!oHttp){
对于(var iCont=0;!oHttp&&iCont
示例代码的一个大问题是使
XMLHttpRequest.send
同步意味着所有JS执行必须在等待接收请求时暂停。没有理由不使用异步调用

异步调用可以提高响应能力,但它们不能提供协调,这意味着任务在需要的数据准备就绪之前无法运行。协调异步代码的标准方法是向异步函数传递一个函数,该函数在执行时执行依赖于数据的其余计算。此函数的技术名称为“continuation”,它只是一个表示从给定点开始的其余计算的函数。也就是说,反过来:

f1();
f2();
async();
f3();
f4();
进入:

因为你传递的是一个延续,这被称为“延续传递风格”。XMLHttpRequest是一种特殊情况,它不是将函数传递给异步函数,而是将其设置为XHR对象上的
readystatechange
事件的侦听器。也就是说,您将continuation分配给
xmlhttp.onreadystatechange

还有一些改进要做。首先,添加错误检测。XHR实例的
status
属性保存HTTP状态,可用于检查错误

正如许多其他人提到的,
eval
可能会有问题,当有其他选择时,应该避免。首先,您必须确保字符串来自可信的源。
eval
的特殊问题是,脚本的计算与调用
eval
的上下文相同。如果
eval
发生在函数内部,则脚本定义的任何内容在函数外部都不可见。如果你的脚本不需要定义任何东西(并且永远不需要定义任何东西;总是考虑你的代码的未来),你可以使用<代码> EVA/code >。否则,以脚本为内容动态创建脚本元素,并将其添加到文档中;您可以定义执行此操作的函数(请参见下面示例中的
globaleval

xmlhttp
是一个变量,这是错误的。相反,将其声明为局部变量

与用于一次性调用的
setTimeout
不同,使用它可以定期调用传递的函数。请注意,运行
setTimeout
setInterval
所需的时间可能超过给定的延迟时间,但这不应成为问题

(function () {
    // keep variable from polluting global namespace
    var showpart2Interval = 0,
        scriptElt = {parentNode: {removeChild: function() {}}};
        
    function globaleval(script) {
        scriptElt.parentNode.removeChild(scriptElt);
        scriptElt = document.createElement('script');
        scriptElt.type = 'text/javascript'
        scriptElt.appendChild(document.createTextNode(script));
        document.body.appendChild(scriptElt);
    }

    function showpart2(){
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false);
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                if (200 <= xmlhttp.status && xmlhttp.status < 300) {
                    globaleval(xmlhttp.responseText);
                } else {
                    // HTTP error
                    ...
                }
            }
        }
        xmlhttp.send(null);
    }
    
    function startShowpart2() {
        if (window.XMLHttpRequest && !showpart2Interval) {
            showpart2();
            showpart2Interval = setInterval(showpart2, 15000);
        }
    }
    function stopShowpart2() {
        clearInterval(showpart2Interval);
        showpart2Interval = 0;
    }
    
    window.startShowpart2 = startShowpart2;
    window.stopShowpart2 = stopShowpart2;
})();

startShowpart2();
(函数(){
//防止变量污染全局命名空间
变量showpart2Interval=0,
scriptElt={parentNode:{removeChild:function(){}};
函数globaleval(脚本){
scriptElt.parentNode.removeChild(scriptElt);
scriptElt=document.createElement('script');
scriptElt.type='text/javascript'
scriptElt.appendChild(document.createTextNode(script));
document.body.appendChild(scriptElt);
}
函数showpart2(){
var xmlhttp=new XMLHttpRequest();
open(“GET”,“atuamae.org/parte2 encomendar.php”,false);
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4){

如果(200我知道这不是一个真正的答案,所以我将把它作为一个注释,但是jQuery,如果你有能力将它添加到你的站点,可以极大地简化你的ajax调用需求。这是可能的。但是使用
eval
,这是一个坏主意。如果响应数据是JavaScript代码,将它放在一个脚本元素中,并将该元素附加到DOM中……你的代码被破坏,您使用同步XHR(这是魔鬼)“不起作用”在一个问题中是一个错误的陈述,请更新它:php文件返回什么?为什么首先要评估它?什么不起作用?。哦,忽略jquery人员。用jquery这么快就解决了它!!!!谢谢你的快速响应!你真是太棒了。这就是我做的:函数showpart2(){$(“#part2”).load('atuamae.org/parte2 encomendar.php');setTimeout('showpart2()',15000);};showpart2();您做得有点不对。由于最新的IE也有
XMLHttpRequest
,您应该首先检查它。此外,如果访问者没有使用IE,您的循环
(function () {
    // keep variable from polluting global namespace
    var showpart2Interval = 0,
        scriptElt = {parentNode: {removeChild: function() {}}};
        
    function globaleval(script) {
        scriptElt.parentNode.removeChild(scriptElt);
        scriptElt = document.createElement('script');
        scriptElt.type = 'text/javascript'
        scriptElt.appendChild(document.createTextNode(script));
        document.body.appendChild(scriptElt);
    }

    function showpart2(){
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET","atuamae.org/parte2-encomendar.php",false);
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                if (200 <= xmlhttp.status && xmlhttp.status < 300) {
                    globaleval(xmlhttp.responseText);
                } else {
                    // HTTP error
                    ...
                }
            }
        }
        xmlhttp.send(null);
    }
    
    function startShowpart2() {
        if (window.XMLHttpRequest && !showpart2Interval) {
            showpart2();
            showpart2Interval = setInterval(showpart2, 15000);
        }
    }
    function stopShowpart2() {
        clearInterval(showpart2Interval);
        showpart2Interval = 0;
    }
    
    window.startShowpart2 = startShowpart2;
    window.stopShowpart2 = stopShowpart2;
})();

startShowpart2();