Skip to content

Commit ff36a33

Browse files
committed
feat: :required pseudo-class
1 parent eac5a38 commit ff36a33

2 files changed

Lines changed: 20 additions & 0 deletions

File tree

packages/happy-dom/src/query-selector/SelectorItem.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,10 @@ export default class SelectorItem {
277277
return 'disabled' in element && element.hasAttribute('disabled')
278278
? { priorityWeight: 10 }
279279
: null;
280+
case 'required':
281+
return 'required' in element && element.hasAttribute('required')
282+
? { priorityWeight: 10 }
283+
: null;
280284
case 'empty':
281285
return !(<Element>element)[PropertySymbol.elementArray].length
282286
? { priorityWeight: 10 }

packages/happy-dom/test/query-selector/QuerySelector.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,22 @@ describe('QuerySelector', () => {
10091009
expect(elements2[4] === container.children[0].children[5]).toBe(true);
10101010
});
10111011

1012+
it('Returns all elements matching ":required".', () => {
1013+
const container = document.createElement('div');
1014+
container.innerHTML = `
1015+
<input id="a" required>
1016+
<input id="b">
1017+
<select id="c" required></select>
1018+
<textarea id="d" required></textarea>
1019+
`;
1020+
const elements = container.querySelectorAll(':required');
1021+
1022+
expect(elements.length).toBe(3);
1023+
expect(elements[0].id).toBe('a');
1024+
expect(elements[1].id).toBe('c');
1025+
expect(elements[2].id).toBe('d');
1026+
});
1027+
10121028
it('Returns all elements matching "span:not([type=hidden])".', () => {
10131029
const container = document.createElement('div');
10141030
container.innerHTML = QuerySelectorHTML;

0 commit comments

Comments
 (0)