.shide()之后的.show()并不总是显示

时间:2012-03-07 14:13:57

标签: jquery

我试图根据所选择的操作显示<div>。我在数据库中放了一个列表,用于协调操作和<div>的类。在测试代​​码时,它会工作几次,然后随机停止工作。我验证了内容;没关系。在.hide()之后使用.show()时似乎是一个问题或错误。

知道怎么解决吗?

$("#ddlOperation").change(function() {
    var idState = $(this).val();

    // get the name of all classes and hide it
    $.getJSON("/Trademark/hideFirst", function(fiData) {
        $.each(fiData, function (index, itemData) {
            $('.' + itemData.Text).hide("slow");
        });
    });

    // get the class that must be shown
    $.getJSON("/Trademark/LoadFieldByOperation", { id: idState }, 
        function(fData) {   
            $.each(fData, function (index, itemData) {
                $('.' + itemData.Text).show("slow");     
    // doesn't work always even the itemData.Text contains the suitable string!
        });
});

5 个答案:

答案 0 :(得分:3)

这两个请求是异步的,因此无法保证隐藏项目的第一个回调在第二个回调之前运行。为确保这一点,您可以执行以下操作:

    // get the name of all classes and hide it
    $.getJSON("/Trademark/hideFirst", function (fiData) {
        $.each(fiData, function (index, itemData) {
            $('.' + itemData.Text).hide("slow");
        });
        // get the class that must be shown
        $.getJSON("/Trademark/LoadFieldByOperation", { id: idState }, function (fData) {   
            $.each(fData, function (index, itemData) {
                $('.' + itemData.Text).show("slow");
            });
        });
    });

答案 1 :(得分:1)

您按顺序触发了两个ajax请求。由于它们是异步的,因此无法保证第一个响应将在第二个响应之前到达。由于您从响应回调中调用.show().hide(),这可能是导致问题的原因。

答案 2 :(得分:0)

我猜第一块代码在您尝试显示内容时仍然有效。尝试删除"slow"以便更快地获取补间。

答案 3 :(得分:0)

这两个ajax调用同时执行,因此第二个调用可以先完成调用。这意味着当第一次调用结束时,您的div实际上将被隐藏

答案 4 :(得分:0)

$.getJson()异步工作,因此可能会在隐藏项目的函数之前调用显示项目的函数。

更改订单无关紧要的代码,或者在应用第一个getJson的结果之前不应用第二个getJson的结果。例如,您可以使用变量来跟踪项目是否已被隐藏,如下所示:

var secondResults;
var firstReceived;

// first
$.getJson(..., function(fData) { 

    // hide stuff

    if(secondResults){
      //show stuff
    }
    firstReceived = true;
});


// second
$.getJson(...., function(fData) {
    ....
    if(!firstReceived){
       secondResults = fData;
    } else {
       // show stuff
    }
});

或者你可以通过在第一个getJson调用的success函数中调用第二个getJson来同步链接两个getJson调用。