2011-04-18 140 views
2

我有以下情况:页面显示一组项目,当用户点击项目时,通过ajax请求加载项目详细信息。我想要做的是防止进一步点击的Ajax请求,因为信息已经加载。如何防止ajax请求?

我使用jQuery和Rails 3和我的代码看起来是这样的:

# view 
- @items.each do |item| 
    .item 
    = link_to item.name, item_path(item), :remote => true 

// js 
$(function(){ 
    $('.item').bind('ajax:success', function(xhr, data, status){ 
    ... 
    }); 

    $('.item').bind('ajax:before', function(xhr){ 
    if (...) { // check if data already loaded 
     // ??? 
    } 
    }); 
}); 

我是一个正确的方式?或者有另一种解决方案?

回答

0

你可以在ajax调用之前设置一个像itemsLoaded = false这样的标志。详细信息加载的那一刻,您可以将该标志设置为itemsLoaded = true。阿贾克斯调用只应执行时if(!itemsLoaded){/* Do ajax to fetch details */}else return;

0

我认为你唯一能做的就是确保项目中的点击只能进入ajax函数一次。方法可以做到这一点:

  • click事件调用禁用的项目

  • 如果你想确保的绑定功能,你做了ajax成功函数相同

  • 单击该项目后,您的功能将检查项目信息是否已经存在。如果是,那么它只是返回。

+0

是的,这是我想到的第一方案,但在太多的代码,它不适合我。我寻找“不引人注目”和“三轨”的东西。 – 2011-04-18 12:24:46

0

一种解决方案是,你可以创建一个布尔值,则只会使Ajax调用如果该值为false。

0

设置在阿贾克斯的变量:成功的功能是这样的...

AjaxSuccessVar=0; 
$(function(){ 
    $('.item').bind('ajax:success', function(xhr, data, status){ 
     AjaxSuccessVar = 1; 
}); 

$('.item').bind('ajax:before', function(xhr){ 
    if (AjaxSuccessVar==0) { // check if data already loaded 
     //then do your ajax function here 
    } 
}); 
0

如何使用.data属性作为一个指标,如:

$('.item').bind('ajax:success', function(xhr, data, status){ 
     $(this).data("loaded", true); 

    }).bind('ajax:before', function(xhr){ 
     if (!$(this).data("loaded")) { 
      // data has not been loaded 
     } else { 
      // do something 
     } 
    }); 

编辑:

尝试从项目“触发器”点击后解除绑定,例如:

$(".item").click(function() { 
    $.ajax({ ... }); 
    $(this).unbind("click"); 
}); 

或者是请求ajax:success

$('.item').bind('ajax:success', function(xhr, data, status){ 
     $(this).unbind("click"); 
    }); 
+0

我不需要一个指标(我可以检查数据是否加载),我需要阻止ajax请求发送。 – 2011-04-18 12:26:55

+0

@Dmitry Maksimov - 啊,对不起,我以为那是你以后的样子。我已经更新了我的答案,希望现在更有帮助。 – karim79 2011-04-18 12:55:59

+0

感谢您的回复,但我找到了答案。 – 2011-04-18 13:05:35