Javascript异步调用彼此踩踏

时间:2010-02-20 18:08:26

标签: javascript html

我正在使用AHAH(如此处所述http://microformats.org/wiki/rest/ahah)进行两次调用以在页面上填充HTML。调用在文档准备好之后发生,并且一个接一个地被触发。结果,每次都是第一次调用被最后一次调用响应覆盖。因此,我将在页面上有两个相同的HTML块,而不是两个独特的代码片段。有时第一次通话甚至不会评估它的回叫,因此仍然是空的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果您正在使用该页面上的确切代码,那就不足为奇了,因为该示例使用单个全局变量来存储正在生成的XMLHttpRequest。因此,它无法同时处理多个同时请求:第二次调用该函数会覆盖req一个新函数,导致req读取ahahDone错误请求。

如果你想允许这样做,你必须让req成为一个局部变量(在var中声明function ahah()),并将其传递给targetahahDone()函数。或者只是内联:

function Element_loadHTML(element, url) {
    var req= null;
    if (window.XMLHttpRequest) {
        req= new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            req= new ActiveXObject('MSXML2.XMLHttpRequest');
        } catch() {}
    }
    if (!req) {
        element.innerHTML= 'Browser does not support XMLHttpRequest';
        return;
    }
    element.innerHTML= 'Loading...';

    req.onreadystatechange= function() {
        if (req.readyState===4)
            element.innerHTML= req.status===200? req.responseText : 'Error '+req.status;
    };
    req.open('GET', url);
    req.send(null);
} 

Element_loadHTML(document.getElementById('appdata'), 'appdata.part.html');
Element_loadHTML(document.getElementById('foo'), 'bar.part.html');

浏览器嗅探并尝试执行脚本标记的东西是绝望和破碎的;不要使用它。将<script>元素内容加载到页面中是不好的做法。