Итерируя по некоторым элементам DOM, я обнаружил, что невозможно использовать .data или .attr для них:

$('.running').each (index, element) =>
    console.log element.closest('[data-id]')

Получает меня

<section class="job-block" data-id="240"></section>
...

Но

$('.running').each (index, element) =>
    console.log element.closest('[data-id]').data('id')

Бросает

Uncaught TypeError: element.closest (...). Данные не являются функцией

6
The Whiz of Oz 9 Янв 2017 в 13:05

4 ответа

Лучший ответ

closest(), которым вы являетесь using - это собственный метод JS, который возвращает объект элемента DOM, поскольку element ссылается на объект элемента DOM.


dataset
$('.running').each (index, element) =>
    console.log element.closest('[data-id]').dataset.id

data()
$('.running').each (index, element) =>
    console.log $(element.closest('[data-id]')).data('id')

element closest()
$('.running').each (index, element) =>
    console.log $(element).closest('[data-id]').data('id')
4
Pranav C Balan 9 Янв 2017 в 10:17

element содержит элемент DOME, поэтому вы вызываете родной метод closest (), а не jQuery one. Следовательно, метод data() не существует в возвращаемом объекте.

Чтобы это исправить, оберните element в объект jQuery:

$('.running').each (index, element) =>
    console.log $(element).closest('[data-id]').data('id')
3
Rory McCrossan 9 Янв 2017 в 10:08

data() - это метод jQuery, поэтому вы должны вызывать его для объекта jQuery вместо объекта DOM, поэтому он должен быть $(element):

console.log $(element).closest('[data-id]').data('id')

Надеюсь это поможет.

2
Zakaria Acharki 9 Янв 2017 в 10:08

Поскольку они являются объектами DOM (как вы правильно сказали), а не объектами jquery, вы не можете применять методы jquery к объектам DOM, вам необходимо преобразовать их в объекты jquery.

$(element).closest...
3
freedomn-m 9 Янв 2017 в 10:08