1

我编写了一个 js 函数,它通过 php 查询异步联系服务器到一个看起来像这样的表:

function grabber(url, element)
{
    async = new XMLHttpRequest();
    async.onreadystatechange=function()
    {
        if (async.readyState==4 && async.status==200)
        {
            document.getElementById(element).innerHTML=async.responseText;
        }
    }
    async.open("GET", url, true);
    async.send();
}

然后,我有另一个函数,当一个元素的事件处理程序被触发时,它使用不同的参数调用这个函数两次,以获取两个当前空元素的两个数据流。让我感到困惑的是,他们两个不能同时工作。当它们是函数中唯一的方法时,它们都起作用,但是当它们一起使用时,它们中只有一个起作用。顺序无所谓。

$('.box').keyup(function() {
    grabber("herp.php?q=" + $(this).val(), "rice");
    //grabber("derp.php?q=" + $(this).val(), "gohan");
});

无论位置如何,derp 似乎都具有优先权,而 herp 仅在 derp 被注释掉时才有效。php 文件只输出常规的 html 元素并且单独工作正常。关于如何让这些同时工作的任何想法?

4

2 回答 2

2

当您需要创建局部变量时,您正在创建全局变量:

async = new XMLHttpRequest(); // creates this.async, which probably means
                              // window.async

这样做的效果是,当grabber多次调用 时,每次调用都会async用新请求覆盖之前的值。这反过来意味着当你的每个回调最终执行时,它使用最后一个值的结果async-- 这导致所有目标元素得到相同的innerHtml.

要更正问题,请var在前面添加:

var async = new XMLHttpRequest();
于 2012-06-30T16:45:07.460 回答
1

您忘记使用以下命令声明“异步”变量var

var async = new XMLHttpRequest();

没有var关键字,它是一个全局变量。因此,连续的调用会覆盖前一个调用。

于 2012-06-30T16:45:13.667 回答