JQuery - Как добавить один HTML-тег в какой-то HTML?

Я хочу вставить только один ‹span› перед текстом ниже (прямо перед ССЫЛКОЙ):

<li><a href="">LINK</a></li>

Таким образом, вышеизложенное становится

<li><a href=""><span>LINK</a></li>

Вот мой код JQuery:

$('#mainnav li a').prepend('<span>');

Когда я просматриваю код в firebug после, я вижу <span></span>, как мне просто получить открывающий тег span, а не закрывающий тег?


person Keith Donegan    schedule 11.05.2010    source источник
comment
Гм .... почему именно вы хотите создать искаженный HTML?   -  person cletus    schedule 11.05.2010
comment
хорошо, я добавлю закрывающий тег, мне нужно сначала разобраться с открывающим тегом :|   -  person Keith Donegan    schedule 11.05.2010
comment
Вам следует пересмотреть свои настройки. Если он основан на создании искаженного HTML, то его, вероятно, следует переписать на что-то более надежное (и XML/HTMLish). Или вы скрываете от нас конкретную причину?   -  person Boldewyn    schedule 11.05.2010


Ответы (5)


Во-первых, вам нужен искаженный HTML. jQuery усложнит, если не сделает невозможным, создание этого. Я бы посоветовал делать это в один шаг, а не в несколько. Пытаться:

$("li > a").each(function() {
  $(this).contents().wrapAll("<span>");
});

Вход:

<ul>
  <li><a href="...">testing</a></li>
  <li><a href="...">rich <b>content</b> with <i>inner tags</i></a></li>
</ul>

Выход:

<ul>
  <li><a href="..."><span>testing</span></a></li>
  <li><a href="..."><span>rich <b>content</b> with <i>inner tags</i></span></a></li> 
</ul>
person cletus    schedule 11.05.2010

Я столкнулся с проблемой, когда я использовал сторонний API, который использовал php curl для размещения плоского HTML на моей веб-странице. В возвращенном API HTML были некоторые искаженные теги span, которые просто убивали мой рендеринг в IE. Я использовал функцию replaceWith() Jquery, чтобы решить эту проблему. Вот пример:

Неправильный HTML: (обратите внимание на неоткрытый тег span)

<a class="aa_float_right aa_navlink" href="http:whatever">My Account</a></span> 

Мое решение:

$('.aa_navlink').replaceWith('<span class="test"><a class="aa_float_right aa_navlink" href="http:whatever">My Account</a>');

Результирующий HTML:

<span class="test"><a class="aa_float_right aa_navlink" href="http:whatever">My Account</a></span>

БУМ, теперь у нас есть хорошо сформированный HTML, нет, спасибо, такой дрянной сторонний API (и я имею в виду действительно дрянной).

Это исправление было предоставлено мне разработчиками из SaltWater Co..

person Brendan    schedule 01.10.2012

Я не знаю, зачем вам это нужно, но это можно сделать так,

$('#mainnav li a').html(function(i,v){
   return '<span>' + v;
})
person Reigel    schedule 11.05.2010

Когда вы используете prepend, вы добавляете на страницу не текст разметки, а элементы. Элементы не имеют тегов «начало» и «конец», элементы есть элементы. Если вы хотите обернуть кучу элементов в span (я предполагаю, что вы этого хотите, если вы хотите вставить его начало в одном месте, а конец в другом), вам нужно добавить диапазон в контейнер, а затем переместите в него элементы.

Например, это перемещает все ссылки из элемента foo и перемещает их в диапазон внутри container:

var stuff;
var container;

stuff = $('#foo a');
span = $("<span style='background-color: yellow'>");
span.append(stuff);
$('#container').append(span);
person T.J. Crowder    schedule 11.05.2010

Многие методы jQuery предназначены для автоматического создания элементов только из наполовину написанных тегов, например, "<span>" для .prepend() приведет к тому, что в DOM будет добавлен весь элемент span. Или, как вы увидите в Firebug, "<span></span>" вставляется первым в элемент привязки.

Я не понимаю, почему вы хотите создать недопустимый HTML, но если вам нужно, вы можете сделать это следующим образом:

$("li > a").html("<span>"+$("li > a").html());

Или, как предлагает Рейгель, с анонимной функцией к методу .html() (свой ответ я написал довольно быстро и, очевидно, непродуманно):

$("li > a").html(function (idx, html) {
    return "<span>" + html;
});

В противном случае может показаться, что вы хотите обернуть содержимое элемента привязки в диапазон. В этом случае вместо этого следует использовать один из jQuery обтекание методы:

$("li > a").wrap("<span>");

Вы не должны сами создавать как начальный, так и закрывающий элемент (при использовании jQuery).

person Sune Rasmussen    schedule 11.05.2010