Есть ли простой/быстрый способ сопоставить атрибуты данных с именами свойств в смешанном регистре?

У меня есть базовый класс плагинов, который я использую в качестве основы для всех своих плагинов jQuery. Он похож на виджет пользовательского интерфейса jQuery, но для меня выполняет гораздо более тяжелую работу.

Теперь я хочу сопоставить значения атрибутов data- из прикрепленного элемента с любыми параметрами, переданными плагину. Это позволит подключаемому модулю не только принимать типичный объект options, но также разрешать переопределять значения, управляемые данными, для отдельных элементов (общее требование).

У меня проблема в том, что мои свойства option обычно имеют смешанный регистр, например. MaxHeight, но, видимо, спецификация HTML разрешает использовать только символы нижнего регистра в именах data- атрибутов.

В качестве тестового стенда: http://jsfiddle.net/TrueBlueAussie/tfkrwq09/1/

HTML:

<div id="test" data-DataTest="test2"></div>

jQuery:

var object = {
    DataTest: 123
};
$.each($('#test').data(), function (k, v) {
    object[k] = v;
});

console.log(object.datatest); // test
console.log(object.DataTest); // 123

Желаемый результат:

console.log(object.datatest); // undefined
console.log(object.DataTest); // test

Мне нужны способы сопоставления атрибутов data- со свойствами смешанного регистра, сохраняя при этом текущую скорость и простоту (если возможно).


person Gone Coding    schedule 18.12.2014    source источник
comment
Я сделал быстрый тест, основанный на примере в документе jQuery для data(), кажется, что если вы сами установите данные, jQuery извлечет их так, как они были написаны. Пример: $('#test').data({TEST: 1});, затем выполните console.log(object.TEST); и вы получите 1.   -  person SparoHawk    schedule 18.12.2014
comment
Вы должны использовать нотацию через дефис: data-data-test="test2" РЕДАКТИРОВАТЬ: на самом деле не для DataTest, но именно поэтому имя свойства не должно начинаться с заглавной буквы   -  person A. Wolff    schedule 18.12.2014
comment
Это интересно, не знал, что так работает. Мало того, что кажется, что прописные буквы недействительны, они все... автоматически преобразуются в нижний регистр ASCII   -  person brbcoding    schedule 18.12.2014
comment
Аналогично этому вопросу: stackoverflow.com/questions/27359388/   -  person A. Wolff    schedule 18.12.2014
comment
@А. Вольф: Очень близко. that's-a-great-solution... Только что попробовал data--data-test, а также получил заглавную букву в верхнем регистре... пожалуйста, напишите как ответ :)   -  person Gone Coding    schedule 18.12.2014


Ответы (1)


См. следующую ссылку о правиле camelCased: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset

Итак, в вашем случае я бы использовал:

<div id="test" data--data-test="test2"></div>

Получить:

object.DataTest; //test2

person A. Wolff    schedule 18.12.2014
comment
data--data-test даст необходимый мне стартовый капитал (я догадался, что это может позволить, и это сработало). Вы можете пересмотреть. - person Gone Coding; 18.12.2014
comment
Это моя тенденция С# использовать имена свойств ProperCased. Не уверен, какой самый широкий стандарт для кода JS :) - person Gone Coding; 18.12.2014
comment
Наиболее распространенный стандарт для C#, который я вижу, это Property = ProperCased, Field = lowerFirst - person Gone Coding; 18.12.2014
comment
@TrueBlueAussie, вы действительно правы: msdn .microsoft.com/en-us/library/vstudio/ - person A. Wolff; 18.12.2014
comment
... Возможно, мне придется изменить мой код, чтобы он соответствовал наиболее распространенным стандартам именования JS (переключение вперед и назад - это боль, поэтому мне очень нравится TypeScript) :) - person Gone Coding; 18.12.2014