我对我的脚本有点困惑:我正试图通过jQuery和AJAX在我的页面中搜索。在这个例子中,我想在2个站点中搜索关键字,我想在找到的东西时打破AJAX循环:
var urls = [
'http://docs.db-dzine.com/woocommerce-advanced-categories/',
'http://docs.db-dzine.com/woocommerce-catalog-mode/',
];
var found = false;
$.each(urls, function(i, url) {
ajaxSearchPage(url, keyword, function(found) {
console.log(found);
if(found) {
return true;
}
});
if(found) {
return true;
}
});
我不知道如何在这里打破循环......请帮助。
我的AJAX功能:
var ajaxSearchPage = function(url, keyword, callback) {
$.ajax({
url: url,
type: "GET",
dataType: "html",
success: function(response) {
// Do not load images
var page = response.replace(/<img/gi, '<noload');
// Create parsable body for jQuery
var body = $('<div id="body-mock">' + page.replace(/^[\s\S]*<body.*?>|<\/body>[\s\S]*$/ig, '') + '</div>');
// Find the keyword in content
var content = body.find('#content:containsNC("'+ keyword +'")');
if(content.length > 0) {
searchResultsWrapper.show();
callback(true);
} else {
callback(false);
}
}
});
};
答案 0 :(得分:1)
我们可以在特定的迭代中打破
$.each()
循环 回调函数return false
。返回non-false
与a相同 在for循环中继续声明;它将立即跳到下一个 迭代。
答案 1 :(得分:0)
AJAX调用是延迟操作,因此您的整个循环可能会运行。这是因为您无法知道所有网络请求何时完成。如果您查看jQuery.ajax,您会注意到它会返回jqXHR个对象。 jqXHR有一个abort
方法来取消网络请求。
所以我们实际想做的是在获得所需结果后取消所有请求。为此,我们必须排队请求然后取消。
var ajaxQueue = [];
$.each(urls, function(i, url) {
ajaxQueue.push(ajaxSearchPage(url, keyword, function(found) {
if(found) {
ajaxQueue.forEach(jqXHR=>jqXHR.abort());
}
}));
});