2013-06-27 2 views
1

в JQuery, если я использую $("#my_button").data('my-value', { onClick: function() { my_obj_function(); } });JQuery .data функция против установки значения данных в HTML

и в другой функции я сделать это

my-value.onClick.call() это работает.

, но если я попытаюсь установить данные, связанные с html, он не работает. я сделал это в HTML <a href='#' data-my-value='{"onClick":"function() { my_obj_function(); }"}'>Click me</a>

в то время как calling my-value.onClick.call() я получаю uncaught typeerror : object function() has no method call

, что я делаю не так?

+0

Согласно спецификации пользовательских атрибутов HTML5 '' равнозначно '$ (...). Data ('myValue') '. – Phylogenesis

+0

@ Филогенез - Не совсем. Метод '.data()' может атрибуты _retrieve_ html5 'data-', но он не может _set_ их. Атрибуты 'data-' - это строки, но '.data()' может хранить другие типы, включая объекты. – nnnnnn

+0

@nnnnnn - Правда. Я понимаю, что '$ .cache' используется jQuery для обработки' data() ', но я думал, что стоит упомянуть о небольшом отключении между ключом данных и атрибутом, который использовал Rifky. – Phylogenesis

ответ

3

Когда вы устанавливаете значение с .data(), оно не устанавливает атрибут html для элемента, jQuery сохраняет его в своей собственной структуре данных. Вот почему вы можете использовать .data() для хранения функций и других объектов. .data()может использовать для восстановить html5 data- атрибуты, но не установить их.

Когда у вас есть атрибут html, это просто строка, поэтому вам нужно будет eval() или проанализировать ее как-нибудь и перейти к new Function(). Это не путь.

Сказав это, я не вижу, как может работать my-value.onClick.call(), учитывая, что на самом деле он говорит my минус value.onClick.call(). Предполагая, что вы установили значение с .data() вы могли бы сказать $("#my_button").data('my-value').onClick.call() ...

Если вы хотите установить атрибут data- с JQuery вы можете использовать метод .attr() вместо .data(), с $("#my_button").attr('data-my-value', ...), но, как уже упоминалось это установит его как строка.

+0

вы выиграли на 15 секунд: P –

+0

Так что я не могу установить объект в атрибуте данных в HTML :-( – Rifky

0

Ваш код

<a href='#' data-my-value='{"onClick":"function() { my_obj_function(); }"}'>Click me</a> 

устанавливает его в виде строки, а не как объект.

+0

Есть ли другой альтернативный способ установки функции или объекта в качестве значения данных в html ? – Rifky

+0

вы можете сделать 'eval', но это опасно –