अपडेट :
मैंने 1000 से अधिक इन 6 तरीकों में से प्रत्येक के लिए कुछ बुनियादी प्रदर्शन परीक्षणों की रूपरेखा तैयार की है। getElementsByTagName
सबसे तेज़ है, लेकिन यह एक आधा-गधा काम करता है, क्योंकि यह सभी तत्वों का चयन नहीं करता है, लेकिन केवल एक विशेष प्रकार का टैग (मुझे लगता है p
) और आँख बंद करके मानता है कि इसका पहला पाठ एक पाठ तत्व है। यह थोड़ा त्रुटिपूर्ण हो सकता है लेकिन इसके प्रदर्शन उद्देश्य के लिए और इसके प्रदर्शन की तुलना करने के लिए TreeWalker
। परिणाम देखने के लिए अपने आप को jsfiddle पर परीक्षण चलाएं ।
- ट्रीवल्कर का उपयोग करना
- कस्टम Iterative Traversal
- कस्टम पुनरावर्ती Traversal
- Xpath क्वेरी
- querySelectorAll
- getElementsByTagName
आइए एक पल के लिए मान लें कि एक विधि है जो आपको Text
मूल रूप से सभी नोड्स प्राप्त करने की अनुमति देती है । आपको अभी भी प्रत्येक परिणामी टेक्स्ट नोड को पार करना होगा और node.nodeValue
वास्तविक पाठ प्राप्त करने के लिए कॉल करना होगा जैसा कि आप किसी भी डोम नोड के साथ करेंगे। तो प्रदर्शन का मुद्दा पाठ नोड्स के माध्यम से पुनरावृत्ति के साथ नहीं है, लेकिन उन सभी नोड्स के माध्यम से पुनरावृत्ति करना जो पाठ नहीं हैं और उनके प्रकार की जांच कर रहे हैं। मैं तर्क दूंगा (परिणामों के आधार पर) जो TreeWalker
जितनी तेजी से प्रदर्शन करता है getElementsByTagName
, अगर तेजी से नहीं (यहां तक कि getElementsByTagName के साथ विकलांग खेलते हुए)।
प्रत्येक परीक्षण 1000 बार दौड़ा।
विधि कुल एमएस औसत एमएस
--------------------------------------------------------------
दस्तावेज़। फ्रीवैलर 301 0.301
Iterative Traverser 769 0.769
पुनरावर्ती ट्रैवर्स 7352 7.352
XPath क्वेरी 1849 1.849
querySelectorAll 1725 1.725
getElementsByTagName 212 0.212
प्रत्येक विधि के लिए स्रोत:
ट्रीवल्कर
function nativeTreeWalker() {
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT,
null,
false
);
var node;
var textNodes = [];
while(node = walker.nextNode()) {
textNodes.push(node.nodeValue);
}
}
रिकर्सिव ट्री ट्रैवर्सल
function customRecursiveTreeWalker() {
var result = [];
(function findTextNodes(current) {
for(var i = 0; i < current.childNodes.length; i++) {
var child = current.childNodes[i];
if(child.nodeType == 3) {
result.push(child.nodeValue);
}
else {
findTextNodes(child);
}
}
})(document.body);
}
Iterative ट्री ट्रैवर्सल
function customIterativeTreeWalker() {
var result = [];
var root = document.body;
var node = root.childNodes[0];
while(node != null) {
if(node.nodeType == 3) {
result.push(node.nodeValue);
}
if(node.hasChildNodes()) {
node = node.firstChild;
}
else {
while(node.nextSibling == null && node != root) {
node = node.parentNode;
}
node = node.nextSibling;
}
}
}
querySelectorAll
function nativeSelector() {
var elements = document.querySelectorAll("body, body *");
var results = [];
var child;
for(var i = 0; i < elements.length; i++) {
child = elements[i].childNodes[0];
if(elements[i].hasChildNodes() && child.nodeType == 3) {
results.push(child.nodeValue);
}
}
}
getElementsByTagName (बाधा)
function getElementsByTagName() {
var elements = document.getElementsByTagName("p");
var results = [];
for(var i = 0; i < elements.length; i++) {
results.push(elements[i].childNodes[0].nodeValue);
}
}
XPath
function xpathSelector() {
var xpathResult = document.evaluate(
"//*/text()",
document,
null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE,
null
);
var results = [], res;
while(res = xpathResult.iterateNext()) {
results.push(res.nodeValue);
}
}
इसके अलावा, आपको यह चर्चा सहायक लग सकती है - http://bytes.com/topic/javascript/answers/153239-how-do-i-get-elements-text-node