0

嗨,我在使用 JQuery 的 .append .prepend 方法时遇到问题我非常了解这些方法,但是当我尝试这样的代码时发生了一个奇怪的故障:

$("#nashgraphics-menu ul li a.toplevel-a")
 .prepend('<span class="main-navigation-button-left"></span><span class="main-navigation-button-body"><h1>');
$("#nashgraphics-menu ul li a.toplevel-a")
 .append('</h1></span><span class="main-navigation-dropdown-button-right"></span>');

它应该可以正常工作,但不幸的是它没有,我想知道为什么

注意:我说的是“链接”文本,这些标签应该包含该文本,但它没有

代码应该输出这个:

<span class="main-navigation-button-left"></span>
<span class="main-navigation-button-body"><h1>Link</h1></span>
<span class="main-navigation-dropdown-button-right"></span>

但它是这样的:

<span class="main-navigation-button-left"></span>
<span class="main-navigation-button-body"><h1></h1></span>Link<span class="main-navigation-dropdown-button-right"></span>

该文本“链接”应该在标签内

顺便说一下,这是我在 Wordpress 中使用的整个代码

;(function($){
$.fn.nashgraphics_menu = function(){
    $("#nashgraphics-menu ul li").each(function(index){
        $('#nashgraphics-menu ul li').addClass('toplevel-nochild');
        $('#nashgraphics-menu ul li ul li').removeClass('toplevel-nochild').addClass('nochild');
        $('#nashgraphics-menu ul li:has(ul)').removeClass('toplevel-nochild nochild').addClass('toplevel');
        $('#nashgraphics-menu ul li ul li:has(ul)').removeClass('toplevel nochild').addClass('haschild');

        $('#nashgraphics-menu ul li a').addClass('toplevel-nochild-a');
        $('#nashgraphics-menu ul li ul li a').removeClass('toplevel-nochild-a').addClass('nochild-a');
        $('#nashgraphics-menu ul li:has(ul) > a').removeClass('toplevel-nochild-a nochild-a').addClass('toplevel-a');
        $('#nashgraphics-menu ul li ul li:has(ul) > a').removeClass('toplevel-a nochild-a').addClass('haschild-a');
    });

    $("#nashgraphics-menu ul li a.toplevel-a").prepend('<span class="main-navigation-button-left"></span><span class="main-navigation-button-body"><h1>');
    $("#nashgraphics-menu ul li a.toplevel-a").append('</h1></span><span class="main-navigation-dropdown-button-right"></span>');

    $('#nashgraphics-menu ul li a.haschild-a').append('&nbsp; &raquo;');
};

})(jQuery);

4

2 回答 2

2

您正在考虑标记,但是当您修改页面时,您不是在处理标记,而是在处理 DOM 对象。

如果您的目标是将每个#nashgraphics-menu ul li a.toplevel-a元素放入您描述的结构中,请使用以下wrap功能

$("#nashgraphics-menu ul li a.toplevel-a").wrap('<span class="main-navigation-button-left"></span><span class="main-navigation-button-body"><h1></h1></span><span class="main-navigation-dropdown-button-right"></span>');

...虽然我不是 100% 确定wrap可以处理这样的复杂结构。您可能必须单独创建结构,如下所示:

$("#nashgraphics-menu ul li a.toplevel-a").each(function() {
    var $a = $(this),
        $wrapper;

    // Create the wrapper
    $wrapper = $('<span class="main-navigation-button-left"></span><span class="main-navigation-button-body"><h1></h1></span><span class="main-navigation-dropdown-button-right"></span>');

    // Insert it prior to the anchor
    $wrapper.insertBefore($a);

    // Move the anchor into the `h1`
    $wrapper.find('h1').append($a);
});

仅供参考,举一个不太复杂的例子wrap,这个:

$(".foo").wrap('<div class="bar"></div>');

...在每个带有 class 的元素周围放置一个divwith class 。"bar""foo"


回复您的评论:

是的,我也考虑过这一点,但我担心的是我想将文本包装在标签内,而不是标签本身

好吧,这有点不同:

$("#nashgraphics-menu ul li a.toplevel-a").each(function() {
    var $a = $(this);

    $a.html('<span class="main-navigation-button-left"></span><span class="main-navigation-button-body"><h1>' + $a.html() + '</h1></span><span class="main-navigation-dropdown-button-right"></span>');
});
于 2013-01-11T12:03:04.433 回答
0

浏览器或 jQuery 可能会添加结束标记以生成有效的 HTML,因为自从执行以来,它在prepend执行之前将无效append

看看wrap方法

描述:在匹配元素集中的每个元素周围包裹一个 HTML 结构。

于 2013-01-11T12:02:11.670 回答