2012-03-07 2 views
8

Я хотел бы получить определенный элемент тега со своими атрибутами из DOM. Например, изполучить открывающий тег, включая атрибуты - внешнийHTML без innerHTML

<a href="#" class="class"> 
    link text 
</a> 

Я хочу получить <a href="#" class="class">, возможно, с закрывающим </a>, либо в виде строки или какого-либо другого объекта. По-моему, это было бы похоже на извлечение .outerHTML без .innerHTML.

Наконец, мне нужно это, чтобы обернуть некоторые другие элементы через jQuery. Я попытался

var elem = $('#some-element').get(0); 
$('#some-other-element').wrap(elem); 

но .get() возвращает элемент DOM, включая его содержание. Также

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

терпит неудачу как elem.attributes возвращает NamedNodeMap, который не работает с JQuery-х attr(), и я не был в состоянии преобразовать его. Приняли, что приведенные выше примеры не очень понятны, поскольку они копируют также уникальный идентификатор элемента. Но есть ли простой способ? Большое спасибо.

+0

Просто клонировать узел с '.clone()', а затем удалить его с помощью .html() 'и удалить' id' и что еще вы хотите. – kirilloid

+0

$ ("a"). Clone(). Empty(). Attr ("externalHTML"); Чтобы решить первую проблему – Tuscan

+0

Спасибо @kirilloid, угадать, что Джош был только быстрее;) –

ответ

4
var wrapper = $('.class').clone().attr('id','').empty(); 
  • Вы можете изменить селектор более точно соответствовать <a> элемент, который вы ищете.
  • clone() создает новую копию согласованного элемента (элементов), необязательно копируя обработчики событий.
  • Я использовал attr, чтобы очистить идентификатор элемента, чтобы мы не дублировали идентификаторы.
  • empty() удаляет все дочерние узлы ('innerHTML').
+0

Gotta love jquery. –

+0

Удивительно.Большое спасибо, josh :) Любые проблемы с использованием '.clone()'? Некоторые говорят, что это не может быть исполнитель, но я не вижу другого решения. –

+0

Я думаю, что .clone() не полностью копирует весь объект, и какая-то ссылка существует, и если мы используем .remove() для клонированного объекта, он фактически удаляет исходный объект. Я страдаю этим вопросом один раз. –

11

Для будущих Googlers, есть способ сделать это без JQuery:

tag = elem.outerHTML.slice(0, elem.outerHTML.indexOf(elem.innerHTML)); 

С outerHTML содержит открывающий тег с последующим зеркалом того, что innerHTML содержит, мы можем подстроки в outerHTML из 0 (начало открытого тега), где начинается внутренний HTTML (конец открывающего тега), и поскольку innerHTML является зеркалом внешнегоHTML, за исключением открытого тега, останется только тег открытия!

Это один работает с <br> тегами, <meta> тегов и другими пустыми тегами:

tag = elem.innerHTML ? elem.outerHTML.slice(0,elem.outerHTML.indexOf(elem.innerHTML)) : elem.outerHTML; 

Поскольку innerHTML будет пустым в самозакрывающихся тегах, и indexOf('') всегда возвращает 0, вышеуказанные проверки модификации на наличие innerHTML первый.

+0

Это не работает с пустыми элементами: document.createElement ("strong"). ExternalHTML.slice (0, elem.outerHTML.indexOf (elem.innerHTML)) – Martin

+0

@Martin помещает объявление 'createElement' в переменную с именем' elem' и использовать тернарное выражение, которое я использовал выше, он возвращает ''. –

+0

@AaronGillion Хороший улов. Это можно было бы исправить путем поиска '><', если innerHTML - пустая строка. Это заставляет меня думать о другой проблеме: '' идентифицирует неправильный индекс для пробела. – MDMower

Смежные вопросы