我有这个代码:
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");
}
//...
}