- From: Austin Cheney <notifications@github.com>
- Date: Sat, 19 Jun 2021 08:45:03 -0700
- To: whatwg/dom <dom@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/dom/issues/992@github.com>
# getNodesByType This is a suggestion for a new method to return a node list of descendant nodes of a matching node type. ## Purpose More directly access any part of a document. I have used this method in my own code for many years and it has allowed me to perform actions quickly with minimal code. ### Examples * I can embed state data from the server into an HTML comment and deliver this directly with the HTML without using any external artifact. I can then access the comment directly from a node list using `document.getNodesByType(8);` * I can access all text in a document immediately and the evaluate the relationships of those text node values against their parent elements for accessibility concerns: https://github.com/prettydiff/semanticText ## Background In the DOM specification nodes are of a type. The standard types are (including deprecated legacy types): 1. 1 - ELEMENT_NODE 2. 2 - ATTRIBUTE_NODE 3. 3 - TEXT_NODE 4. 4 - CDATA_SECTION_NODE 5. 5 - ENTITY_REFERENCE_NODE 6. 6 - ENTITY_NODE 7. 7 - PROCESSING_INSTRUCTION_NODE 8. 8 - COMMENT_NODE 9. 9 - DOCUMENT_NODE 10. 10 - DOCUMENT_TYPE_NODE 11. 11 - DOCUMENT_FRAGMENT_NODE 12. 12 - NOTATION_NODE The numbers were intentionally specified because that is the value returned by accessing the nodeType property of a node object, which returns a number corresponding to the definitions listed above. The below suggestion criteria will also mention a value for 0: **0 - ALL** where in a 0 value returns a node list of all descendant nodes. ## Availability This method should be available on the document object and elements. ## Input A node type value. This value can be of two types: * number, 0-12 - The node type value. * string, type name - The node type name. ### Unsupported Input If input is provided that does not conform the accepted criteria the default value of 0 will be applied. ## Output A node list ## Working Demonstration (TypeScript) ```typescript function browser_dom_getNodesByType(typeValue:number|string):Node[] { const valueString:string = (typeof typeValue === "string") ? typeValue.toLowerCase() : "", // eslint-disable-next-line root:Element = (this === document) ? document.documentElement : this, numb:number = (isNaN(Number(typeValue)) === false) ? Number(typeValue) : 0; let types:number = (numb > 12 || numb < 0) ? 0 : Math.round(numb); // If input is a string and supported standard value // associate to the standard numeric type if (valueString === "all" || typeValue === "") { types = 0; } else if (valueString === "element_node") { types = 1; } else if (valueString === "attribute_node") { types = 2; } else if (valueString === "text_node") { types = 3; } else if (valueString === "cdata_section_node") { types = 4; } else if (valueString === "entity_reference_node") { types = 5; } else if (valueString === "entity_node") { types = 6; } else if (valueString === "processing_instruction_node") { types = 7; } else if (valueString === "comment_node") { types = 8; } else if (valueString === "document_node") { types = 9; } else if (valueString === "document_type_node") { types = 10; } else if (valueString === "document_fragment_node") { types = 11; } else if (valueString === "notation_node") { types = 12; } // A handy dandy function to trap all the DOM walking return (function browser_dom_getNodesByType_walking():Node[] { const output:Node[] = [], child = function browser_dom_getNodesByType_walking_child(x:Element):void { const children:NodeListOf<ChildNode> = x.childNodes; let a:NamedNodeMap = x.attributes, b:number = a.length, c:number = 0; // Special functionality for attribute types. if (b > 0 && (types === 2 || types === 0)) { do { output.push(a[c]); c = c + 1; } while (c < b); } b = children.length; c = 0; if (b > 0) { do { if (children[c].nodeType === types || types === 0) { output.push(children[c] as Element); } if (children[c].nodeType === 1) { //recursion magic browser_dom_getNodesByType_walking_child(children[c] as Element); } c = c + 1; } while (c < b); } }; child(root); return output; }()); } ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/dom/issues/992
Received on Monday, 21 June 2021 03:59:50 UTC