我和JS和jQuery有一个非常奇怪的问题。
$('#skip').click(function(e) {
savePhoto('skip');
showNextPlace();
photo_changed = 0;
return false;
});
showNextPlace()
和photo_changed = 0;
仅在我添加断点时执行。 savePhoto();
的代码非常基本。我根据places数组中的状态和元素数提交请求。
function savePhoto( status )
{
if ( places.length <= 5 )
{
// load more places
$('#loadmore').val('1');
}
// Don't send a request on skip unless we need more places
if ( status != 'skip' || $('#loadmore').val() == 1 )
{
$.ajax({
url: "url" + status,
cache: false,
data: $('#form_photo').serialize(),
success: function(results){
// dont load more places until we have few
$('#loadmore').val('0');
if ( results != '[]' )
{
for ( var i in results )
{
places.push( results[i] );
}
}
}
});
}
}
对于为什么会发生这种情况或者如何更好地调试问题?
答案 0 :(得分:2)
异步XHR调用
$.ajax({ ... })
可能在断点存在时到达,但是当没有断点运行时,XHR请求在达到该代码时仍在进行中。
也许你应该对$ .ajax调用进行回调,该调用显示了加载场所后的下一个位置。
如果布尔值showNextPlace
为真,则可以使用$ .ajax处理程序调用{{1}},如果没有下一个要显示的地方,则调用它时needsToShowNextPlace
设置该布尔值
答案 1 :(得分:1)
由于$.ajax
调用是异步的,您应该将代码放在success
处理程序中,如下所示:
success: function(results){
// dont load more places until we have few
$('#loadmore').val('0');
if ( results != '[]' )
{
for ( var i in results )
{
places.push( results[i] );
}
}
showNextPlace(); //Moved here
photo_changed = 0; //Moved here
}
所以你的点击绑定将是:
$('#skip').click(function(e) {
savePhoto('skip');
return false;
});
它无效,因为在原始代码中,showNextPlace()
和photo_changed=0
在savePhoto('skip')
完成执行之前正在执行。 (那是异步的)。它适用于断点,因为它给了savePhoto()
足够的时间来完成。
希望这会有所帮助。干杯
答案 2 :(得分:-1)
问题与AJAX调用无关。在代码的另一部分中,每次用户按下保存按钮时,我都会将事件绑定到图像字段(因此第二次执行代码2次,第3次等等)。记得解除绑定! / p>
此外,作物的一部分&amp;即使我点击了skip,也正在执行save plugin,所以我添加了一些控制变量。
解决方案:在逻辑可以运行的每个路径上使用console.log()。