1

所以我的问题如下:很容易获取有关某些记录的数据并以表格形式提供。

问题是:它的一部分是一个位置(大陆、国家、城市),由 3 个相互关联的下拉列表表示。

我得到的是浏览器停止响应,我需要一些想法来提出更好的解决方案。

这是一个代码示例,其中包含关于它停止位置的注释,所以也许有人可以给我一个提示:

 // To load the drop-down lists I use similar ajax code as the one shown below in the edit case

 function processRow(command, id) {
    switch(command){

    case 'Delete': {    
        $("#deleteId").val(id);
        $('#deleteEventModal').reveal();
    }
    break;
    case 'Edit': {
        /* Fetch Data to Fill up the form */
        $.ajax({
            type: "GET",
            url: "scripts/fetchEventById.php?eventId=" + encodeURIComponent(id),
            dataType: "json",
            success: function(response){
                    /* On Successful Posting to server side */
                                // THIS DROP DOWN LOADS AND SETS DB VAL OK
                    loadContinents("#editEventContinents");
                    $("#editEventContinents").val(response.eventData.continentId);           

                     // FROM THIS MOMENT ON IT WILL STALL
                     // last instruction sets continent drop-down with proper value BUT
                     // when fetching the countries for that continent (below)
                     // the continent drop-down value comes empty as if nothing 
                     // was selected
                     // but it was, I visually confirmed that 
                     // after setting it with val() above
                    loadCountries("#editEventContinents", "#editEventCountries", "#editEventCities");
                    $("#editEventCountries").val(response.eventData.countryId);

                   loadCities("#editEventCountries", "#editEventCities");
                   $("#editEventCities").val(response.eventData.cityId);

                   $("#editEventStartDate").val(response.eventData.startDate);
                   $("#editEventEndDate").val(response.eventData.endDate);
                   $("#editEventUserName").val(response.eventData.userName);
                   $("#editEventName").val(response.eventData.eventName);
                   $("#editEventDetails").val(response.eventData.details);
            },
            error: function(jqXHR, textStatus, errorThrown){            
                /* log the error to the console */
                console.log(
                    "The following error occured: " + 
                    textStatus, errorThrown
                );
            }
        });

        // Get the overlay with the form for editing to pop up                              
        $('#editEventModal').reveal();
    }
    break;
    default:
        // oops, something wrong happened
    break;
}
return false;
}

// Here is the load continents function
function loadContinents(continentObj) {     
// fetch continent data

$.ajax({
    type: "GET",
    url: "scripts/fetchContinents.php",
    dataType: "json",
    success: function(data){
        /* On Successful Posting to server side */

        // Add fetched options to the select object responsible for holding the continents list
        $(continentObj).empty(); //clear current available selections
        if( data == "" ){
            $(continentObj).append("<option value=\"\">No continents found</option>");
        }
        else{
            for( i = 0; i < data.id.length; i++ ){
                $(continentObj).append("<option value=\"" + data.id[i]  + "\">" + data.name[i]  + "</option>");
            }
        }

    },
    error: function(jqXHR, textStatus, errorThrown){
        /* log the error to the console */
        console.log(
            "The following error occured: " + 
            textStatus, errorThrown
        );

        $(countryObj).append("<option selected value=\"\">Select Continent</option>");

        $("#searchEventError").fadeOut(200);
        $("#searchEventError").fadeIn(200).html("<div class=\"alert-box error\">Something went wrong with the server request, please try again later</div>");
    }
});

return false;
}

// Load Countries
function loadCountries(continentObj, countryObj, cityObj) {
var continentOption = $(continentObj).val();

// clear/reset countries and cities selections
$(countryObj).empty();
$(cityObj).empty().append("<option selected value=\"-1\">Please Select Country First</option>");

$.ajax({
    type: "GET",
    url: "scripts/fetchCountries.php?continent=" + encodeURIComponent(continentOption),
    dataType: "json",
    success: function(data){
        /* On Successful Posting to server side */

        // Add fetched options to the select object responsible for holding the countries list
        if( data == "" ){
            $(countryObj).append("<option value=\"0\">No countries found</option>");
        }
        else{
            for( i = 0; i < data.id.length; i++ ){
                $(countryObj).append("<option value=\"" + data.id[i]  + "\">" + data.name[i]  + "</option>");
            }
        }

    },
    error: function(jqXHR, textStatus, errorThrown){
        /* log the error to the console */
        console.log(
            "The following error occured: " + 
            textStatus, errorThrown
        );

        $(countryObj).append("<option selected value=\"-1\">Please Select Continent First</option>");

        $("#searchEventError").fadeOut(200);
        $("#searchEventError").fadeIn(200).html("<div class=\"alert-box error\">Something went wrong with the server request, please try again later</div>");

    }
});

return false;
}

// Load Cities
function loadCities(countryObj, cityObj) {
var countryOption = $(countryObj).val();

// clear/reset cities selections
$(cityObj).empty();

$.ajax({
    type: "GET",
    url: "scripts/fetchCities.php?country=" + encodeURIComponent(countryOption),
    dataType: "json",
    success: function(data){
        /* On Successful Posting to server side */

        // Add fetched options to the select object responsible for holding the cities list     
        if( data == "" ){
            $(cityObj).append("<option value=\"0\">No cities found</option>");
        }
        else{
            for( i = 0; i < data.id.length; i++ ){
                $(cityObj).append("<option value=\"" + data.id[i]  + "\">" + data.name[i]  + "</option>");
            }
        }

    },
    error: function(jqXHR, textStatus, errorThrown){            
        /* log the error to the console */
        console.log(
            "The following error occured: " + 
            textStatus, errorThrown
        );

        $(cityObj).append("<option selected value=\"-1\">Please Select Country First</option>");

        $("#searchEventError").fadeOut(200);
        $("#searchEventError").fadeIn(200).html("<div class=\"alert-box error\">Something went wrong with the server request, please try again later</div>");
    }
});

return false;
}
4

2 回答 2

1

loadCountries包含在 中processRow,因此事件值会返回并被设置,但随后 loadCountries 会进入并再次覆盖该值。

我建议根据初始负载中的选定值提取您的国家和城市数据,这样您就不必等待多次。获取您的活动详细信息以包括所选大陆的所有国家/地区、所选国家/地区的所有城市,并在您的活动详细信息 JSON 中输出。

您可以尝试的另一件事是嵌套您的 AJAX 调用,以便每个调用都需要像这样等待下一个(我不建议这样做):

function processRow(command, id) {
    console.log('Starting the processing of row #' +id);
    switch(command){

        case 'Delete': {    
            $("#deleteId").val(id);
            $('#deleteEventModal').dialog( "open" );
        }
        break;
        case 'Edit': {
            /* Fetch Data to Fill up the form */    

            $.ajax({
                type: "GET",
                url: "stackAjax.php?Action=Event&eventId=" + encodeURIComponent(id),
                dataType: "json",
                success: function(response){
                    $("#editEventStartDate").val(response.eventData.startDate);
                    $("#editEventEndDate").val(response.eventData.endDate);
                    $("#editEventUserName").val(response.eventData.userName);
                    $("#editEventName").val(response.eventData.eventName);
                    $("#editEventDetails").val(response.eventData.details);
                    $("#editEventContinents").val(response.eventData.continentId);

                    /* On Successful Posting to server side */
                    window.currentContinent = response.eventData.continentId;
                    window.currentCountry = response.eventData.countryId;
                    window.currentCity = response.eventData.cityId;

                    var countryObj = $("#editEventCountries"),
                    cityObj = $("#editEventCities");

                    $(countryObj).empty();
                    $(cityObj).empty().append("<option selected value=\"-1\">Please Select Country First</option>");

                    $.ajax({
                        type: "GET",
                        url: "stackAjax.php?Action=Countries&continent=" + encodeURIComponent(window.currentContinent),
                        dataType: "json",
                        success: function(countryData){
                            /* On Successful Posting to server side */

                            // Add fetched options to the select object responsible for holding the countries list
                            if( countryData == "" ){
                                $(countryObj).append("<option value=\"0\">No countries found</option>");
                            }
                            else{
                                for( i = 0; i < countryData.id.length; i++ ){
                                    $(countryObj).append("<option value=\"" + countryData.id[i]  + "\">" + countryData.name[i]  + "</option>");
                                }
                            }

                            $(cityObj).empty();

                            console.log('about to set the country');        
                            $("#editEventCountries").val(response.eventData.countryId);
                            $.ajax({
                                type: "GET",
                                url: "stackAjax.php?Action=Cities&country=" + encodeURIComponent(window.currentCountry),
                                dataType: "json",
                                success: function(cityData){
                                    /* On Successful Posting to server side */

                                    // Add fetched options to the select object responsible for holding the cities list     
                                    if( cityData == "" ){
                                        $(cityObj).append("<option value=\"0\">No cities found</option>");
                                    }
                                    else{
                                        for( i = 0; i < cityData.id.length; i++ ){
                                            $(cityObj).append("<option value=\"" + cityData.id[i]  + "\">" + cityData.name[i]  + "</option>");
                                        }
                                    }

                                console.log('about to set the city');       
                                $("#editEventCities").val(response.eventData.cityId);
                                },
                                error: function(jqXHR, textStatus, errorThrown){            
                                    /* log the error to the console */
                                    console.log(
                                        "The following error occured: " + 
                                        textStatus, errorThrown
                                    );

                                    $(cityObj).append("<option selected value=\"-1\">Please Select Country First</option>");

                                    $("#searchEventError").fadeOut(200);
                                    $("#searchEventError").fadeIn(200).html("<div class=\"alert-box error\">Something went wrong with the server request, please try again later</div>");
                                }
                            });
                        },
                        error: function(jqXHR, textStatus, errorThrown){
                            /* log the error to the console */
                            console.log(
                                "The following error occured: " + 
                                textStatus, errorThrown
                            );

                            $(countryObj).append("<option selected value=\"-1\">Please Select Continent First</option>");

                            $("#searchEventError").fadeOut(200);
                            $("#searchEventError").fadeIn(200).html("<div class=\"alert-box error\">Something went wrong with the server request, please try again later</div>");

                        }
                    });

                    //console.log('A: Country DB: ' + response.eventData.countryId);
                    //$("#editEventCountries").change();

                    //console.log('A: Selected Country: ' + $("#editEventCountries").val());


                    //console.log('A: Selected City: ' + $("#editEventCities").val());

                    //$('#editEventModal').dialog( "open" );
                },
                error: function(jqXHR, textStatus, errorThrown){            
                    /* log the error to the console */
                    console.log(
                        "The following error occured: " + 
                        textStatus, errorThrown
                    );
                },
                complete: function(){

                }
            });
        }
        break;
        default:
            alert("Don't know what to do but id is "+id);
        break;
    }
    return false;
}
于 2012-04-04T12:13:00.280 回答
1

我的意思是:你写的和我写的之间唯一实际的区别似乎是明确地调用了从一个盒子到另一个盒子的变化的触发器。

另一方面,我也有这样的事情:

    $("#editEventContinents").change(function(){ // continents on change
    return loadCountries("#editEventContinents", "#editEventCountries", "#editEventCities");
});

$("#editEventCountries").change(function(){ // countries on change
    return loadCities("#editEventCountries", "#editEventCities");
});

这意味着,它的作用几乎相同,对吧?

我的问题实际上是在处理表格行以对其进行编辑并因此进行更新时。这就是下拉菜单失败的地方。

使用类似的东西

 loadContinents("#editEventContinents");
 $("#editEventContinents").val(response.eventData.continentId);

不会触发大陆下拉框的更改事件。如果我明确地这样做,结果也不好,加载国家仍然无法识别所选对象。这意味着查询字符串将变为空到后端,然后所有的混乱都会发生。

于 2012-04-09T14:48:53.003 回答