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

时间:2011-11-25 17:43:30

标签: 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);
    }

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

    setTimeout('showpart2()',15000);

}

showpart2();

4 个答案:

答案 0 :(得分:0)

您需要实际评估JS标记(手动,通过eval或通过DOM插入)。像jQuery这样的库会为你做这个,但是如果你需要使用自定义解决方案,你也需要添加它。

答案 1 :(得分:0)

你写道:

  

xmlhttp.responseText.getElementById( '第2部分')

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

答案 2 :(得分:0)

像Adam Rackis一样,我建议你使用$ .ajax真的很容易尝试它.....但如果它不适合你,这里是一个函数,用于在进行ajax调用时使用,并在IE和Firefox中工作,Chrome如果你不能使用Jquery,我建议你。 您的函数中的问题在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;
}

答案 3 :(得分:0)

示例代码的一个大问题是使XMLHttpRequest.send同步意味着所有JS执行必须在等待接收请求时暂停。没有理由不使用异步调用。

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

f1();
f2();
async();
f3();
f4();

成:

f1();
f2();
async(function() {
    f3();
    f4();
});

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

还有一些改进。首先,添加错误检测。 XHR实例的status属性保存HTTP状态,您可以使用它来检查错误。

正如其他一些人所提到的那样,eval可能会有问题,如果有其他选择,应该避免使用eval。首先,您必须确保字符串来自可信来源。这里eval的特殊问题是脚本在与eval的调用相同的上下文中进行评估。如果eval发生在函数内部,则脚本定义的任何内容在函数外部都不可见。如果您的脚本不需要定义任何内容(并且永远不需要定义任何内容;始终考虑代码的未来),则可以使用globaleval。否则,动态创建一个脚本元素,并将脚本作为内容添加到文档中;您可以定义执行此操作的函数(请参阅下面示例中的xmlhttp)。

setTimeout是一个global变量,这很糟糕。相反,将其声明为局部变量。

而不是用于一次性调用的setTimeout,而是使用setInterval,它会定期调用传递的函数。请注意,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(); 可能需要比给定的延迟更长的时间来运行,但这不应该是一个问题。

{{1}}

如果你不关心自己实现所有这些,请让jQuery做繁重的工作。知道如何自己做事很好,但(对于生产代码)使用带有标准接口的标准库可以通过多种方式加速开发。

另见