【问题标题】:If/else not working with event.target selector如果/否则不适用于 event.target 选择器
【发布时间】:2019-07-26 14:36:39
【问题描述】:

我有三个按钮。点击一个应该做一件事,点击第二个应该做另一件事,等等。

当您单击任何按钮时,我会在控制台中看到相同的消息,这是我不想要的。我的 if/else 逻辑是否有问题或是否有其他因素影响结果?

index.js:

$(document).on("click", ".dtAddClass-rolesgrid", disp._newRole);

$(document).on("click", ".dtAddClass-srchgrid", disp._newRole);

$(document).on("click", ".dtAddClass-additionalsrchgrid", disp._newRole);

JS sn-p:

_newRole(e) {
    $("#dialog-form fieldset > #activate-button").hide();
    $("#dialog-form fieldset > #deactivate-button").hide();
    dialog.dialog({ title: "Add New Search/Role Filled" });
    dialog.dialog("open");

    if ($(e.target.tagName === ".dtAddClass-rolesgrid")) {
        myClass._AddNewRoleFilled();
        console.log('this is rolesgrid') // clicking on any of the buttons only shows this message
    } else if ($(e.target.tagName === ".dtAddClass-srchgrid")) {
        console.log('this is srchgrid');
    } else if ($(e.target.tagName === ".dtAddClass-additionalsrchgrid")) {
        console.log('this is addtsrchgrid');
    } else {
        console.log('this is e: ' + e)
    }
}   

按钮是如何创建的:

let _gridNew = _grid.substring(1);
var table = $(_grid).DataTable({
    buttons: [
    {
        text:      '<i class="fa fa-plus"></i>',
        titleAttr: 'Add',
        className: 'dtAddClass-' + _gridNew
    },

更新代码:

if ($('div').hasClass("dtAddClass-rolesgrid")) {
    myClass._AddNewRoleFilled();
    console.log('this is rolesgrid');
} else if ($('div').hasClass("dtAddClass-srchgrid")) {
    console.log('this is srchgrid');
} else if ($('div').hasClass("dtAddClass-additionalsrchgrid")) {
    console.log('this is addtsrchgrid');
} else {
    console.log('this is e: ' + e)
}   

【问题讨论】:

  • e.target.tagName 在您的每个按钮的 _newRole 函数中的计算结果是什么?
  • 那些是类选择器。它们作为标签名称是无效的。
  • ('div').hasClass("dtAddClass-rolesgrid") 正在选择所有 div 并检查第一个....
  • @epascarello 所以一旦它检查了-rolesgrid,它不会继续检查其他人吗?
  • 应该是$(e.target).hasClass() .... 除非你真的想要任何 div

标签: javascript jquery if-statement events methods


【解决方案1】:

来,试试这样的。

$(document).on("click", ".dtAddClass-rolesgrid", onClick);
$(document).on("click", ".dtAddClass-srchgrid", onClick);
$(document).on("click", ".dtAddClass-additionalsrchgrid", onClick);

function onClick(e) {
  const el = $(this);
  if (el.hasClass('dtAddClass-rolesgrid')) {
    console.log('this is rolesgrid')
  } else if (el.hasClass('dtAddClass-srchgrid')) {
    console.log('this is srchgrid');
  } else if (el.hasClass('dtAddClass-additionalsrchgrid')) {
    console.log('this is addtsrchgrid');
  } else {
    console.log('this is e: ' + this)
  }
}

在 jQuery click 函数中,您使用$(this) 而不是e.target 获得您点击的元素。另外,使用jQuery方法hasClasstagName是元素的标签名,如divspan

或者让事情变得更简单:

$('.dtAddClass-rolesgrid').click(function() {
  alert('this is rolesgrid')
})

$('.dtAddClass-srchgrid').click(function() {
  alert('this is srchgrid')
})

$('.dtAddClass-additionalsrchgrid').click(function() {
  alert('this is additionalsrchgrid')
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="dtAddClass-rolesgrid">
  Rolesgrid
</div>

<div class="dtAddClass-srchgrid">
  Srchgrid
</div>

<div class="dtAddClass-additionalsrchgrid">
  Additionalsrchgrid
</div>

【讨论】:

  • 应该真正使用现代的 classList 而不是 className。
  • 嘿@Spartacus,它只针对else { console.log()。我知道这些类是正确的,所以我不确定为什么它默认为else
  • 已更新答案,再次查看。 @Bodrov
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多