Предостережение заключается в том, что Storage
(интерфейс за LocalStorage и SessionStorage) допускает сохранение только DOMString
в качестве значений (при использовании setItem()
).Цитирование документа :
storage.setItem(keyName, keyValue);
keyName
Строка DOMString, содержащая имя ключа, который вы хотите создать / обновить. keyValue
Строка DOMString, содержащая значение, которое вы хотите дать ключу, который вы создаете / обновляете.
То же самое с getItem()
- либо возвращает null
, если под данным ключом нет ни одного элемента или DOMString
.
Так что, если вы запустите его так:
sessionStorage.setItem('disabled', false);
... он фактически преобразует логическое значение в DOMString.Это легко проверить: просто запустите ...
console.log( typeof sessionStorage.getItem('disabled') );
... и вот, вот 'string'
вместо ожидаемого 'boolean'
.
Теперь, jQuery.prop
на самом делене проверяет тип аргумента при работе со свойством disabled
.И когда это строка 'false'
, она просто преобразует ее в логическое значение, чтобы решить, нужно ли удалять атрибут или нет.И, как вы наверняка знаете, Boolean('false') === true
.
Что делать тогда?Один из возможных подходов - не хранить значение вообще - просто очистите элемент, когда он не нужен.Другой хранит пустую строку (так как это единственная строка, которая преобразуется в false).В этом случае решающая часть тривиальна:
if (event.which == 119) { //this is the 'w' key
var isDisabled = $("#cblDoctors_3").prop('disabled');
sessionStorage.setItem('disabled', isDisabled || '');
}
// ...
const isDisabled = Boolean( sessionStorage.getItem('disable') );
// it'll be false for both null and ''
$('#cblDoctors_3').prop('disabled', isDisabled);