【发布时间】:2016-07-14 03:41:18
【问题描述】:
在最后一行,getElementsByClassName 找不到元素,因为loadhtml 函数是一个 AJAX 调用。
如何使用异步函数或 ES6 生成器或承诺,以使最后一行的 getElementsByClassName 工作?
TotalArticleNumber = 3;
for (let i = TotalArticleNumber; i > 0; i--) {
loadhtml('./article/test' + i + '.md', function(e) {
sdf(i, e);
});
};
function loadhtml(url,callback) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if( xhttp.status == 200){
var response = xhttp.responseText;
(callback)(response);
}
};
};
xhttp.open("GET", url, true);
xhttp.send();
};
function sdf(i, e) {
var node = document.createElement("DIV");
var node1 = document.createElement("A");
var node2 = document.createElement("H1");
var node3 = document.createElement("P");
node.setAttribute('class', 'articleInner');
node1.setAttribute('class', 'openArticle');
node2.setAttribute('class', 'title');
node2.setAttribute('id', i);
node2.innerHTML = e.match(re);
node3.innerHTML = converter.makeHtml(e.replace(re1, ""));
node1.appendChild(node2);
node1.appendChild(node3);
node.appendChild(node1);
document.getElementById('articleContent').appendChild(node);
}
Array.prototype.forEach.call(document.getElementsByClassName('title'), function(item) {
item.addEventListener('click', function() {
document.getElementById('realArticle').style.display = 'block';
document.body.style.background = 'gray';
})
})
【问题讨论】:
-
你需要promisify loadhtml函数或者构建在
fetch之上。 -
可以添加
loadhtml的代码吗? -
为什么不简单地将事件处理程序添加到
node2?您不需要任何getElementsByClassName选择,也不需要在创建所有元素后对其计时。 -
我知道了,只是想尝试一些异步功能。
-
async/await不是 ES7 的一部分。
标签: javascript ajax asynchronous promise ecmascript-next