0

选择值让我感到困惑。当用户在我的应用程序中编辑一行时,我使用 jquery 克隆一个标签(称为 empty-X)并将其放在模式窗口上,以便用户可以编辑这些值。同时,我从服务器获取了一个 json 对象(数据),并在模式窗口中填写了数据库中的当前字段:

empty_X.find('#id_deals-1-currency').val(data[0].fields['currency']);

现在,当模式显示时,用户可以看到如何在下拉列表中选择正确的货币。

然而,当我用 Firebug 检查这个元素的 HTML 时,我得到了一张不同的图片,似乎没有被选中。

<select id="id_deals-1-currency" name="deals-1-currency">
 <option selected="selected" value="">---------</option>
 <option value="1">USD - $</option>
 <option value="2">EUR - €&lt;/option>
 <option value="3">GBP - £</option>
</select>

然而,当我将表单发送到服务器时,没有验证错误,并且货币与之前通过 val() 设置的值相同。生活很好。

虽然这本身有效,但存在一个问题。如果用户想回到编辑模式并在保存之前再次验证货币怎么办?

在这种情况下,我不能再从数据库中加载值了。他以前的局部变化现在很重要。我必须在模式窗口中克隆当前带有货币的记录,以便用户可以看到他之前更改的内容并进行验证。现在的问题是用户看不到他在上一步中更改的货币。事实上,他会看到一个空的下拉菜单。

我在这里有什么选择?有没有办法将selected标志设置为实际选择而不是使用val()

4

1 回答 1

1

克隆 a<select>时,具有 'selected' 属性的选项成为克隆对象中的当前选项 - 而不是实际的当前对象(根据 value 属性)。

为了解决这个问题,您可以从返回的值中找到当前选定的选项,val()然后在克隆它之前将选定的属性应用于它。这样您就不需要在克隆后设置值。

演示:http: //jsfiddle.net/DqADq/

代码:(.x1<select>

// simple cloning
$('.x1:first').clone().appendTo('.out');

// setting selected attr before cloning
var v = $('.x1:first').val();
$('.x1:first option').removeAttr('selected'); // remove 'selected' from all options
$('.x1:first option').each(function() {
    if($(this).attr('value') == v)  {
        $(this).attr('selected', true); // apply 'selected' to current option
    }
});
$('.x1:first').clone().appendTo('.out');
于 2012-12-20T13:09:19.703 回答