如何制作jQuery对象的副本

时间:2015-06-26 20:31:41

标签: javascript jquery copy

我想要实现的目标

我正在开发一些允许用户根据输入更改svg文件的内容,例如text,bold,italic等。然后,我希望用户能够恢复到原始模板,而无需再次重新加载文件。

我基本上想要一个对象的副本。

我尝试了什么

// Get template
$.get('../path/to/file.svg', function(svg_template)
{
    var svg = svg_template.getElementsByTagName('svg')[0];

    // Alter template
    $('#bold').click( function() {
        svg.text.attr('font-weight', 'bold');
    });

    // Return to original template
    $('#reset').click( function() {
        var svg = svg_template.getElementsByTagName('svg')[0];
    });

}, 'xml');

我已尝试过很多版本。

var svg = svg_template.getElementsByTagName('svg')[0];
var svgcopy = svg_template.getElementsByTagName('svg')[0];

// ...

$('#reset').click( function() {
    svg = svg = svg_copy;
});

我还读过jQuery中名为extend()的内容,但我得到了#34;非法调用"

var svg = svg_template.getElementsByTagName('svg')[0];
var svg_copy = jQuery.extend(true, {}, svg);

// ...

$('#reset').click( function() {
    svg = svg = svg_copy;
});

我还看了clone(),但是需要它的副本存在于DOM中,这要慢得多,要求我隐藏对象,并在我选择Dom时的对象需要它,甚至还是如何选择它而不再制作它的另一个克隆,因为放置一个等于克隆的变量会让我处于我开始的相同位置。

我找不到的相关问题没有答案。

Storing static copies of jQuery objects

我得到的行为

而不是副本,每次我创建一个等于该对象的变量时,它充当指向它的指针,该对象的代表,对一个对象的任何更改都会影响同样对象的其他变量

我的问题

如何制作jQuery对象的副本?

2 个答案:

答案 0 :(得分:2)

如果您只想将数据保存在元素中,我建议使用SELECT parent, COUNT(id) FROM table1 WHERE parent IN (select parent from table1) 选择svg,然后使用context.tableName.where(t => t.AnyColumn.Contains(...)) 将所有innerHTML作为字符串。然后,您可以使用var svg = $('svg');进行重置。希望它有所帮助!

答案 1 :(得分:0)

尽管Kogicon的回答没有起作用,但它确实启发了我的解决方案,我在这里为其他任何面临此问题的人发布。我序列化了对象,然后在需要它的副本时将其反序列化。这很容易理解。归功于Kogicon。

$this->loadComponent(
    'Auth',
    [
        'authorize' => 'Controller',
        'authError' => 'You are not allowed to go there',
        'authenticate' => [
            'Form' => [
                'fields' => [
                    'username' => 'username',
                    'email' => 'email',
                    'password' => 'password'
                ]
            ]
        ],
        'loginAction' => [
            'controller' => 'Pages',
            'action' => 'display',
            'home'
        ]
    ]
);