2012-02-23 58 views
0

这里是我的代码:jQuery文档()方法不起作用

$(function() { 

    var region = $('#region'); 

    var city = $('#city'); 

    var pickedRegionId = region.find(':selected').val(); 

    var options; 

    if (pickedRegionId === '') { 
     console.log('region is empty, html() and disable'); 
     city.html(''); 
     city.attr('disabled', true); 
    } 

    region.change(function(){ 
     console.log('region is changed'); 
     pickedRegionId = $(this).val(); 
     if (pickedRegionId !== '') { 
      city.html(''); 
      console.log('loading cities'); 
      getCities(pickedRegionId); 
     } 
    }); 

    function getCities (regionId) { 
     city.attr('disabled', true); 
     city.html('<option>Loading...</option>'); 

     $.get(
      '/ajax/get_cities', 
      'region_id='+regionId, 
      function (responce) { 
       if (responce.result === 'success') { 
        $(responce.cities).each(function(){ 
         options += '<option value="'+$(this).attr('id')+'">'+$(this).attr('city')+'</option>'; 
        }); 
        city.html(options); 
        city.attr('disabled', false); 
       } 
      }, 'json' 
     ); 
    } 
}); 

当页面加载一切正常,我挑了一些地区和城市有选择使用Ajax填充数据。 但是当我选择另一个区域时,城市中的数据选择只是随着更新的数据而扩展。

所以问题是我有两个地区的城市(新的和旧的)。无论我选择另一个地区多少次,只需将新数据添加到城市选择中即可。在代码中,所有外观都很好,并且我已经将.html('')放在区域更改上,所以在插入收到的值之前它应该是空的。但我无法弄清楚这个bug是什么。

+0

难道你只需要在$(responce.cities).each语句之前重新初始化“选项”值? – 2012-02-23 17:50:38

回答

2
$(responce.cities).each(function(){ 
    options += '<option value="'+$(this).attr('id')+'">'+$(this).attr('city')+'</option>'; 
}); 

你只是追加到选项,根本不清除它。我会在您将cities设置为加载的位置下方清空您的选项。

0

尝试循环之前正在重置您的“选项” VAR:

... 
options = ''; 
$(responce.cities).each(function(){ 
... 
0

你必须先清空变量选项。您只是将新城市添加到选项变量中。

最简单的解决办法是将移动可变进这样的getCities功能选项:

function getCities (regionId) { 
    var options = ""; 

    city.attr('disabled', true); 
    city.html('<option>Loading...</option>'); 

    $.get(
     '/ajax/get_cities', 
     'region_id='+regionId, 
     function (responce) { 
      if (responce.result === 'success') { 
       $(responce.cities).each(function(){ 
        options += '<option value="'+$(this).attr('id')+'">'+$(this).attr('city')+'</option>'; 
       }); 
       city.html(options); 
       city.attr('disabled', false); 
      } 
     }, 'json' 
    ); 
} 
0

的问题是,当你接收到的数据,你将它添加到options变量是全球性的。所以,只需在$(responce.cities).each(function(){之前加上:

options = ''; 

而且一切都应该没问题。

顺便说一下,它是响应,而不是响应。 :)

0

在函数getCities中,添加var options='';作为第一行。你不断加入它,但从来没有清除它,因此问题。

0

两件事情:

1)city.attr('disabled', true);应该重新填充它像这样前city.prop('disabled', 'disabled');

2)尝试重options回一个空字符串:

if (responce.result === 'success') { 
    options = '';       
    $(responce.cities).each(function(){ 
     options += '<option value="'+$(this).attr('id')+'">'+$(this).attr('city')+'</option>'; 
    }); 

    city.html(options); 
    city.attr('disabled', false); 
} 
+2

不,它应该是'.prop()',而不是'.attr()'...自jQuery 1.6以来。 – Sparky 2012-02-23 17:55:56

+0

哎呀,你是对的。该死的我的隧道视野,只看到“真实”。编辑遵守Sparky的惊人的jQuery标准。 :d – SenorAmor 2012-02-23 17:58:40