jQuery element.closest(...).attr 在使用 each 时不是一个函数

jQuery element.closest(...).attr is not a function when using each

在遍历某些 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(...).data is not a function

因为它们是 DOM 对象(如你所说)而不是 jquery 对象,你不能将 jquery 方法应用于 DOM 对象,你需要将它们转换为 jquery 个对象。

$(element).closest...

您使用的 closest() 方法是原生 JS 方法,returns DOM 元素对象,因为 element 引用 DOM 元素对象。


获取属性值有几个选项,要么从 dataset 属性 :

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


或者用 jQuery 包装元素并使用 data() 方法。

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


或者用 jQuery 包装 element 并使用 jQuery closest() 方法。

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

element 包含一个 DOMElement,因此您正在调用 native closest() method, not the jQuery one。因此,data() 方法在返回的对象上不存在。

要解决此问题,请将 element 包装在 jQuery 对象中:

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

data() 是一个 jQuery 方法,所以你应该在 jQuery 对象而不是 DOM 对象上调用它,所以它应该是 $(element)

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

希望对您有所帮助。