【问题标题】:jQuery - get all divs inside a div with class ".container"jQuery - 使用类“.container”获取 div 中的所有 div
【发布时间】:2011-05-12 12:06:15
【问题描述】:

场景:

我有一个包含链接的菜单:

Main Menu Item
--------------
Sub: Show Grid > SubSub: <a>Show #first</a>
                         <a>Show #second</a>
                         <a>Show #third</a>

现在我需要找到所有带有 css #ID 的 div,它们是 .container div 中的第一级 DOM 元素。这些元素应附加到“子:显示网格”并通过单击添加一个类。

<!-- The mark up -->
<div class="container">
    <div id="first">1st</div>
    <div id="second">2nd</div>
    <div id="third">3rd</div>
</div>

问题:

  • 如何使用 jQuery 找到具有(未定义/未知)#ID 的第一级 div?
  • 如何与 php 中的结果进行交互 - 我会得到一个数组作为结果来构建 SubSub 菜单吗?

提前致谢!


编辑#1

为了更清楚我要做什么 - 使用伪代码:

$divs_received_from_jquery_fn = 'how do I get the divs (IDs?) as array(?) and interact with them in the following code?';
foreach ( $divs_received_from_jquery_fn as $div )
{
    add_menu_item( array( 
         'parent' => 'Sub: Show Grid'
        ,'name'   => 'Show #'.$div
        ,'href'   => ''
        ,'meta'   => array( 
                        'onclick' => 'jQuery(".container #".$div).toggleClass("showgrid");'
         ) 
    ) );
}

编辑#2

“现实世界”的例子。输出是 a-link 的 onclick 事件。我的问题是我想为.container div 下方的每个div[id] 调用函数foreach,并且根本不知道如何与javascript 和php 正确交互。

?>
<script type="text/javascript">
    jQuery(".container > div[id]").each(function(){
        var context = $(this);
        <?php 
        // SHOWGRID - parts
        // @since v0.3
        $wp_admin_bar->add_menu( // trigger the function via the global $wp_admin_bar var that calls the class
            array(
                 'parent'   => 'showgrid' // parent menu item
                ,'id'       => 'showgrid - ' + this.id // menu item ID
                ,'title'    => sprintf( // menu item label
                     __( '%1$s show grid parts %2$s%3$s', OXO_TEXTDOMAIN )
                    ,'<span style="background: none;">'
                    ,'<span class="showgridparts-on hide">&#x2714;</span>'
                    ,'<span class="showgridparts-off">&times;</span>' 
                 )
                ,'href'     => '' // stays empty to not trigger anything
                ,'meta'     => array( // HERE GOES THE ACTUAL jQuery FUNCTION
                    'onclick'   => 'jQuery("#" + this.id).toggleClass("showgrid"); jQuery(".showgridparts-on").toggleClass("hide"); jQuery(".showgridparts-off").toggleClass("hide"); return false;'
                 )
            ) 
        );
        ?>
    });
</script>
<?php

【问题讨论】:

    标签: jquery dom


    【解决方案1】:

    已知 ID

    $(".container > #first");
    

    或

    $(".container").children("#first");
    

    或者因为 ID 在单个文档中应该是唯一的:

    $("#first");
    

    最后一个当然是最快的。

    未知 ID

    既然你说你不知道他们的 ID top 一对上面的选择器(#first 写在哪里),可以改成:

    $(".container > div");
    $(".container").children("div");
    

    最后一个(前三个选择器中)只使用ID的当然不能这样改。

    如果您还需要仅过滤掉那些定义 ID 属性的子 DIV 元素,您可以这样编写选择器:

    $(".container > div[id]");
    $(".container").children("div[id]");
    

    附加点击处理程序

    添加以下代码以将点击处理程序附加到您的任何首选选择器:

    // use selector of your choice and call 'click' on it
    $(".container > div").click(function(){
        // if you need element's ID
        var divID = this.id;
        cache your element if you intend to use it multiple times
        var clickedDiv = $(this);
        // add CSS class to it
        clickedDiv.addClass("add-some-class");
        // do other stuff that needs to be done
    });
    

    CSS3 选择器规范

    我还想指出 jQuery 使用的 CSS3 selector specification。它将在将来对您有很多帮助,因为可能有一些您根本不知道的选择器,并且可以使您的生活变得更加轻松。

    在您编辑的问题之后

    即使您编写了一些伪代码,我也不确定我是否知道您在追求什么……无论如何。有些部分还是可以回答的:

    $(".container > div[id]").each(function(){
        var context = $(this);
        // get menu parent element: Sub: Show Grid
        // maybe I'm not appending to the correct element here but you should know
        context.appendTo(context.parent().parent());
        context.text("Show #" + this.id);
        context.attr("href", "");
        context.click(function(evt){
            evt.preventDefault();
            $(this).toggleClass("showgrid");
        })
    });
    

    最后一个context 用法可以组合成一个链式的:

    context.text(...).attr(...).click(...);
    

    关于 DOM 元素

    您始终可以从 jQuery 结果集中获取底层 DOM 元素。

    $(...).get(0)
    // or
    $(...)[0]
    

    将为您提供 jQuery 结果集中的第一个 DOM 元素。 jQuery 结果始终是一组元素,即使其中没​​有或只有一个。

    但是当我使用.each() 函数并提供一个匿名函数来调用集合中的每个元素时,this 关键字实际上是指 DOM 元素。

    $(...).each(function(){
        var DOMelement = this;
        var jQueryElement = $(this);
        ...
    });
    

    我希望这能为您清除一些事情。

    【讨论】:

    • 感谢您的详细回答+1。 CSS3 目前不适合我的情况。我扩展/编辑了 Q,通过一个伪代码示例为您提供详细的见解,说明我正在尝试实现的目标。
    • @kaiser:如果你使用 jQuery,CSS3 是它在编写选择器时支持的东西。它们根本不需要浏览器支持。 jQuery 将允许您使用它们。
    • @keiser:检查我编辑的答案。关于您关于 DOM 元素的问题。是的,您总是可以从 jQuery 集合中获取纯 DOM 元素。在答案中查看我的附加信息。
    • @keiser:Javascript 和 PHP 之间没有太大关系。 Javascript 在客户端执行,PHP 在服务器上执行。除非您将一些数据发回服务器,否则您的服务器端 PHP 将完全不知道客户端上发生的进程。也许你认为你可以在服务器上执行一些事情,然后将其余的发送到客户端,在那里进行一些处理,然后在服务器上继续。这不是锄头。或者至少不是开箱即用。可以实现很多目标,但您会想到的场景越复杂,您需要的知识就越多。
    • @kaiser:我很高兴事情开始对你有用。不客气
    【解决方案2】:

    要获取“容器”下的所有 div,请使用以下命令:

    $(".container>div")  //or
    $(".container").children("div");
    

    您可以指定特定的#id 而不是div 来获取特定的。

    您说您想要一个带有“未定义”ID 的 div。如果我理解正确,以下将实现此目的:

    $(".container>div[id=]")
    

    【讨论】:

    • +1 - 我用伪代码示例更新了 Q 以显示我与 jQuery 结果交互的问题所在。
    【解决方案3】:

    要在 .container 元素内立即单击 div 时设置类,您可以使用:

    <script>
    $('.container>div').click(function () {
            $(this).addClass('whatever')
        });
    </script>
    

    【讨论】:

    • +1 - 我用伪代码示例更新了 Q 以显示我与 jQuery 结果交互的问题所在。
    【解决方案4】:

    来自http://api.jquery.com/jQuery/

    选择器上下文 默认情况下,选择器从文档根目录开始在 DOM 中执行搜索。但是,可以使用 $() 函数的可选第二个参数为搜索提供替代上下文。例如,要在事件处理程序中进行搜索,可以像这样限制搜索:

    $( "div.foo" ).click(function() { 
       $( "span", this ).addClass( "bar" );
    });
    

    当对 span 选择器的搜索被限制在 this 的上下文中时,只有被点击的元素内的 span 才会获得额外的类。

    因此,对于您的示例,我建议如下:

    $("div", ".container").each(function(){
         //do whatever
     });
    

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多