.append .prepend问题

时间:2013-01-11 11:57:08

标签: jquery jquery-plugins jquery-selectors append prepend

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

$("#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的);

2 个答案:

答案 0 :(得分:2)

您正在考虑使用标记,但是在修改页面时您没有处理标记,而是处理DOM对象。

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

$("#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>');

...在课程div的每个元素周围添加"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>');
});

答案 1 :(得分:0)

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

看看wrap method

  

描述:围绕匹配元素集中的每个元素包装HTML结构。