2013-02-18 2 views
6

У нас есть эта странная ситуация, когда некоторые коды продуктов, например 11E6, которые хранятся в атрибутах данных (ex data-prodcode), преобразуются в 11000000, когда их извлекают внутри функция jquery click. Что-то вроде этого:Запретить преобразование строки, содержащей E и цифр, на номер

<a data-prodcode="11E6">click</a> 
    var code = $(this).data('prodcode'); 
    console.log(code); --> 11000000 

Любые советы о том, как избежать такого поведения или что может его вызвать?

+3

Это потому, что '.data' пытается автоматически конвертировать значения в числа или булевы, когда это возможно, а строка' 11E6' выглядит как [число в научной нотации] (http://en.wikipedia.org/wiki/ Scientific_notation # E_notation) на компьютер. – Blazemonger

ответ

7

От documentation:

Каждая попытка преобразовать строку в значение JavaScript (это включает в себя булевы, числа, объекты, массивы и нуль) в противном случае он остается в виде строки. Чтобы извлечь атрибут значения в виде строки без какой-либо попытки его преобразования, используйте метод attr().

Вы можете использовать attr для того, чтобы избежать автоматического синтаксического анализа:

var code = $(this).attr('data-prodcode'); 

Чтобы быть более точным: это не должно произойти. И на самом деле этого не происходит в последних версиях. Вот код JQuery текущей (в наиболее интересной частью является комментарием):

if (typeof data === "string") { 
     try { 
      data = data === "true" ? true : 
       data === "false" ? false : 
       data === "null" ? null : 
       // Only convert to a number if it doesn't change the string 
       +data + "" === data ? +data : 
       rbrace.test(data) ? jQuery.parseJSON(data) : 
        data; 
     } catch(e) {} 

И это работает в JQuery 1.8 и 1.9: он не преобразует строку в число, если обратно преобразование не производит ту же строку. Но это не сработало в jQuery 1.7.

+0

Обязательно добавьте комментарий в свой код, объясняя, почему вы это делаете, поэтому какой-то оптимизатор хорошего смысла не изменит его позже. – Blazemonger

+1

На самом деле функция 'data' jQuery очень опасна для строк, на мой взгляд. Похоже, они пытались быть слишком умными здесь ... –

+1

Ну, это, наверное, край. Любой, кто НЕОБХОДИЛ строки во всех случаях, может и должен использовать ваше решение, которое, вероятно, более эффективно, чем '.data'. – Blazemonger

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