首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >克隆没有克隆选择值

克隆没有克隆选择值
EN

Stack Overflow用户
提问于 2009-04-13 01:35:28
回答 10查看 42.3K关注 0票数 82

我没想到会这样,但下面的测试在克隆值检查中失败了:

代码语言:javascript
复制
test("clone should retain values of select", function() {
    var select = $("<select>").append($("<option>")
                              .val("1"))
                              .append($("<option>")
                              .val("2"));
    $(select).val("2");
    equals($(select).find("option:selected").val(), "2", "expect 2");
    var clone = $(select).clone();
    equals($(clone).find("option:selected").val(), "2", "expect 2");
});

是这样的吗?

EN

回答 10

Stack Overflow用户

发布于 2009-04-13 13:20:54

经过进一步的研究,我在JQuery bug跟踪系统中找到了这张票,它解释了这个bug,并提供了解决方法。显然,克隆select值的代价太高了,所以它们不会修复它。

https://bugs.jquery.com/ticket/1294

我使用clone方法是在一个泛型方法中,其中任何东西都可能被克隆,所以我不确定何时或是否会有select来设置值。因此,我添加了以下内容:

代码语言:javascript
复制
var selects = $(cloneSourceId).find("select");
$(selects).each(function(i) {
    var select = this;
    $(clone).find("select").eq(i).val($(select).val());
});
票数 80
EN

Stack Overflow用户

发布于 2012-08-04 06:32:45

以下是jQuery的克隆方法的修复版本:

https://github.com/spencertipping/jquery.fix.clone

代码语言:javascript
复制
// Textarea and select clone() bug workaround | Spencer Tipping
// Licensed under the terms of the MIT source code license

// Motivation.
// jQuery's clone() method works in most cases, but it fails to copy the value of textareas and select elements. This patch replaces jQuery's clone() method with a wrapper that fills in the
// values after the fact.

// An interesting error case submitted by Piotr Przybył: If two <select> options had the same value, the clone() method would select the wrong one in the cloned box. The fix, suggested by Piotr
// and implemented here, is to use the selectedIndex property on the <select> box itself rather than relying on jQuery's value-based val().

(function (original) {
  jQuery.fn.clone = function () {
    var result           = original.apply(this, arguments),
        my_textareas     = this.find('textarea').add(this.filter('textarea')),
        result_textareas = result.find('textarea').add(result.filter('textarea')),
        my_selects       = this.find('select').add(this.filter('select')),
        result_selects   = result.find('select').add(result.filter('select'));

    for (var i = 0, l = my_textareas.length; i < l; ++i) $(result_textareas[i]).val($(my_textareas[i]).val());
    for (var i = 0, l = my_selects.length;   i < l; ++i) result_selects[i].selectedIndex = my_selects[i].selectedIndex;

    return result;
  };
}) (jQuery.fn.clone);
票数 37
EN

Stack Overflow用户

发布于 2011-07-16 06:41:00

根据首席执行官7的回答做了一个插件:

代码语言:javascript
复制
(function($,undefined) {
    $.fn.cloneSelects = function(withDataAndEvents, deepWithDataAndEvents) {
        var $clone = this.clone(withDataAndEvents, deepWithDataAndEvents);
        var $origSelects = $('select', this);
        var $clonedSelects = $('select', $clone);
        $origSelects.each(function(i) {
            $clonedSelects.eq(i).val($(this).val());
        });
        return $clone;
    }
})(jQuery);

只是简单地测试了一下,但看起来还行得通。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/742810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档