【问题标题】:Finding the id of a parent div using Jquery使用 Jquery 查找父 div 的 id
【发布时间】:2010-10-07 10:54:56
【问题描述】:

我有一些这样的html:

<div id="1">
    <p>
        Volume = <input type="text" />
        <button rel="3.93e-6" class="1" type="button">Check answer</button>
    </p>
    <div></div>
</div>

还有一些这样的 JS:

$("button").click(function () {
    var buttonNo = $(this).attr('class');
    var correct = Number($(this).attr('rel'));

    validate (Number($("#"+buttonNo+" input").val()),correct);
    $("#"+buttonNo+" div").html(feedback);
});

我真正想要的是,如果我不必在按钮上使用 class="1"(我知道数字类无效,但这是一个 WIP!),所以我可以确定 buttonNo基于父 div 的 id。在现实生活中,有多个部分看起来像这样。

  1. 如何找到作为按钮的 div 的 id。

  2. 在按钮代码中存储答案的更语义化方式是什么。我想让它尽可能地万无一失,让非程序员在不破坏任何东西的情况下复制和粘贴!

【问题讨论】:

    标签: jquery dom semantics


    【解决方案1】:

    获取父div的id:

    $(buttonSelector).parents('div:eq(0)').attr('id');
    

    另外,你可以重构你的代码:

    $('button').click( function() {
     var correct = Number($(this).attr('rel'));
     validate(Number($(this).siblings('input').val()), correct);
     $(this).parents('div:eq(0)').html(feedback);
    });
    

    现在不需要按钮类

    解释
    eq(0),表示您将从 jQuery 对象中选择一个元素,在本例中为元素 0,即第一个元素。 http://docs.jquery.com/Selectors/eq#index
    $(selector).siblings(siblingsSelector) 将选择所有与兄弟姐妹选择器匹配的兄弟姐妹(具有相同父元素的元素)http://docs.jquery.com/Traversing/siblings#expr
    $(selector).parents(parentsSelector) 将选择与父选择器匹配的选择器匹配的所有父元素。 http://docs.jquery.com/Traversing/parents#expr
    因此: $(selector).parents('div:eq(0)');将匹配选择器匹配的元素的第一个父 div。

    你应该看看 jQuery 文档,尤其是选择器和遍历:

    【讨论】:

    • 简单易行!为什么是 div:eq(0)?这是什么意思?
    • 我认为 'div:eq(0)' 将是错误的,如果这都包含在至少一个 div 中,因为您正在对 DOM 进行绝对遍历而不是相对遍历。如果第一个元素是“最接近”的父元素,那会很好,但这表明并非如此:tinyurl.com/bbegow
    • (因此我使用 parent() 代替)
    【解决方案2】:

    find() 和最接近的() 似乎比:

    $(this).parent().attr("id");
    

    【讨论】:

    • $(this).parent().parent().attr("id");?
    【解决方案3】:

    您可以在父 div 上使用 event delegation。或者使用closest方法找到按钮的父级。

    两者中最简单的可能是最接近的。

    var id = $("button").closest("div").prop("id");
    

    【讨论】:

    • 我真的很喜欢最接近,因为您可以执行类似 .closest("div.foo") 的操作,并且代码与结构无关。
    • Thx 我正要执行递归函数......然后我知道 jquery 已经有了一些东西......在我的例子中,我使用了 $("#" + id).closest("div. form-group") 来查找具有 form-group 类的父 div。
    【解决方案4】:
    $(this).parents('div').attr('id');
    

    【讨论】:

      【解决方案5】:

      http://jsfiddle.net/qVGwh/6/ 检查这个

         $("#MadonwebTest").click(function () {
          var id = $("#MadonwebTest").closest("div").attr("id");
          alert(id);
          });
      

      【讨论】:

        【解决方案6】:

        这可以通过以下方式轻松完成:

        $(this).closest('table').attr('id');
        

        您将它附加到表内的任何对象上,它会返回该表的 ID。

        【讨论】:

          【解决方案7】:

          1.

          $(this).parent().attr("id");
          

          2.

          方法一定有很多!一种可能是隐藏包含答案的元素,例如

          <div>
              Volume = <input type="text" />
              <button type="button">Check answer</button>
              <span style="display: hidden">3.93e-6&lt;/span>
              <div></div>
          </div>
          

          然后有与上面类似的 jQuery 代码来获取:

          $("button").click(function () 
          {
              var correct = Number($(this).parent().children("span").text());
              validate ($(this).siblings("input").val(),correct);
              $(this).siblings("div").html(feedback);
          });
          

          请记住,如果您将答案放在客户端代码中,那么他们可以看到它:) 最好的方法是在服务器端验证它,但对于范围有限的应用程序,这可能不是问题。

          【讨论】:

          • 我不知道如何在这个编辑器中格式化 HTML,但这似乎比 Pim 的 ('div:eq(0)') 东西更简单地获取父级;除非我在这里遗漏了一个微妙之处,否则 html 元素都有一个直接父级,您只需使用 parent() 即可获得。
          • parent 确实会返回最近的父级,但是,如果他决定要在问题周围但在 Div 内添加字段集或其他内容,会发生什么。
          • 实际上在他自己的例子中这将返回

          • 确实,如果添加更多 div,那么 'div:eq(0)' 可能是错误的。更改结构,更改解析它的代码 :) 是的,我将示例简化为示例所需的最小 html;它应该调用父母两次。
          • 由于某种原因,当我使用 parent() 时,我无法访问 attr(id),在我喜欢了一些父选择器之后,我不得不像 $(parent[0]).attr('id') 这样包装结果。
          【解决方案8】:

          JQUery 有一个 .parents() 方法用于向上移动 DOM 树,您可以从那里开始。

          如果您有兴趣以更语义化的方式执行此操作,我认为在按钮上使用 REL 属性不是在代码中语义定义“这就是答案”的最佳方式。我会推荐一些类似的东西:

          <p id="question1">
              <label for="input1">Volume =</label> 
              <input type="text" name="userInput1" id="userInput1" />
              <button type="button">Check answer</button>
              <input type="hidden" id="answer1" name="answer1" value="3.93e-6" />
          </p>
          

          $("button").click(function () {
              var correctAnswer = $(this).parent().siblings("input[type=hidden]").val();
              var userAnswer = $(this).parent().siblings("input[type=text]").val();
              validate(userAnswer, correctAnswer);
              $("#messages").html(feedback);
          });
          

          不太清楚你的验证和反馈是如何工作的,但你明白了。

          【讨论】:

            【解决方案9】:

            试试这个:

            $("button").click(function () {
                $(this).parents("div:first").html(...);
            });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多