Извлечение логических данных из атрибута data в jquery
Я пытаюсь получить атрибут данных типа Boolean из элемента HTML DIV, однако он всегда возвращает false, когда строка преобразуется в boolean .
HTML
<div id='test' data-return="true"></div>
JS
isreturn_str = $('#test').data('return');
isreturn = (isreturn_str === 'true');
if (isreturn) {
document.write("It is true");
} else {
document.write("It is false");
}
выход
Это ложная
5 ответов:
jQuery
.data()
метод умно распознает логические и числовые значения и преобразует их в свой собственный тип. Так что это возвращает логическоеtrue
, а не"true"
:$('#test').data('return');
если вы хотите получить исходные данные (без автоматического преобразования данных), вы можете использовать
.attr()
:$('#test').attr("data-return");
смотрите рабочий тестовый случай здесь:http://jsfiddle.net/jfriend00/6BA8t/
jQuery распознает строку "true" как логический аналог (в контексте атрибутов данных) и таким образом:
typeof isreturn_str; // boolean
но вы строго сравниваете со строкой
'true'
который дает false как строка не является логическим.
"true"
внутренне преобразован в логический (попробоватьalert (typeof(isreturn_str))
), следовательно, ваш===
сравнение не выполняется при проверке типа.вы могли бы позвонить
.toString()
isreturn_str = $('#test').data('return').toString();
в моем случае предложенные решения не помогли мне, поэтому я создал свою собственную булеву функцию преобразования с помощью jquery:
/** * Convert a value into a boolean * @param {Mixed} value The value to check convert into boolean * @return {Boolean} */ var boolVal=function(value){ var falseValues=['false',0,undefined,'0','no','null',null]; if (typeof value === 'string' || value instanceof String){ value=value.toLowerCase(); } return $.inArray(value, falseValues) == -1 }
поэтому я получаю значение через
attr
метод jquery и я передаю его так, например:boolVal($(href).attr('data-sidebar-sm-display'));
также вы можете увидеть его для себя в следующем примере:
var boolVal = function(value) { var falseValues = ['false', 0, undefined, '0', 'no', 'null', null]; if (typeof value === 'string' || value instanceof String) { value = value.toLowerCase(); } return $.inArray(value, falseValues) == -1 } console.log("#1_true: " + boolVal($("#1_true").attr('data-boolean'))) console.log("#2_true: " + boolVal($("#2_true").attr('data-boolean'))) console.log("#3_true: " + boolVal($("#3_true").attr('data-boolean'))) console.log("#4_true: " + boolVal($("#4_true").attr('data-boolean'))) console.log("#5_true: " + boolVal($("#5_true").attr('data-boolean'))) console.log("#6_true: " + boolVal($("#6_true").attr('data-boolean'))) console.log("#7_true: " + boolVal($("#7_true").attr('data-boolean'))) console.log("#1: " + boolVal($("#1").attr('data-boolean'))) console.log("#2: " + boolVal($("#2").attr('data-boolean'))) console.log("#3: " + boolVal($("#3").attr('data-boolean'))) console.log("#4: " + boolVal($("#4").attr('data-boolean'))) console.log("#4: " + boolVal($("#no_data").attr('data-boolean')))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="1" data-boolean="false"></div> <div id="2" data-boolean="0"></div> <div id="3" data-boolean="null"></div> <div id="no_data"></div> <div id="4" data-boolean=false></div> <div id="1_true" data-boolean=yes></div> <div id="2_true" data-boolean="yes"></div> <div id="3_true" data-boolean="true"></div> <div id="4_true" data-boolean="1"></div> <div id="5_true" data-boolean=1></div> <div id="6_true" data-boolean="true"></div> <div id="7_true" data-boolean="TRUE"></div>
основная идея это определить какие данные-атрибуты считаются логикой "ложными" и все остальное задается как истинный.