正在尝试从服务器上的文件异步加载数据.Webhost污染了回声数据,AJAX函数在应该返回的时候返回undefined&


Trying to asynchronously load data from file on server. Webhost pollutes echoed data and AJAX function returns undefined when it shouldn't

我有这个代码:

    var temp = getLevel(0);
    console.log("outside" + temp + "/outside");
    function getLevel(level) {
        var httpRequest, lvlCode;
        if (window.XMLHttpRequest) httpRequest = new XMLHttpRequest(); // most browsers
        if (window.ActiveXObject) httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); // IE8 and older
        httpRequest.open('GET', 'get-level.php', true);
        httpRequest.onreadystatechange = function() {
            if (httpRequest.readyState === 4) {
                lvlCode = httpRequest.responseText;
                console.log("inside" + lvlCode + "/inside");
                return lvlCode; 
            }
        };
        httpRequest.send("lvl=" + level);
    }

控制台返回:

outsideundefinedoutside (index):111
inside<data I want>
<!-- Hosting24 Analytics Code -->
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
<!-- End Of Analytics Code -->
/inside 

这里有两个问题:首先,Hosting24污染了我的回声数据。如何删除Hosting24文本?其次,当temp应该包含与lvlCode完全相同的内容时,为什么它是未定义的?

如何删除Hosting24文本?

你必须手动解析它。(或者,正如在对这个问题的评论中所提到的,使用一个不向网站注入内容的主机。)字符串解析通常是一门不精确的科学。您可以从像这样简单的东西开始,或者从像正则表达式这样更复杂的东西开始。(尽管使用正则表达式进行HTML解析也是一门非常不精确的科学。)


第二,当temp应该包含与lvlCode完全相同的内容时,为什么它是未定义的?

评论中的问题说明了一切。(这有点重复,因为你问了两个问题。)本质上,看看你在做什么:

var temp = getLevel(0);

但是,getLevel函数不会返回任何。由于没有返回任何内容,因此temp自然将是未定义的。一个完全不同的函数,用作异步AJAX调用的匿名回调函数,返回一些东西。但这种回报价值去了哪里?getLevel()在AJAX调用完成之前很久就完成了执行并且不返回任何内容。(因此称为"异步")

您不希望从异步回调函数返回值。相反,您希望执行您的操作以响应这些回调。

因此,取而代之的是:

var temp = getLevel(0);
console.log("outside" + temp + "/outside");
function getLevel(level) {
    //...
    httpRequest.onreadystatechange = function() {
        //...
        return lvlCode;
    }
    //...
}

这样做:

getLevel(0);
function getLevel(level) {
    //...
    httpRequest.onreadystatechange = function() {
        //...
        console.log("outside" + temp + "/outside");
    }
    //...
}