2010-09-04 11 views
9

के आधार पर किसी तत्व के सभी गुणों को निकालें, मुझे कुछ मैन्युअल रूप से चुने गए लोगों को छोड़कर, कुछ तत्वों (वेनिला जेएस या jQuery का उपयोग करके) पर सेट सभी विशेषताओं को हटाने की आवश्यकता है।श्वेतसूची

<img hspace="4" border="1" vspace="4" src="someimage.jpg" alt="somealt" /> 

और मैं परिणाम के रूप में चाहते:

<img src="someimage.jpg" alt="somealt" /> 

एक ही रास्ता मैं के बारे में सोच सकता है .removeAttr() हर एक विशेषता है का कहना है कि मैं एक छवि है देता है। लेकिन समस्या यह है कि कुछ बार तत्वों में ऐसे गुण होते हैं जो W3C विनिर्देश में मौजूद नहीं होते हैं। मैं उन सभी अन्य विशेषताओं को हटाना चाहता हूं जो श्वेतसूची नहीं हैं।

आप यह कैसे करेंगे?

उत्तर

13

यहां एक समाधान है जो attributes सूची पर पुनरावृत्त करता है।

मैं वास्तव में केवल "" (रिक्त स्ट्रिंग) के लिए अपने मूल्य सेट कर रहा हूं, क्योंकि किसी कारण से, removeAttribute() में विफल रहता है जब यह border विशेषता के लिए हो जाता है।

var whitelist = ["src","alt"]; 

$('img').each(function() { 
    var attributes = this.attributes; 
    var i = attributes.length; 
    while(i--) { 
     var attr = attributes[i]; 
     if($.inArray(attr.name,whitelist) == -1) 
      this.removeAttributeNode(attr); 
    } 
});​ 
+0

सही! अब मेरी श्वेतसूची के साथ एक सरणी या कुछ बनाना संभव होगा? यदि कथन में सभी को सूचीबद्ध करने के लिए यह थोड़ा असुविधाजनक है। – meo

+0

@ पैट्रिक dw: मैंने इसे देखने से पहले यह पता लगाया और मेरे उत्तर में अपडेट किया लेकिन अब इसकी आवश्यकता नहीं है :) +1 – Sarfraz

+0

'गुण [i] .nodeName' का उपयोग करना बेहतर नहीं होगा। – Sarfraz

0

स्थिति के आधार पर, आप एक नया तत्व बना सकते हैं, श्वेतसूची के आधार पर पुराने के गुणों की प्रतिलिपि बना सकते हैं, और प्रतिस्थापित कर सकते हैं; या आप इसे एक HTML स्ट्रिंग में बदल सकते हैं और इसे पार्स कर सकते हैं। लेकिन संभावना है, अगर आपको jQuery से तत्वों को स्वच्छ करने की आवश्यकता है, तो आप कुछ गलत कर रहे हैं। आप क्या हासिल करना चाहते हैं?

+0

दिया यह है: http://www.google.com/reader/shared/meodai और वहाँ मेरी परिणाम है: http://meodai.ch/content_slider/ चीज नहीं सभी विशेषताओं के सभी प्रकार है उन तत्वों पर जिन्हें मैं हटाना चाहता हूं। – meo

+0

उस स्थिति में, कुछ [reset.css] (http://meyerweb.com/eric/tools/css/reset/) -ish का उपयोग करना बेहतर नहीं होगा? केवल इतना सीएसएस विशेषताएं हैं जो आपके लेआउट को बाधित कर सकती हैं। – Tgr

+0

यह सिर्फ लेआउट के बारे में नहीं, बल्कि वैधता है। और फिर आपको एक ही समस्या है। कुछ अटैचर्स जो लोग सेट करते हैं, वे बस मौजूद नहीं होते हैं, इसलिए उन्हें रीसेट करना मुश्किल होता है और यह बताने के लिए कि ब्राउजर – meo

2
<div id="container"><img id="img" hspace="4" border="1" vspace="4" src="someimage.jpg" alt="somealt"> 
</div> 
<textarea rows="15" cols="80" id="dbg"></textarea> 

और जावास्क्रिप्ट:

$('#dbg')[0].value += $('#container').html(); 
atts = $("#img")[0].attributes; 
var img = $("#img"); //since it may remove id as well 
for (var i = atts.length - 1; i >= 0; i--) { 
    var name = atts[i].name; 
    if (name != 'src' && name != 'alt') { //you can implement an array or other thing 
     img.removeAttr(name); 
    } 
} 

$('#dbg')[0].value += $('#container').html(); 

यहाँ का प्रयास करें: http://jsfiddle.net/drZhu/

1

मैं आम तौर पर ड्रॉप डाउन नहीं करना पसंद करते हैं की जांच ...

इसे आज़मा कर देखें कच्चे जेएस डोम तक जब तक जेक्यू के साथ काम करते समय बिल्कुल जरूरी नहीं है तो बीमार प्रस्ताव शुद्ध जेक्यू समाधान:

$('img').each(function() { 
    var e = $(this); 
    var whitelist = ['src','title']; 
    $.each(this.attributes, function(attr, value){ 
     if($.inArray(attr, whitelist) == -1) { 
      e.removeAttr(attr); 
     } 
    }); 
}); 
+2

jQuery बहुत व्यावहारिक है, लेकिन जब आप इसका वास्तविक उपयोग करते हैं तो मैं इसका उपयोग करता हूं। इस मामले में उदाहरण के लिए आप अपने $ .each को एक डालने के लिए जावास्क्रिप्ट "के लिए" बदल सकते हैं और आप गति में सुधार करेंगे ... विशेष रूप से उन कार्यों पर जहां आपको HTML फ़ाइलों को पार्स करना पड़ता है जो बहुत लंबा हो सकता है, इससे बड़ा अंतर हो सकता है। .. लेकिन आपका समाधान मेरे लिए बहुत उचित है +1 – meo

+1

बड़े डेटा सेट पर अच्छी गति कुछ मामलों में चिंता का विषय है और यदि यह एक मुद्दा है जो "बिल्कुल जरूरी" निर्देशित करेगा। लेकिन आमतौर पर मैं चीजों के लिए jQuery के एपीआई के साथ शुरू करता हूं और उसके बाद मामले के आधार पर एक मामले पर अनुकूलित करता हूं। मैं उसी अभ्यास का उपयोग करता हूं जब ओआरएम जैसे डॉक्टरेट या प्रोपेल (php) डिफ़ॉल्ट रूप से उस अज्ञेय एपीआई में सबकुछ करते हैं, फिर प्रश्नों को अनुकूलित करें, या मामले के आधार पर कच्चे पीडीओ को छोड़ दें। आपकी विचारशील और सटीक टिप्पणी के लिए +1 ... – prodigitalson

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