Если вам нужно сделать это, то почему бы просто не использовать jQuery для замены каждого элемента h2
якорем a
, а затем добавить <br />
после этого?
$('h2').after('<br />').replaceWith(function() {
return $('<a>', {
href: '#',
text: $(this).text()
});
});
Гораздо лучше и чище, без необходимости разбирать HTML с помощью регулярных выражений. В качестве альтернативы, если вам нужен новый элемент ul
со всеми тегами h2
, используйте это:
var ul = $('<ul>');
$('h2').each(function(){
$('<a>', {
text: $(this).text(),
href: '#'
}).wrap('<li>').parent().appendTo(ul);
});
Кроме того, якоря и теги <br>
в списках ul
недопустимы - почему бы вместо этого не использовать элементы списка li
?
На самом деле, лучший способ выполнить то, что вы пытаетесь сделать здесь, - это использовать код на стороне сервера для генерации #hash
и id
для каждого из якорей и h2
элементов. Однако, если вы хотите сделать это с Javascript на стороне клиента, то это будет лучше:
var ul = $('<ul>');
$('#wrapper h2').each(function(){
var t = $(this);
$('<a>', {
text: t.text(),
href: '#',
click: function(e){
$('body').animate({scrollTop: t.offset().top}, 'fast');
e.preventDefault();
}
}).wrap('<li>').parent().appendTo(ul);
}).prependTo('.left-col');
Кроме того, вы можете скрыть все элементы p
после каждого элемента h2
и отображать их только при нажатии на элемент h2
$('.left-col p').hide();
$('.left-col h2').click(function(){
$(this).nextUntil('h2').toggle();
});
Функции fadeToggle()
и slideToggle()
также доступны, если вы хотите что-то более необычное.