解决。 我将代码更改为:
function init() {
//preloadImages();
getContent('events', 'events');
getContent('content', 'main');
}
function loadingScreen(start) {
var loadingSpan = document.getElementById('loading');
if (start == true) {
loadingSpan.innerHTML = '<p>Loading...<br><img src="images/loading.gif"></p>';
}
else {
loadingSpan.innerHTML = '';
}
}
function getContent(what, where) {
if (what == 'content') {
loadingScreen(true);
var ranLoad = true;
}
var toSet = document.getElementById(what);
var location = "content/" + where + ".txt";
var request = new XMLHttpRequest;
request.open("GET", location, true);
request.onreadystatechange = function(){
if (request.readyState == 4 && request.status == 200){
toSet.innerHTML = request.responseText;
if (ranLoad==true){
loadingScreen(false);
}
}
}
request.send(null);
}
window.onload = init;
tl; dr或啰嗦 - 请参阅下面的代码和结果。
因此。我正在为朋友建立一个小网页,我决定尝试一种技术,而不是直接在网页上写内容,我将使用XMLHttpRequest检索内容(在同一个域中),并将它们放在内容中,当人们点击不同的锚时,它将通过javascript更新。 好吧,我遇到了一个路障。 当我创建获取内容的函数(setEvents和setContent)时,它创建一个变量并调用一个函数来设置变量(getMarkup),当调用该函数并执行return语句时,它返回undefined。我发现了一个类似的线程,但他们的解决方案是在getMarkup函数中直接添加innerHTML语句。我不想那样做。
以下是代码和结果:
编辑:Esailija建议我刚刚发布了代码。对我而言,拍摄图像有点容易,但现在是:
function init() {
//preloadImages();
setEvents();
setContent('main');
}
function setEvents() {
var eventDiv = document.getElementById("events");
var eventContent = getMarkup("content/events.txt");
eventDiv.innerHTML = eventContent;
}
function setContent(which) {
loadingScreen('start');
var contentDiv = document.getElementById('content');
location_ = "content/" + which + 'txt';
//var contentContent = getMarkup('location');
//contentDiv.innerHTML = contentContent;
loadingScreen('stop');
}
function loadingScreen(action) {
var loadingSpan = document.getElementById('loading');
loadingSpan.innerHTML = "Test";
if (action == 'start') {
loadingSpan.innerHTML = '<p>Loading...<br><img src="images/loading.gif"></p>';
}
if (action == 'stop') {
loadingSpan.innerHTML = '';
}
}
function getMarkup(where) {
var filerequest = new XMLHttpRequest();
filerequest.open("GET", where, true);
filerequest.onreadystatechange = function() {
if (filerequest.readyState == 4 && filerequest.status == 200) {
var test = document.getElementById("events");
var reply = filerequest.responseText;
//Doesn't work
return reply;
//Works just fine
//test.innerHTML = reply;
}
};
filerequest.send(null);
}
window.onload = init;
当我执行innerHTML而不是return时,它显示“Test TEST ”,当我返回而不是innerHTML时,它显示为“undefined”。
我真的不想做innerHTML的一部分,所以有没有办法使返回语句有效?
答案 0 :(得分:0)
你熟悉回调吗?打开Firebug并在return reply;
行上放置一个断点 - 注意调用堆栈。您拥有return reply;
的功能不是getMarkup
。
基本上你将不得不重新调整你的代码。我会让getMarkup接受一个额外的参数 - 你要设置其innerHTML值的DOM元素。
答案 1 :(得分:0)
似乎你不太明白ajax是如何运作的
调用getMarkup
函数后,发送ajax请求并告诉浏览器在onreadystatechange
之后使用该函数来处理回复。所以实际上当回复回来时,不是像setContent
这样的其他函数调用该处理程序而是浏览器。这就是回报不起作用的原因。
当您拨打var contentContent = getMarkup('location');
之类的内容时,由于getMarkup
没有明确的返回值,因此默认情况下contentContent
会获得undefined
。您可能认为它应该在您的匿名函数中获得返回值,但事实并非如此。 getMarkup
函数立即返回,但只有在ajax响应到来时才会调用处理程序。
如果你想做得那么好,你将不得不做一些额外的事情:你只有一个像你一样的ajax处理程序。一旦调用ajax函数的函数将其回调注册到队列中,并且当响应返回时,弹出队列并随后更新值。这需要一些时间来构建此机制,或者您可能需要检查jQuery Ajax Queue的工作方式。