2013-11-29 4 views
1

Это должно быть довольно прямо вперед:

HTML

<a href="url" id="thumba" data-id="26">my link</a> 
<input type="hidden" id="pageids" value="28,27,26,17,18,19,"> 

Jquery

var thumbaid = $('#thumba').data("id"); 
    // get position 
    var itemids = $('#pageids').val(); 
    var itemids_array = itemids.split(','); 
    var currentpos = $.inArray(thumbaid, itemids_array); 
    alert(currentpos); 

дает мне -1?

Самое смешное, что если я заменил «$ (thumba) .data (« id »)» для числа в коде jquery как «26», он работает!

Результат должен быть в данном случае «2».

Любые идеи?

+0

пробуждение (указатель); и посмотреть, что произойдет –

+0

Попробуйте использовать 'console.log (...);' при отладке вместо 'alert (...);' (при отладке в IE открывайте консоль разработчика сначала с помощью клавиши F12') –

+0

@ rookieB Пожалуйста, не рекомендуем людям обращаться к 'alert()' для отладки. Для этого нужна консоль. – George

ответ

5

Вам нужно преобразовать значение в строку.

var thumbaid = $('#thumba').data("id").toString(); 

Почему ...? Если бы вы были

console.log(itemids_array); 

вы увидите это

["28", "27", "26", "17", "18", "19", ""] 

Они не являются числами, они являются строками. См. http://api.jquery.com/data/

+2

** Это ** действительно способ обрабатывать атрибуты данных, а не как другие, предлагаемые '.attr (" data-id ")' –

+0

James was уже обрабатывая его правильно. Только один человек бросил изворотливую кость. – Popnoodles

+0

Спасибо, ребята, большинство из вас указало на решение String, и вы были правы! Спасибо большое :) – James

1

Причина, по которой он не работает, заключается в том, что данные jQuery возвращают int not string.

См. Этот пример.

<a href="url" id="thumba" data-id="26">my link</a> 
<input type="hidden" id="pageids" value="28,27,26,17,18,19,"> 

Javascript:

var thumbaid = $('#thumba').data('id').toString(); 

// get position 
var itemids = $('#pageids').val(); 
var itemids_array = itemids.split(','); 
console.log(itemids_array); 
var currentpos = $.inArray(thumbaid, itemids_array); 
console.log(currentpos); 
+1

Спасибо, ты прав :) – James

2

Это происходит потому, что thumbaid является числом, а itemids_array содержит строки. Попробуйте var currentpos = $.inArray(thumbaid.toString(), itemids_array);

Функция jQuery's data считывает атрибуты data- и анализирует цифры на цифры.

+0

Yeap, это правильно! Большое спасибо :) – James

2

Функция jQuery's data выполняет операции с данными, которые она считывает с атрибутов data-* при инициализации, включая поворот числовых строк в числа. Так как $.inArray делает отметку ===, вот почему она терпит неудачу. Вы в конечном итоге ищете номер 26 в массиве строк.

Если вы просто используете .attr("data-id"), преобразование не произойдет.

Такое поведение документировано в data docs:

Каждая попытка преобразовать строку в значение JavaScript (это включает в себя булевы, числа, объекты, массивы и нуль). Значение преобразуется только в число, если это не изменяет представление значения. Например, «1E02» и «100.000» эквивалентны числам (числовое значение 100), но их преобразование изменит их представление, чтобы они оставались в виде строк. Строковое значение «100» преобразуется в число 100.

Если вы используете только data читать data-* атрибуты, я рекомендую использовать attr вместо того, чтобы избежать такого рода вещи, и, чтобы избежать путаницы, вызванной тем, что в то время как dataинициализирует из data-* атрибутов, то не напишите им, когда вы установили данные. Конечно, если вам нужно хранить данные, связанные с элементами, и вы не хотите, чтобы он был атрибутом (потому что это не строковые данные, или вы не хотите, чтобы он показывался в инспекторе DOM), data - это правильный инструмент для этого работа.

1

$().data() преобразует значение атрибута data-* в значение JavaScript. В вашем случае thumbaid преобразуется в число.

$.inArray сравнивает элементы с использованием строгого оператора равенства (===). То есть, '26' === 26 возвращает false, поскольку никакого принуждения типа не происходит.

Из jQuery.data() документов:

Каждой попытка преобразовать строку в значение JavaScript (это включает в себя булевы, число, объекты, массивы и нуль). Значение преобразуется только в число, если это не изменит представление . Например, «1E02» и «100 000» эквивалентны номерам (числовое значение 100), но их преобразование изменит их представление , чтобы они оставались в виде строк. Строковое значение «100» составляет , преобразованное в число 100.

Смежные вопросы