javascript - 当单击某个元素或其子元素时,如何获取该元素的 ID?

标签 javascript jquery html

已更新

我想我可能无意中让这个问题变得困惑。这是一个更具体的更新,根据我迄今为止收到的评论和答案更新了代码。感谢所有花时间发表评论和回答的人。

如何获取 <div> 的 ID类(class) .button当我有 .button 的点击监听器时。如果.button或者单击它的任何子项,它应该返回该特定 div 的 ID类(class) .button .

这是我到目前为止所拥有的:New JSFiddle

HTML

<div class="row">
  <div id="b1" class="button">
    <h2>Button 1</h2>
  </div>
  <div id="b2" class="button">
    <h2>Button 2</h2>
  </div>
  <div id="b3" class="button">
    <h2>Button 3</h2>
  </div>
</div>

jQuery

var selected = "";

$('.button').on('click', function(e) {
  selected = e.target.id;

  $('.button').css('backgroundColor', '#becde5');
  $('#' + selected).css('backgroundColor', '#3b71c6');

  $('#selected').html(selected);
});

如果我点击<h2>,这几乎是正确的,但不会传播。该功能不起作用。但是,如果我单击 .button div 本身就可以工作。

初始问题

我正在尝试创建一个通用函数,可以识别从其父级单击监听器中选择的子级。子元素可能有自己的子元素,这些子元素都被视为同一元素的一部分,因此,如果选择了这些子元素中的任何一个,它们也应该从点击监听器中引发相同的响应。

这是我迄今为止所做工作的一个示例:JSFiddle

由三个按钮组成的 HTML,每个按钮都有一个子按钮 <h2>标记并分享 <div class="row">作为他们的 parent 。

<div class="row">
  <div class="b1 button">
    <h2 class="b1">Button 1</h2>
  </div>
  <div class="b2 button">
    <h2 class="b2">Button 2</h2>
  </div>
  <div class="b3 button">
    <h2 class="b3">Button 3</h2>
  </div>
</div>

监听 <div class="row"> 上的点击的 jQuery 。它检索单击元素的第一个类名并将其存储在变量中。在这种情况下引发的响应是 CSS 样式的更改 background-color尽管这是任意的,并且会根据函数的使用而改变。

var selected = "";

$('.row').on('click', function(e) {
  selected = e.target.className.split(" ")[0];

  $('.b1, .b2, .b3').css('backgroundColor', '#becde5');
  $("." + selected).css('backgroundColor', '#3b71c6');

  $('#selected').html(selected);
});
事实上,我向元素添加很多类纯粹是为了在单击时识别它们,这似乎不会很好地扩展,并且通常是一个不好的方法。此方法还意味着我始终必须将标识所选元素的类名称放在其 HTML class 的开头。属性。这可能会与使用相同方法的其他函数发生冲突。

是否有更好的方法来识别从其父级单击监听器中选择的子元素,其中子元素可能有其他子元素也需要监听器的相同响应?

最佳答案

根据编辑的问题进行编辑:

我认为您真正想要的是触发事件的元素的id
但是通过使用e.target,您将获得目标元素...它不一定是触发事件的元素。

参见this updated Fiddle .

因此,只需使用 $(this) 作为选择器来检索 id...使用 .attr("id")

;)



回答最初的问题:
为了确定可以“选择”的内容,我使用了“可点击”类。

为了避免使用 idclass 作为标识符来确定点击的内容,
data 属性可能很有用。

我使用了data-id...但是你可以使用任何你想要的,例如:data-selecteddata-target,并为其分配任何值。

在下面的代码中,我制作了两个完全相同的行,除了它们的 data-id 值。

var selected = "";

$('.clickable').on('click', function(e) {
    e.stopPropagation(); // To prevent bubbling.

    // Reset all bg colors
    $('.button').css('backgroundColor', 'initial');
    $('.row').css('backgroundColor', 'initial');

    // Find exactly what was clicked
    if ($(this).hasClass("row")) {
        var row = $(this).data("id");
        selected = row + " (whole)";
    }

    if ($(this).hasClass("button")) {
        // Find in which row
        var row = $(this).closest(".row").data("id");
        var btn = $(this).data("id");
        selected = btn + " in " + row;
    }

    // Pale all buttons
    $('.button').css('backgroundColor', '#becde5');
    // Change bg color of the selected element
    $(this).css('backgroundColor', '#3b71c6');

    $('#selected').html(selected);
});
.row {
    display: table;
    width: 100%;
    color: white;
    border-spacing: 20px;
}

.button {
    display: table-cell;
    border-radius: 12px;
    background-color: #6fa1f2;
    text-align: center;
}

#selected {
    font-size: 30px;
    color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<span>Selected : <span id="selected">no selection</span></span><br>
<div class="row clickable" data-id="row1">
    <div class="button clickable" data-id="btn1">
        <h2>Button 1</h2>
    </div>
    <div class="button clickable" data-id="btn2">
        <h2>Button 2</h2>
    </div>
    <div class="button clickable" data-id="btn3">
        <h2>Button 3</h2>
    </div>
</div>

<br>
<div class="row clickable" data-id="row2">
    <div class="button clickable" data-id="btn1">
        <h2>Button 1</h2>
    </div>
    <div class="button clickable" data-id="btn2">
        <h2>Button 2</h2>
    </div>
    <div class="button clickable" data-id="btn3">
        <h2>Button 3</h2>
    </div>
</div>

关于javascript - 当单击某个元素或其子元素时,如何获取该元素的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439649/

相关文章:

jquery - $.Ajax 调用的返回值未显示在页面源代码中

javascript - 我如何使用 Jquery 调整三 Angular 形的大小

javascript - 网站加载时可以从确定的 div 开始吗?

html - CSS 动画适用于 Chrome 但不适用于 Safari

javascript - 在新页面加载时保持滚动位置

javascript - Dojo InlineEditBox 无法初始化

javascript - 类型错误 : Cannot read property 'redirect_uris' of undefined

javascript - 使用 $.getJSON 时可以将变量发送到 PHP 代码吗?

javascript - 使用过渡效果更改文本(缩放/淡入淡出)

jquery - grails 2.4.4 jQuery datepicker