无法通过执行 .attr() 获取 aria-pressed 的当前值

Can't get the current value of aria-pressed by doing .attr()

我正在使用这个 bootstrap 开关:https://codepen.io/aanjulena/pen/ZLZjzV

本质上它是重新设计一个按钮。每当值为 "on" 时,aria-pressed 属性为真,反之亦然。像这样:

<button id="packagesSwitch" type="button" class="btn btn-toggle my-3 pkgSwitch" data-toggle="button" aria-pressed="false" autocomplete="off">
                            <div class="handle"></div>
                        </button>

我正在尝试通过 jquery 获得此值:

$('.pkgSwitch').click(function(){

                if($(this).attr('aria-pressed')){
                    console.log("true");
                    $('#packageSwitchValue').val(1);
                }else{
                    console.log("false");
                    $('#packageSwitchValue').val(0);
                }
            });

然而它似乎根本不起作用。我意识到 .attr 给了我原始值,我尝试以某种方式使用 .prop() 但我想不出这样做的方法,因为我尝试的任何方法都不起作用。

您从 aria-pressed 属性获取值的代码似乎工作正常。但是,该值实际上是一个字符串,因此必须以不同的方式对其进行评估。还要记住,对 DOM 的每次调用都必须在 load 事件在文档上触发后完成,以确保一切都准备好查询。否则,jQuery 将无法找到所需的节点:

$(function() {
  $('.pkgSwitch').click(function(){
    if($(this).attr('aria-pressed') === "true"){
      console.log("true");
      $('#packageSwitchValue').val(1);
    }else{
      console.log("false");
      $('#packageSwitchValue').val(0);
    }
  });
});

然而,data-toggle 行为似乎在触发 click 事件后更新节点属性,导致不可预测的结果(有时可能是真或假,因为在节点上注册的侦听器没有顺序).也许添加一些去抖动或只是一个简单的 setTimeout 可以解决这个问题。此外,您必须注意 active class 更改而不是 aria-pressed,因为这是一个仅可访问性参数。

const WAIT_MS = 50;

function onToggleUpdate($elem, cb) {
  setTimeout(() => cb($elem.hasClass("active")), WAIT_MS);
}

function cb(val) {
  console.log(!!val ? "true" : "false");
}

$(function() {
  $('.pkgSwitch').click(function() {
    onToggleUpdate($(this), cb);
  });
});

我附上了一个 CodePen,概念有效:https://codepen.io/geekzolanos-dev/pen/YzXpdzV

这里返回的属性值的类型是 'string' - 你可以用 typeof() 来检查。如果您更改 if 语句以添加 === 'true' 它应该可以工作。

if($(this).attr('aria-pressed') === 'true'){