diff --git a/src/api/traversing.spec.ts b/src/api/traversing.spec.ts index 610bc1fc92..ff86874cb3 100644 --- a/src/api/traversing.spec.ts +++ b/src/api/traversing.spec.ts @@ -798,6 +798,12 @@ describe('$(...)', () => { const result = $('.saladbar', food).closest('ul'); expect(result).toHaveLength(0); }); + + it('(selector) : should find closest element for text nodes', () => { + const textNode = $('.apple', food).contents().first(); + const result = textNode.closest('#food') as Cheerio; + expect(result[0].attribs).toHaveProperty('id', 'food'); + }); }); describe('.each', () => { diff --git a/src/api/traversing.ts b/src/api/traversing.ts index 264e825fb3..4afa7f5279 100644 --- a/src/api/traversing.ts +++ b/src/api/traversing.ts @@ -327,6 +327,9 @@ export function closest( : getFilterFn(selector); domEach(this, (elem: AnyNode | null) => { + if (elem && !isDocument(elem) && !isTag(elem)) { + elem = elem.parent; + } while (elem && isTag(elem)) { if (selectFn(elem, 0)) { // Do not add duplicate elements to the set