使用JQuery将多组元素包装在一个Div中

发布于 2024-08-14 01:12:32 字数 930 浏览 11 评论 0原文

我正在开发一个下拉菜单,需要使用 JQuery 改变现有的 html 标记以使其适合设计。

这是一个简化的示例: 将所有包含多个“li”的“ul”包装在一个 div 中(在同一个 div 中,而不是每个 UL 一个 div)。

<ul>
    <li>foo</li>
</ul>
<ul>
    <li>foo</li>
    <li>foo</li>
</ul>
<ul>
    <li>foo</li>
    <li>foo</li>
</ul>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<script>
my_selection = [];
i = 0;
// find all ul's that have more than one li
$("ul").each(function(){
    if($(this).find("li").length > 1){
        // add this to my_selection
        my_selection[i] = $(this);
        i++;
    } // if
}); // each

// wrap my_selection in div tags
$(my_selection).wrapAll(document.createElement("div"));
</script>

上面的代码给出了这个萤火虫错误:

“节点无法插入层次结构中的指定点”代码:“3”

我怎样才能让它工作?

I'm working on a dropdown menu and need to mutate the existing html markup with JQuery to make it fit the design.

Here is a simplified example:
Wrap all "ul's" that contain more than one "li" in a div (in the same div, NOT one div for each UL).

<ul>
    <li>foo</li>
</ul>
<ul>
    <li>foo</li>
    <li>foo</li>
</ul>
<ul>
    <li>foo</li>
    <li>foo</li>
</ul>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

<script>
my_selection = [];
i = 0;
// find all ul's that have more than one li
$("ul").each(function(){
    if($(this).find("li").length > 1){
        // add this to my_selection
        my_selection[i] = $(this);
        i++;
    } // if
}); // each

// wrap my_selection in div tags
$(my_selection).wrapAll(document.createElement("div"));
</script>

The above code gives this firebug error:

"Node cannot be inserted at the specified point in the hierarchy" code: "3"

How can I make it work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

掩耳倾听 2024-08-21 01:12:32

这将是一种更简洁的方法:

$('ul:has(li)').wrap('<div></div>');

首先,您不需要创建节点,只需向 jQuery 提供包装字符串即可。
其次,在此实例中使用 :has 选择器来减少示例中的 each 功能。
最后,(这取决于您想要的功能)您可能想要使用 wrap 而不是 wrapAll

编辑:
另一种选择是从相反的方向来处理它。获取

  • 标签,然后获取
      父级:
  • $('li:not(:only-child)').parent().filter('ul').wrap('<div></div>');
    

    This would be a much cleaner approach:

    $('ul:has(li)').wrap('<div></div>');
    

    First, you don't need to create the node, just provide the wrapping string to jQuery.
    Second, use the :has selector in this instance to cut down on the each functionality in your example.
    Finally, (this will depend on your intended functionality) you may want to use wrap instead of wrapAll.

    EDIT:
    Another option would be to approach it from the other way around. Get the <li> tags then grab the <ul> parent:

    $('li:not(:only-child)').parent().filter('ul').wrap('<div></div>');
    
    就是爱搞怪 2024-08-21 01:12:32

    这有点像黑客。

    <script>
    jQuery( function() {
        my_selection = [];
    
        i = 0;
        n = 0;
        jQuery( 'ul' ).each( function() {
            var ul = jQuery( this );
            if ( ul.children().length > 1 ) {
                my_selection[n++] = 'ul:eq(' + i + ')';
            }
            ++i;
        } );
    
        jQuery( my_selection.join( ',' ) ).wrapAll( document.createElement( 'div' ) );
    } );
    </script>
    

    This is a bit of a hack.

    <script>
    jQuery( function() {
        my_selection = [];
    
        i = 0;
        n = 0;
        jQuery( 'ul' ).each( function() {
            var ul = jQuery( this );
            if ( ul.children().length > 1 ) {
                my_selection[n++] = 'ul:eq(' + i + ')';
            }
            ++i;
        } );
    
        jQuery( my_selection.join( ',' ) ).wrapAll( document.createElement( 'div' ) );
    } );
    </script>
    
    执笏见 2024-08-21 01:12:32

    我不确定 jQuery 是否可以将数组作为选择器。在$(my_selection)中,my_selection不是一个jQuery对象,而是一个对象数组。您可以首先尝试使用 var my_selection = $(''); 生成 jQuery 对象。 ... my_selection.add($(this));。

    另外,使用 .wrapAll() 方法,您可以只使用:.wrapAll('

    ');

    I'm not sure if jQuery can take arrays as selectors. In $(my_selection), my_selection is not a jQuery object but an array of objects. You can try generating jQuery objects in the first place, using var my_selection = $(''); ... my_selection.add($(this));.

    Also, with .wrapAll() method, you can just use: .wrapAll('<div></div>');.

    私野 2024-08-21 01:12:32

    您的代码中有一个错误,试图用 DIV 包装您的 LI。

    <script>
    my_selection = [];
    i = 0;
    // find all ul's that have more than one li
    $("ul").each(function() {
        var $ul = $(this);
        if ($ul.find("li").length > 1){
            // add this to my_selection
            my_selection[i] = $ul;
            i++;
        } // if
    });
    
    // wrap my_selection in div tags
    $(my_selection).wrap(document.createElement("div"));
    </script>
    

    You have a bug in your code, attempting to wrap your LI's by DIV.

    <script>
    my_selection = [];
    i = 0;
    // find all ul's that have more than one li
    $("ul").each(function() {
        var $ul = $(this);
        if ($ul.find("li").length > 1){
            // add this to my_selection
            my_selection[i] = $ul;
            i++;
        } // if
    });
    
    // wrap my_selection in div tags
    $(my_selection).wrap(document.createElement("div"));
    </script>
    
    软的没边 2024-08-21 01:12:32

    回答这个问题的时候有点忙,抱歉给大家带来了一些问题。下面正确解决了这个问题。

    <script type="text/javascript">
    jQuery( function() {
        jQuery( 'ul' ).find( 'li:eq(1)' ).parent().wrapAll( '<div></div>' );
    } );
    </script>
    

    编辑:我将li:gt(0)更改为li:eq(1),它们都有效,但其中一个更有意义。

    很简单,它遍历所有的 ul 和他们的孩子,它试图抓住第二个孩子。如果找到第二个子级,则返回到其父级并将其添加到wrapAll 方法中。

    编辑: 看起来如果你编辑你的帖子超过 8 次,它就会变成一个社区 Wiki,很有趣。

    I was a bit busy when I answered this question, sorry for all the problems. This following solves the problem correctly.

    <script type="text/javascript">
    jQuery( function() {
        jQuery( 'ul' ).find( 'li:eq(1)' ).parent().wrapAll( '<div></div>' );
    } );
    </script>
    

    Edit: I changed li:gt(0) to li:eq(1), they both work, but one makes more sense.

    It's simple, it goes through all the ul's and their children, it tries to grab the 2nd child. If the 2nd child is found it then goes back to it's parent to add it to the wrapAll method.

    Edit: It looks like if you edit your post more than 8 times times it becomes a Community Wiki, interesting.

    旧时浪漫 2024-08-21 01:12:32

    这些都是很好的答案。但我注意到您的脚本不在 $(document).ready(function(){...}) 内,并且您似乎验证了此错误仍然存​​在于其他未包装的代码中在就绪函数中。

    我尝试并发现 William 的代码有效(对他+1),但由于我的强迫症,我把它清理了一下

    $(document).ready(function(){
     my_selection = [];
     $('ul').each(function(i){
      if ($(this).find('li').length > 1 ){
       my_selection.push(['ul:eq(' + i + ')']);
      }
     });
     $( my_selection.join(',')).wrapAll('<div class="wrapper"></div>');
    })
    

    These are all great answers. But I notice that your script is not inside a $(document).ready(function(){...}) and you seemed to verify this error still exists with other code that wasn't wrapped in the ready function.

    I tried and found that William's code worked (+1 to him), but because of my OCD I cleaned it up a bit

    $(document).ready(function(){
     my_selection = [];
     $('ul').each(function(i){
      if ($(this).find('li').length > 1 ){
       my_selection.push(['ul:eq(' + i + ')']);
      }
     });
     $( my_selection.join(',')).wrapAll('<div class="wrapper"></div>');
    })
    
    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文