2012-08-07 52 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(); 
});