2010-11-08 10 views
5
में

कैसे मैं निम्नलिखित jQuery-नहीं लिख सकते हैं ...jQuery-नहीं शुद्ध जावास्क्रिप्ट

$(".hover").not(".selected"); 

... शुद्ध जावास्क्रिप्ट में?

+0

कोई कारण नहीं कि आप केवल jQuery या कुछ अन्य ढांचे का उपयोग क्यों नहीं करते? प्रदर्शन के कारण –

+0

... हम पहले से ही – albuvee

+2

रैफेल का उपयोग करते हैं, यह समझें कि jQuery काफी अच्छी तरह अनुकूलित है, जो भी कोड आप लिखते हैं वह अधिक कुशल नहीं होने वाला है। –

उत्तर

7
allItems = document.getElementsByTagName('*'); 
goodItems = []; 
for(i=0;i<allItems.length;i++){ 
    if(
     allItems[i].className && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'hover'+' ') != -1 && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'selected'+' ') == -1 
    ) 
     goodItems.push(allItems[i]); 
} 

आप वर्ग चयन इस तरह की जरूरत है अक्सर आप उन्हें कार्य के रूप में बचत या यहाँ तक कि jQuery व्यवहार के कुछ तरह $(".hover").not(".selected");

+0

'indexOf() 'पर एक अच्छा परीक्षण नहीं है कि किसी तत्व के पास एक विशेष वर्ग है और झूठी सकारात्मक उत्पन्न करेगा। उदाहरण के लिए, 'class = "foo_hover_bar" 'वाला तत्व इस कोड से मेल खाता है। –

+0

@Tim अच्छा पकड़ो। धन्यवाद। मैंने कोड अपडेट किया। –

+0

अभी भी एक समस्या है: यह IE <9 में काम नहीं करेगा, जिसमें Arrays के पास 'indexOf() 'विधि नहीं है। –

1

सामान करने के लिए सक्षम होने के लिए नकल पर विचार करना चाहिए आप भी करने के लिए समारोह निम्नलिखित का उपयोग कर सकते कक्षा के नाम से तत्व प्राप्त करें।

excludeClass यहां एक वैकल्पिक पैरामीटर है, यह फ़ंक्शन अभी भी काम करेगा यदि आप केवल includeClass पैरामीटर को परिभाषित करते हैं।

function getElementsByClassName(includeClass, excludeClass) { 
    var elements = []; var el = document.getElementsByTagName('*'); 
    var regexp1 = new RegExp("\\b" + includeClass + "\\b"); 
    var regexp2 = new RegExp("\\b" + (excludeClass ? excludeClass : "") + "\\b"); 
    for (var i = 0; i < el.length; i++) { 
     if (regexp1.test(el[i].className) && !regexp2.test(el[i].className)) { elements.push(el[i]); } 
    } 
    return elements; 
} 
4

निम्नलिखित काम करेंगे। इसे getElementsByClassName() के मूल ब्राउज़र कार्यान्वयन का उपयोग करके अनुकूलित किया जा सकता है जहां सूची को "होवर" वर्ग के साथ तत्वों को फ़िल्टर करने के लिए मौजूद है।

function hasClass(el, cssClass) { 
    return el.className && new RegExp("(^|\\s)" + cssClass + "(\\s|$)").test(el.className); 
} 

var matchingElements = []; 
var allElements = document.getElementsByTagName("*"); 
for (var i = 0, len = allElements.length, el; i < len; ++i) { 
    el = allElements[i]; 
    if (hasClass(el, "hover") && !hasClass(el, "selected")) { 
     matchingElements.push(el); 
    } 
} 
+1

+1 हैस्क्लस फ़ंक्शन के लिए +1 – meo

+0

@Alin: हालांकि यह ठीक है, क्योंकि यह रेगेक्स पर विभाजित नहीं है। यह जांचता है कि कक्षा या तो शुरुआत में या तुरंत एक सफेद जगह चरित्र से पहले है; इससे पहले कि व्हाइटस्पेस चरित्र (यदि मौजूद है) अप्रासंगिक है। कक्षा के अंत की जांच के लिए तर्क समान है। –

+0

आप सही हैं। माफ़ कीजिये। –

संबंधित मुद्दे