Javascript 将jQuery克隆的虚拟元素数组转换为单个对象
考虑以下几点:Javascript 将jQuery克隆的虚拟元素数组转换为单个对象,javascript,jquery,Javascript,Jquery,考虑以下几点: var final = $(); virtual_elements.forEach(item => { $(final).append(item); }); 我有一个生成HTML文本块的模板函数,还有一些简单的数据 function template(item) { let HTML = `<div>`; HTML += `<span>${item}</span>`; HTML += `</div
var final = $();
virtual_elements.forEach(item => {
$(final).append(item);
});
我有一个生成HTML文本块的模板函数,还有一些简单的数据
function template(item) {
let HTML = `<div>`;
HTML += `<span>${item}</span>`;
HTML += `</div>`;
return HTML;
}
var data = [
{ name: 'foo' },
{ name: 'bar' },
{ name: 'baz' },
];
因此,我最终得到了一个DOM对象数组,其中每一个对象都可以与$(target).append(element)
或$(element).appendTo(target)
结合使用
然而,我试图实现的是将它们都变成一个对象,也可以附加到某个地方
有没有办法创建某种可以附加到的空jQuery对象?我尝试了以下方法:
var final = $();
virtual_elements.forEach(item => {
$(final).append(item);
});
或
但这两种情况都会导致一个空对象
我也试过:
var final;
virtual_elements.forEach((item, index) => {
if (index === 0) { final = item; }
else { $(item).insertAfter(final) }
});
但它会生成一个包含单个项的对象
PS:将所有普通文本粘在一起,然后使用
$。parseHTML
对我来说不是一个选项,因为我需要在数据中的每个项中运行jQuery方法,这些方法仅适用于DOM节点,而不是纯文本。为了简单起见,我在代码中省略了这一点,但一个简单的示例是(在克隆元素之后):
然后创建最终对象:
var final = {};
elements.forEach((item, index) => {
final[index] = item;
});
您可以使用诸如
$(final).replaceWith(target)
或$(target).append(final)
或简单地$(data.map(x=>template(x.name)))
@Andreas我需要在克隆对象后首先对其进行操作,因此无法直接使用map函数。另外,您建议我在空的var final=$()
对象上使用$.add()
的确切位置是什么?克隆(false)部分毫无意义$(html)
将html
中的标记转换为实际的DOM节点(包装在jQuery对象中)。然后克隆它们,并仅存储克隆。使用$(html)
创建的元素将被丢弃const virtual_elements=$(data.map(x=>$(template(x.name)))
执行完全相同的操作。@Andreas$(html)
不是jQuery方法。$()
中的html
是我在forEach循环中声明的变量。我想你误解了我的密码。另外,检查我问题的PS部分。我首先需要将这个纯文本转换为DOM节点,这样我就可以对每个项使用jQuery操作方法。在完成所有这些之后,我最终得到了3个或更多的jQuery对象,我需要将它们转换为一个。“需要将此纯文本转换为DOM节点”-这已经发生在$(html)
或简单地$(data.map(x=>template(x.name)))
@Andreas我需要在首先克隆对象之后对它们进行操作,所以我不能直接使用map函数。另外,您建议我在空的var final=$()
对象上使用$.add()
的确切位置是什么?克隆(false)部分毫无意义$(html)
将html
中的标记转换为实际的DOM节点(包装在jQuery对象中)。然后克隆它们,并仅存储克隆。使用$(html)
创建的元素将被丢弃const virtual_elements=$(data.map(x=>$(template(x.name)))
执行完全相同的操作。@Andreas$(html)
不是jQuery方法。$()
中的html
是我在forEach循环中声明的变量。我想你误解了我的密码。另外,检查我问题的PS部分。我首先需要将这个纯文本转换为DOM节点,这样我就可以对每个项使用jQuery操作方法。完成所有这些之后,我最终得到了3个或更多jQuery对象,我需要将它们转换为一个。“需要将此纯文本转换为DOM节点”-这在$(html)
$(some-item).attr('src', '<iframe src="youtube.com/blabla" and some other unescaped single or double quotes here>');
var one = $('<div><span>foo</span></div>').clone();
var two = $('<div><span>foo</span></div>').clone();
var three = $('<div><span>foo</span></div>').clone();
/// store these objects and do something with them.
var all = $('<div><span>foo</span></div><div><span>bar</span></div><div><span>baz</span></div>').clone();
data.forEach(item => {
let html = template(item.name);
virtual_elements.push( $(html).clone(false)[0] ); // add [0] store as plain javascript object here
virtual_elements.push( $.parseHTML(html) ); // this also works
});
var final = {};
elements.forEach((item, index) => {
final[index] = item;
});