获取包含属性的开始标记 - 没有innerHTML的outerHTML

Ric*_*fer 14 javascript jquery dom innerhtml outerhtml

我想从DOM中检索某个带有其属性的标记元素.例如,来自

<a href="#" class="class">
  link text
</a>
Run Code Online (Sandbox Code Playgroud)

我希望得到<a href="#" class="class">,可选择关闭</a>,作为字符串或其他对象.在我看来,这类似于检索.outerHTML没有的.innerHTML.

最后,我需要通过jQuery包装其他一些元素.我试过了

var elem = $('#some-element').get(0);
$('#some-other-element').wrap(elem);
Run Code Online (Sandbox Code Playgroud)

.get()返回包含其内容的DOM元素.也

var elem = $('#some-element').get(0);
$('#some-other-element').wrap(elem.tagName).parent().attr(elem.attributes);
Run Code Online (Sandbox Code Playgroud)

失败,因为elem.attributes返回a NamedNodeMap不能与jQuery一起工作,attr()我无法转换它.承认上面的例子不是很有意义,因为它们还复制了元素的不再唯一ID.但有什么简单的方法吗?非常感谢.

Aar*_*ion 16

对于未来的Google员工,有一种方法可以在没有jQuery的情况下执行此操作:

tag = elem.outerHTML.slice(0, elem.outerHTML.indexOf(elem.innerHTML));
Run Code Online (Sandbox Code Playgroud)

由于outerHTML包含开始标记后跟包含的镜像innerHTML,我们可以将outerHTML从0(开始标记的开头)子串到innerHTML开始的位置(开始标记的结尾),并且因为innerHTML是outerHTML的镜像,除了对于开始标记,只剩下开始标记!

这个适用于<br>标签,<meta>标签和其他空标签:

tag = elem.innerHTML ? elem.outerHTML.slice(0,elem.outerHTML.indexOf(elem.innerHTML)) : elem.outerHTML;
Run Code Online (Sandbox Code Playgroud)

因为innerHTML在自闭标签中是空的,并且indexOf('')总是返回0,所以上述修改检查是否存在innerHTML第一个.

  • ***这非常不安全***。例如 当**`elem.outerHTML ==='&lt;p&gt; p &lt;/ p&gt;'`**时。或任何其他情况,innerHTML的文本都是tagName的子集或其属性之一甚至是属性的值! (2认同)

jos*_*736 6

var wrapper = $('.class').clone().attr('id','').empty();
Run Code Online (Sandbox Code Playgroud)
  • 您可能想要更改选择器,使其与<a>您要查找的元素更完全匹配。
  • clone() 创建匹配元素的新副本,还可以选择复制事件处理程序。
  • 我过去attr经常清除元素的ID,以免重复ID。
  • empty()删除所有子节点(“ innerHTML”)。