有没有办法在 jQuery 或 javascript 中克隆表单字段值?

Posted

技术标签:

【中文标题】有没有办法在 jQuery 或 javascript 中克隆表单字段值?【英文标题】:Is there a way to clone form field values in jQuery or javascript? 【发布时间】:2011-03-16 02:35:01 【问题描述】:

jQuery 有一个clone() 函数,可以毫无问题地克隆实际表单,但它不会保留已输入到表单中的任何值。

有没有办法解决这个问题?

示例代码将不胜感激。

【问题讨论】:

你能提供更多的背景信息吗?快速测试在这里没有问题:jsfiddle.net/meGyg 我认为问题在于如果您通过表单更改数据,然后尝试克隆它。分叉你的小提琴:jsfiddle.net/F9aWu 尝试更改表单,然后单击克隆。 ya @[nick craver] 的解决方案工作正常,除了 textarea 部分 当我们开始直接修改valuechecked等属性时,表单控件的初始表示与DOM不同步。当我们克隆一个节点时,每个 DOM 节点的表示都会被复制,其中不包括对象属性,例如 value。一种解决方案是将每个表单控件的相关属性(值、选中、选定)复制到克隆节点中。另一种是在进行更改时修改元素。因此,不要使用 element.val('something'),而是执行 element.setAttribute('value', 'something'),它应该在克隆时找到。 【参考方案1】:

遇到了同样的问题,简单的解决方法:

// touch all input values
$('input:text').each(function() 
    $(this).attr('value', $(this).val());
);

var clones = $('input:text').clone();

诀窍在于,这将改变 DOM 树中的实际“值”属性,否则您输入的“即时”数据仅存在于 DOM 的“状态”中

【讨论】:

这个不需要转义吗? @ChrisStryczynski 我不这么认为,文本输入无法显示 html,您将其设置为之前已有的值,引号不是问题,因为您正在设置字符串属性值而不是打印纯 HTML 代码。 这对input:text有效,但是复选框、单选按钮、文本区域之类的呢?【参考方案2】:

根据笔记,这里有一个解决方案。形式如下:

<form id="old">
    <textarea>Some Value</textarea>
    <input type="text" value="Some Value" />
    <input type="checkbox" value="bob" checked />
    <br />
</form>

<input type="button" value="Clone" id="clone" />

这个 jQuery 可以工作,包括 textareas:

$( 'input#clone' ).click(
    function()
    
      $( 'form#old textarea' ).text( $( 'form#old textarea' ).val() )
      $("form#old").clone().attr( 'id', 'new_form' ).appendTo("body")

    
)

​演示:http://jsfiddle.net/Jux3e/

【讨论】:

【参考方案3】:

另一个解决 textarea 值不被克隆的简单方法是在 HTML 中包含以下 javascript 文件:https://github.com/spencertipping/jquery.fix.clone

它只是修补了克隆方法,因此您可以包含该文件,然后忘记它在那里。显然,克隆选择值也存在问题,同一个文件也解决了这个问题。

此文件链接至:http://bugs.jquery.com/ticket/3016。该错误已存在 4 年。

【讨论】:

【参考方案4】:

你可以使用这个 jQuery 插件。

/**
 * clone element, including the textarea part
 */


$.fn.clone2 = function(val1, val2) 
    // ret for return value, cur for current jquery object
    var ret, cur;
    ret = $(this).clone(val1, val2);
    cur = $(this);

    // copy all value of textarea
    ret.find('textarea').each(function() 
        var value_baru;

        // use name attribute as unique id
        value_baru = sek.find('[name="$name"]'.replace('$name', $(this).attr('name')))
                        .val();

        // set the new value to the textarea
        $(this).val(value_baru);
    );

    // return val
    return ret;

【讨论】:

【参考方案5】:

如果您需要复制字段本身,请检查这个小函数relCopy

【讨论】:

【参考方案6】:

发现了这个问题,写了这个包装器:

$.fn.cloneField = function(withDataAndEvents) 
var clones = [];
this.each(function()
    var cln = $(this).clone(withDataAndEvents);
    cln.val($(this).val());
    clones.push(cln.get(0));
);
return jQuery( clones ); ; 

【讨论】:

【参考方案7】:

使用此代码复制 textarea 值

clonedObject.find(textareaObject).val(originalObject.find(textareaObject).val());

【讨论】:

以上是关于有没有办法在 jQuery 或 javascript 中克隆表单字段值?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 WordPress 中关闭 jQuery noConflict 模式?

有没有办法用 css 或 jquery 删除或隐藏图像的一部分

有没有办法在 JavaScript 或 jQuery 的点击事件中调用特定的幻灯片图像

有没有办法在 javaScript 或 jQuery 或剑道网格中将“nb-NO”小数转换为“en-US”

有没有办法从 javascript 运行命令行实用程序? [复制]

PHP(或jQuery)有没有办法检查字符串是不是是人类可读的?