我试图用jQuery获取所选对象的HTML。我知道.html()函数;问题是我需要包含所选对象的HTML(在本例中为表行,其中.HTML()仅返回行内的单元格)。
我四处搜索,发现了一些非常“黑客”类型的方法来克隆对象,将其添加到新创建的div等,但这似乎真的很肮脏。有没有更好的方法,或者jQuery(1.4.2)的新版本是否提供任何类型的outerHtml功能?
我试图用jQuery获取所选对象的HTML。我知道.html()函数;问题是我需要包含所选对象的HTML(在本例中为表行,其中.HTML()仅返回行内的单元格)。
我四处搜索,发现了一些非常“黑客”类型的方法来克隆对象,将其添加到新创建的div等,但这似乎真的很肮脏。有没有更好的方法,或者jQuery(1.4.2)的新版本是否提供任何类型的outerHtml功能?
当前回答
简单的解决方案。
var myself = $('#div').children().parent();
其他回答
另一个类似的解决方案添加了临时DOM对象的remove()。
我在寻找问题的答案时遇到了这个问题,我试图删除一个表行,然后将其添加回表的底部(因为我正在动态创建数据行,但希望在底部显示“添加新记录”类型的行)。
我也有同样的问题,因为它正在返回innerHtml,因此缺少TR标记,该标记保存了该行的ID,这意味着不可能重复该过程。
我发现的答案是jquery remove()函数实际上返回了它删除的元素作为对象。所以,要删除并重新添加一行,就这么简单。。。
var a = $("#trRowToRemove").remove();
$('#tblMyTable').append(a);
如果您没有删除该对象,但希望将其复制到其他地方,请改用clone()函数。
使用普通JavaScript非常简单。。。
document.querySelector('#selector')
又短又甜。
[].reduce($('.x'), function(i,v) {return i+v.outerHTML}, '')
或借助箭头功能更甜蜜的事件
[].reduce.call($('.x'), (i,v) => i+v.outerHTML, '')
或者根本没有jQuery
[].reduce.call(document.querySelectorAll('.x'), (i,v) => i+v.outerHTML, '')
或者如果你不喜欢这种方法,检查一下
$('.x').get().reduce((i,v) => i+v.outerHTML, '')
我做了这个简单的测试,outerHTML是tokimon解决方案(没有克隆),outerHTML2是jessica解决方案(克隆)
console.time("outerHTML");
for(i=0;i<1000;i++)
{
var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML();
}
console.timeEnd("outerHTML");
console.time("outerHTML2");
for(i=0;i<1000;i++)
{
var html = $("<span style='padding:50px; margin:50px; display:block'><input type='text' title='test' /></span>").outerHTML2();
}
console.timeEnd("outerHTML2");
在我的chromium(版本20.0.1132.57(0))浏览器中的结果是
outerHTML:81ms外部HTML2:439ms
但是如果我们使用tokimon解决方案而不使用本机outerHTML函数(现在几乎每个浏览器都支持该函数)
我们得到
outerHTML:594ms外部HTML2:332ms
在现实世界的例子中会有更多的循环和元素,所以完美的组合应该是
$.fn.outerHTML = function()
{
$t = $(this);
if( "outerHTML" in $t[0] ) return $t[0].outerHTML;
else return $t.clone().wrap('<p>').parent().html();
}
所以clone方法实际上比wrap/unwrap方法更快(jquery 1.7.2)