我想要实现的目标
我正在开发一些允许用户根据输入更改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对象的副本?
答案 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'
]
]
);