只有在Firebug中存在断点时,JQuery才会排序

时间:2011-05-22 16:40:03

标签: jquery firebug

我创建了脚本,它发送AJAX请求并使用选项元素列表刷新 select 元素。完成后,我尝试使用JQuery plugin jQuery.sortElements.js选项元素进行排序:

/* If region is specified */
    if (regionId != '0') {
        /* AJAX request to get city list and refresh select state. */
        $.getJSON('/json/cities', {region_id: regionId}, function(json) {
            $("select.changedBy-" + regionSelectId).each(function() {
                var citySelect = $(this);
                $.each(json, function(id, name) {
                    $('<option value="' + id + '">' + name + '</option>').appendTo(citySelect);
                });
            });
        });

        /* Sorting */
        $("select.changedBy-" + regionSelectId).each(function() {
            $(this).find('option').sortElements(function(option1, option2) {
                var option1Value = $(option1).attr('value');
                var option2Value = $(option2).attr('value');
                if (option1Value == '0') return -1;
                if (option2Value == '0') return 1;
                if (option1Value == regionId) return -1;
                if (option2Value == regionId) return 1;
                return $(option1).text() > $(option2).text() ? 1 : -1;
            });
        });
    }
};

不幸的是,只有在Firebug中将断点放在以下行时才进行排序:

$("select.changedBy-" + regionSelectId).each(function() {

在其他情况下(常规模式),它不会对选项元素进行排序。你能帮我找一下这个问题的原因吗?

谢谢,   鲍里斯。

3 个答案:

答案 0 :(得分:2)

听起来像是一个时间问题。您确实意识到getJSON()调用是异步的,对吧? JavaScript引擎将转到$.getJSON(),发出请求,然后几乎立即转到您的排序代码。它将无法排序,因为没有任何要排序的元素,但是,因为请求尚未完成。

我怀疑当您设置断点时,会为请求提供足够的时间来完成,并且您会看到事情按预期方式运行。

我会建议以下其中一项

  1. 在追加所有新的getJSON()
  2. 后立即将所有排序代码移到<option>回调函数中
  3. 在完成创建所有新<option>
  4. 后,将函数中的排序代码包装并调用该函数

    这是第一个建议的代码(无限简单 - 它只涉及将您的排序代码剪切并粘贴到回调函数体中):

     if (regionId != '0') {
            /* AJAX request to get city list and refresh select state. */
            $.getJSON('/json/cities', {region_id: regionId}, function(json) {
                $("select.changedBy-" + regionSelectId).each(function() {
                    var citySelect = $(this);
                    $.each(json, function(id, name) {
                        $('<option value="' + id + '">' + name + '</option>').appendTo(citySelect);
                    });
                });
    
                /* Sorting */            
                 $("select.changedBy-" + regionSelectId).each(function() {
                    $(this).find('option').sortElements(function(option1, option2) {
                        var option1Value = $(option1).attr('value');
                        var option2Value = $(option2).attr('value');
                        if (option1Value == '0') return -1;
                        if (option2Value == '0') return 1;
                        if (option1Value == regionId) return -1;
                        if (option2Value == regionId) return 1;
                        return $(option1).text() > $(option2).text() ? 1 : -1;
                    });
                });
            });
        }
    

答案 1 :(得分:0)

javaScript是单线程语言,当没有创建选项元素时,您的排序代码将被调用,因为它们是在完成ajax请求时创建的。在选项元素创建之后要强制排序代码是将排序代码放入函数并在ajax请求完成时调用它,在创建选项元素之后,它将是:

 makeAjaxCall(callBack(){
  createOptionElements();
  SortOptionElements();
});

希望它适合你。祝你好运:)

答案 2 :(得分:0)

Ajax请求可能是异步的。使用同步Ajax请求