2012-08-07 50 views
0

我有一個隱藏的選擇應該通過可見選擇自動選擇,我的jQuery是:jQuery的結合來選擇改變

$(document).ready(function() { 

    var selected_val = $('#id_foo option:selected').val(); 
    $('#id_bar').val(selected_val); 

    $("#id_foo").change(function() { 
     selected_val = $(this).attr('value'); 
     $('#id_bar').val(selected_val); 
    }); 

}); 

這工作得很好,但我的工作頁面有添加的選項在運行中對(可見)選擇的值。如何在更新所選值之前綁定到此事件並將其添加到隱藏列表中?

+0

是否隱藏元素必須成爲'選擇'?當然,這取決於你需要它,但也許它可能只是一個''元素,在這種情況下,你不必擔心填充可能的值列表。 – Tom 2012-08-07 15:11:58

+0

我明白了,但窗體和視圖是由框架生成的,我想遠離那個 – 2012-08-07 15:32:00

回答

2

解決此問題的最佳方法是在更新可見窗口時使用新值更新隱藏選擇。

或者,按照我的意見,你可以填充隱藏select當看到一個改變:

$("#id_foo").change(function() { 
    selected_val = $(this).attr('value'); 

    //clear and re-populate all of hidden select here 
    $('#id_bar').val(selected_val); 
}); 
+0

這就是我所期望的,問題是這是由作爲使用框架的一部分的庫完成的。我能以某種方式包裝這個功能,而不會侵入源代碼? – 2012-08-07 11:13:56

+0

你可以這樣做,當你更新第二個時,你清除它並重新填充它與可見選擇的當前內容? – Chris 2012-08-07 11:29:31

+0

如果.change()未檢測到「更改」第一個,則沒有信號更新第二個。 「看到」新選項的唯一事件似乎是DOMSubtreeModified,該狀態處於棄用狀態。 – 2012-08-07 13:30:32

0

這應該做的伎倆:

$(function() { 
    var $bar = $('#id_bar'); 
    var $foo = $('#id_foo'); 

    $bar.val($foo.val()); 

    $foo.change(function() { 
     var newValue = $(this).val(); 
     if ($bar.find('[value="' + newValue + '"]').length === 0) { 
      $bar.append($('<option/>').val(newValue)); 
     } 
     $bar.val(newValue); 
    }); 
}); 

在設置新的價值,檢查該值是否是一個選項。如果不是,請添加爲選項。

0

這段代碼正確地標識了事件,併成功地將選擇選項從foo複製到了條。然而,它似乎並沒有正確設置:selected在任id_fooid_bar和使用DOMSubtreeModified感覺hackish的

$('#id_foo').bind("DOMSubtreeModified", function(){ 
    var high = 0; 
    $('#id_foo').children().each(
     function(){ 
      if ($(this).val() > high) { 
       high = $(this).val(); 
      } 
     } 
    ); 
    $('#id_foo').val(high); 
    var new_options = $('#id_foo').clone(); 
    $('#id_bar').html(''); 
    $('#id_bar').append(new_options.children()); 
}); 

所以,現在最好我能想出:

$('#id_foo').bind("DOMSubtreeModified", function(){ 
    location.reload(); 
});