Потенциальная ошибка с данными jQuery () при динамическом изменении атрибута? - PullRequest
1 голос
/ 14 августа 2011

Я понятия не имею, нашел ли я потенциальную ошибку jQuery, но посмотрите на следующий случай.

Если я динамически меняю атрибут data-ajax-link, а затем пытаюсь получить его значение с помощью $('something').data('ajax-link'); полученное значение остается прежним до его динамического изменения.

Вот пример.Это пользовательский dropDown, который устанавливает выбранную опцию на первый дочерний элемент ul.Имя элемента, а также ссылка data-ajax первого потомка обновляются значениями выбранной опции… http://jsfiddle.net/RLF3W/1/

$('.select .option').live('click', function (e) {
    e.stopPropagation();
        $(".select .option:not('.darr')").hide();
        selectedOption = $(this).parents("div.select").find(".option:first");

        $(this).siblings().show();
        selectedOption.text($(this).text()).attr('data-ajax-link', $(this).data('ajax-link'));
});

$('.select .option:not(".darr")').live('click', function () {
    $(this).parents("div.select").find(".option:not('.darr')").hide();
});

$(window).click(function() {
    $(".select .option:not('.darr')").hide();
});


$('a#tester').live('click', function(e) {
    e.preventDefault();

    //var sort = $('#sortb .darr').attr('data-ajax-link');
    var sort = $('#sort .darr').data('ajax-link');

    $('#output').text(sort)

});

В моем примере вы можете видеть, что после выбораВ раскрывающемся списке другой параметр, а затем нажмите на тестовую ссылку. Значение data-ajax-link по-прежнему является исходным значением, даже если оно фактически изменяется при проверке элемента.Если я использую .attr('data-ajax-link'), чтобы получить обновленное значение, оно работает нормально.

Я здесь не прав и делаю что-то не так или это ошибка?

1 Ответ

1 голос
/ 14 августа 2011

Вы устанавливаете его с помощью .attr(), но получаете его с помощью .data().

Я довольно уверен, что при получении через .data(), он сначала смотрит наего данные в jQuery.cache, чтобы увидеть, существует ли свойство. Тогда , если нет, он ищет атрибут.

Вам нужно просто отправить его через атрибут data-, но использовать .data() для получения и установки.

Изменитьэто:

selectedOption.text($(this).text()).attr('data-ajax-link', $(this).data('ajax-link'));

до этого:

  // Use .data()----------------------v
selectedOption.text($(this).text()).data('ajax-link', $(this).data('ajax-link'));

Пример: http://jsfiddle.net/RLF3W/5/

...