【问题标题】:getAttribute() does not retrieve original value of disabledgetAttribute() 不检索禁用的原始值
【发布时间】:2014-11-22 01:15:45
【问题描述】:

以下sn-p中的代码演示了在更改disabled属性后,我无法检索到原始属性值,至少对于disabled属性。 The jQuery docs 暗示 element.getAttribute() 应该能够检索到原始值。

但是,它没有检测到 select 最初没有被禁用。

那么,文档错了吗?布尔属性是否不同?最重要的是,有没有办法在使用prop()更改后获取原始值?

注意 我正在使用 jQuery 1.8.3,它被 Opera 中的 Chromium 37 解释。

$('button').on('click', function() {
  var $inputs = $('input, select');
  $inputs.each(function() {
    var $this = $(this);
    var name = $this.prop('name');
    console.log('before changing ' + name + '...');
    console.log("\tgetAttribute: " + $this[0].getAttribute('disabled'));
    console.log("\tprop: " + $this.prop('disabled'));
    console.log("\tattr: " + $this.attr('disabled'));

    $this.prop('disabled', true);

    console.log('after changing ' + name + '...');
    console.log("\tgetAttribute: " + $this[0].getAttribute('disabled'));
    console.log("\tprop: " + $this.prop('disabled'));
    console.log("\tattr: " + $this.attr('disabled'));
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<button>Click</button>
<input name="input" type="text" disabled='disabled' />
<select name="select">
  <option>Option</option>
  <option>Option</option>
  <option>Option</option>
</select>

编辑

不幸的是,.prop() vs .attr() 的问题实际上并没有回答有关禁用之类的布尔属性的问题。考虑一下这个小提琴:http://jsfiddle.net/garreh/uLQXc。它在 1.8.3 下运行良好。现在,考虑这个 fork,它改变了 'disabled' 而不是 'blah':http://jsfiddle.net/wrn1ryjq/1。输入最初未被禁用。更改后,即使 attr 返回“已禁用”。因此, attr 返回原始值的股票答案似乎并不正确。我的问题仍然存在:用 prop 更改后,我如何找出禁用的原始状态?

编辑 嗯,这很尴尬。当然attr() 不会检索原始值。文档说不会。真正的问题是,在使用prop 禁用后,如何从输入中获取禁用的原始值。

不幸的是,根据this comment,这是不可能的:/ 不过感谢您的建议。

【问题讨论】:

    标签: javascript jquery prop


    【解决方案1】:

    因为,prop 仅在元素确实具有该属性时才有效,因此当涉及到那些未禁用的输入字段时,您将不会获得它返回的任何值。

    使用attr 也会遇到同样的问题,因为它会检查元素是否具有该特定属性。

    相反,我建议您使用$('#someId:disabled').length 来查看您要查找的元素是否具有禁用属性。选择器将只能找到那些具有disabled 属性的元素,因此它会导致01

    看到这个fiddle

    HTML

    <input id="input1" disabled />
    <input id="input2" disabled="true" />
    <input id="input3" />
    

    Javascript

    $('#result').append($('#input1:disabled').length);
    $('#result').append($('#input2:disabled').length);
    $('#result').append($('#input3:disabled').length);
    

    【讨论】:

    • 如果您随后使用 prop() 禁用输入 3,是否会返回相同的结果?
    • @CharlesWood 是的!如果您使用.prop('disabled', true) 禁用“#input3”,则最终检查将返回1 而不是0。您可以在更新后的示例中亲自查看 - jsfiddle.net/aniketpant/kf7dve0h/1
    • 啊。不,我需要一种方法来确定它是否最初在页面加载时被禁用。不过还是谢谢。
    • @CharlesWood 为什么不在页面加载时存储原始状态?
    • 看来我会这样做。 disabled 是个特例,这很烦人。
    猜你喜欢
    • 2020-09-21
    • 2022-11-21
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2020-09-08
    相关资源
    最近更新 更多