每个jquery有什么问题?

时间:2016-07-30 16:46:31

标签: javascript jquery html

我正在尝试使用ajax调用构建一个jquery每个循环,但由于某种原因它不会停止执行,因此循环我的所有代码。

我在这里做错了什么?

每个循环:

$.each(JSEFileNames, function(key, value){
    $.ajax({ url: "/"+key,
      success: function(r){
        $(JSEPlaceholder).html(r);
        JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
        $(JSEPlaceholder).empty();
        return;
      }
    });
  });

JSEFileNames包含类似于

的内容
JSEFileNames= {
"index.php": "", 
"something.txt": ""
}

和JSEPlaceholder只是一个包含“#searchBox”的字符串。

这是完整的代码: https://jsbin.com/kifisameto/edit?html,js,output

1 个答案:

答案 0 :(得分:0)

请注意return是没有意义的,因为它已经是函数的最后一行。它只会退出此函数,但$.each将继续执行,因为它包含在另一个函数中。

如果您分解代码会发生这种情况:

$.each(JSEFileNames, ajaxFunction);

function ajaxFunction(key, value){
    $.ajax({ url: "/"+key, success: successFunction });
}

function successFunction(r) {
    $(JSEPlaceholder).html(r);
    JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
    $(JSEPlaceholder).empty();
    return;
}

在这里,您可以看到return没有按照您的意愿行事。您需要在return false调用中执行ajaxFunction才能停止此操作。这是一个如何做到这一点的例子:

$.each(JSEFileNames, function(key, value){
    cont = true;
    $.ajax({ url: "/"+key, async: false,
      success: function(r){
        $(JSEPlaceholder).html(r);
        JSEFileNames[key] = $(JSEPlaceholder).text().toString().replace(/(\r\n|\n|\r)/gm,"") + $(JSEPlaceholder).children().text().toString().replace(/(\r\n|\n|\r)/gm,"");
        $(JSEPlaceholder).empty();
        cont = false;
      }
    });
    return cont;
});

这里发生的事情是return value value评估false将停止jQuery循环;如果valuetrue,则循环将继续运行。有关官方文档,请参阅here

请注意我添加了async: false;实际上,$.ajax是一个异步函数,它将在cont被修改之前返回。只有在请求成功或失败后,才会在稍后处理基础调用。解决这个问题的一种方法是使请求同步,但它会阻止其余代码在此期间执行。这可能是您在这里寻找的,因为您可以在多个页面上明显地执行搜索,并且您不希望一次搜索所有页面,而是检查一个页面在另一个之后。