Javascript 异步调用相互踩踏

标签 javascript html

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

有什么想法吗?

最佳答案

如果您在该页面上使用的代码完全相同,这并不奇怪,因为那里的示例使用单个全局变量来存储正在生成的 XMLHttpRequest。所以它不可能同时处理多个请求:第二次调用该函数会覆盖 req。用一个新的,导致reqahahDone 阅读是错误的请求。

如果你想允许这个,你必须制作req一个局部变量(通过在 var 中声明它 function ahah() ),并用 target 传递它到 ahahDone()功能。或者只是内联:

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');

浏览器嗅探和尝试执行脚本标签的东西是无望的和 splinter 的;不要使用它。加载 <script> 不是好习惯元素内容到页面中。

关于Javascript 异步调用相互踩踏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303109/

相关文章:

javascript - AngularJS:更改验证时的innerHTMLl

javascript - 日期选择器无法使用“添加更多”按钮

html - 轮播仅在小屏幕上显示全宽屏幕

javascript - 使用 YUI3 确定单选按钮选择何时更改

javascript - 流体图像翻转 Twitter Bootstrap Rails

javascript - 删除标记名内字符串的一部分(通过js)

javascript - 获取所有事件监听器的列表,javascript/jquery

javascript - 带有 Greensock JS 钩子(Hook)的 Vue 列表动画 : wait for leave to finish before enter

javascript - 使用 SQLite 获取距今天最近的 5 个日期

javascript - 如何在 javascript 函数内部添加 div 类