2014-11-15 38 views
0

玉傢伙,這裏的小提琴 http://jsfiddle.net/wKbXx/24/如何將jQuery後繼續選擇追加

$(function() { 
$('input[name=q1]').on('change', function() { 
    var sel = $('[id^="comm"]'), opt = $('<option/>'); 
    if ($(this).is(':checked')) { 
     sel.append($("<option />").val(this.value).text(this.id)); 
    } else { 
     $('option[value=' + this.value + ']').remove(); 
    } 
}); 
}); 

我需要做的是選擇與複選框兩種顏色。比如說紅色和藍色。然後使用選擇,標記一個紅色和一個藍色。然後檢查綠色。我希望它保留選定的數據。現在,一旦你選擇綠色,它就會抹掉這些數據。我怎樣才能做到這一點?

更新,以反映WORKING答案..已更新FIDDLE TOO

回答

3

我會去稍微不同的方法;而不是總是重置選擇框,我會檢查更改的複選框中的文本是否已包含在選擇框中。如果是這樣,我會假定它沒有被選中,並從選擇框中刪除選項。否則,我會將這個新選項附加到選擇框。

$(function() { 
    $('input[name=q1]').on('change', function() { 
     var sel = $('[id^="comm"]'), opt = $('<option/>'); 
     if (sel.find('option').text().indexOf(this.id) > 0) { 
      $('option[value=' + this.value + ']').remove(); 
     } else { 
      sel.append($("<option />").val(this.value).text(this.id)); 
     } 
    }); 
}); 

這個版本的缺點是,選擇框中的顏色順序是由點擊複選框的順序決定的;在您的版本中,選擇框中的顏色順序始終與複選框中的顏色順序相同。

(。希望是有道理的)

這裏有一個小提琴:http://jsfiddle.net/Niffler/0hLxzvh8/

+0

Niffler,這工作,但我發現在大1000+條目中,第一個選擇總會自我複製,即使在刪除ti時也只會添加它..但只有第一個選項。 切換出您的操作方式我可以解決這個問題,我提出了這是問題中的好答案。 – user3452747

1

這可能是回答你的問題...... 你應該把你在上面重寫爲好。

$(function() { 
    var sel = $('[id^="comm"]'), opt = $('<option/>'); 
    sel.html(opt.clone().text('[Select One]')); 

    $('input[name=q1]').on('change', function() { 

     if ($(this).is(':checked')) { 
      sel.append($("<option />").val(this.value).text(this.id)); 
     } 
     else { 
      //Remove where ID matches up 
      sel.children().remove(); 
     } 

     if(sel.find('option').length > 1) { 
      if(sel.find('option').length === 2) { 
       sel.find('option').eq(1).attr('selected',true); 
      } 
     } 
    }); 
}); 

乾杯!

+0

這隻能部分地解決它。如果你不檢查在for循環中的列表中已經有了什麼'option'值,你將會創建dupes。 – doublesharp

+0

哦,工作!謝謝!我花了很長時間玩這個.. – user3452747

1

在替換選項之前,您需要獲取選擇框的值,然後在最後重置該值。

$(function() { 
$('input[name=q1]').on('change', function() { 
    var sel = $('[id^="comm"]'), opt = $('<option/>'); 

    sel.each(function(){ 
     sel.data('previous', sel.val()); 
    }); 

    // overwrite the existing options 
    sel.html(opt.clone().text('[Select One]')); 
    $('input[name=q1]:checked').each(function() { 
     sel.append($("<option />").val(this.value).text(this.id)); 
    }); 

    // if it had a value, set it back to that. 
    if (currentValue != ''){ 
     sel.each(function(){ 
      sel.val(sel.data('previous')); 
     }); 
    } else { 
     if(sel.find('option').length > 1) { 
      if(sel.find('option').length === 2) { 
       sel.find('option').eq(1).attr('selected',true); 
      } 
     } 
    } 
}); 
}); 
+0

這適用於第一個選擇框,但不是第二個。 :(我期待看看你是如何做到這一點,看看我是否可以爲其他選擇做到這一點。 – user3452747

+0

使用'each()'並附加值使用data()' – doublesharp

+0

更新爲使用一個each()迭代選擇,然後使用data()保存並設置以前的值。 – doublesharp