Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何复制jQuery对象_Javascript_Jquery_Copy - Fatal编程技术网

Javascript 如何复制jQuery对象

Javascript 如何复制jQuery对象,javascript,jquery,copy,Javascript,Jquery,Copy,我正在努力实现的目标 我正在研究一种允许用户根据输入修改svg文件的方法,例如文本、粗体、斜体等。然后,我希望用户能够恢复到原始模板,而无需再次重新加载文件 我基本上想要一个对象的副本 我尝试过的 // Get template $.get('../path/to/file.svg', function(svg_template) { var svg = svg_template.getElementsByTagName('svg')[0]; // Alter template

我正在努力实现的目标

我正在研究一种允许用户根据输入修改svg文件的方法,例如文本、粗体、斜体等。然后,我希望用户能够恢复到原始模板,而无需再次重新加载文件

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

我尝试过的

// 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()
,但是我得到了“非法调用”

我还研究了
clone()
,但是,DOM中存在一个需要复制的对象,这要慢得多,需要我隐藏该对象,并在需要时从DOM中选择该对象,即使如此,我如何选择该对象而不进行另一个克隆,因为放置一个等于克隆的变量会使我处于与开始时相同的位置

我能找到的唯一相关问题还没有回答

我得到的行为

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

我的问题


如何创建jQuery对象的副本?

如果您只是想将数据保存在元素中,我建议使用
var svg=$('svg')
选择svg,然后使用
var svg_save=svg.html()
将所有innerHTML作为字符串获取。然后可以使用
svg.html(svg\u save)进行重置。希望有帮助

虽然Kogicon的回答不起作用,但它确实启发了我的解决方案,我在这里为其他面临这个问题的人发布了这个解决方案。我序列化了对象,然后在需要它的副本时取消序列化。这很容易理解。功劳归于科吉孔

$.get(template_path, function(svg_template)
{ 
  var svg_original = svg_template.getElementsByTagName('svg')[0]; 
  var serializer = new XMLSerializer(); 
  var svg_copy = serializer.serializeToString(svg_original); 
  var svg = $.parseXML(svg_copy); svg = $.parseXML(svg_copy); 
  svg = svg.getElementsByTagName('svg')[0];}, 'xml');
}

看看api中的
clone()
,它不适合我要找的,我会用它更新我的问题。首先,正如我所读到的,只有在Dom中对其进行物理复制时,它才起作用。你不能有一个虚拟拷贝,这是理想的。其次,这需要我隐藏它,并从Dom中选择它。我认为这是可能的,但我想一定有一种方法可以在不进行Dom操作的情况下获得此对象的纯虚拟副本。另外,我不能将一个变量设置为克隆对象的值,因为它将是一个指针,然后我就回到了开始的位置。谢谢你的提醒。你可以克隆一个克隆,你也可以将响应包装在
$()
中,这样它就不必在domI中,你需要做几百次。这不会产生数百个克隆。如果您认为您有一个有效的解决方案,请发布一个答案。非常感谢。在完成
var svg_save=svg.html()之后,svg_save等于未定义。我不确定html()是否是正确的工具,但我喜欢将它存储在字符串中,这样它就必须是自己的副本。请看看你是否能让这个想法起作用。我自己试试。我从你的尝试中找到了一个解决办法。如果你能把这一点纳入你的回答,我将欣然接受<代码>$.get(模板路径,函数(svg_模板){var svg_original=svg_template.getElementsByTagName('svg')[0];var serializer=new XMLSerializer();var svg_copy=serializer.serializeToString(svg_original);var svg=$.parseXML(svg_copy);svg=svg=svg.getElementsByTagName('svg')[0];},'xml')
$.get(template_path, function(svg_template)
{ 
  var svg_original = svg_template.getElementsByTagName('svg')[0]; 
  var serializer = new XMLSerializer(); 
  var svg_copy = serializer.serializeToString(svg_original); 
  var svg = $.parseXML(svg_copy); svg = $.parseXML(svg_copy); 
  svg = svg.getElementsByTagName('svg')[0];}, 'xml');
}