2011-05-02 13 views
5

क्या जावास्क्रिप्ट को जावास्क्रिप्ट के माध्यम से ब्राउज़र में पास करना और jQuery के साथ इसे पार्स करना संभव है, लेकिन बाहरी संसाधनों को लोड नहीं करना है? (स्क्रिप्ट, छवियों, फ़्लैश, कुछ भी)संसाधन लोड किए बिना jQuery के लिए ब्राउज़र पार्स एचटीएमएल

यदि मैं सबसे अच्छा कर सकता हूं तो मैं एक्सएमएल पार्सर के साथ करूंगा, लेकिन यदि संभव हो तो मैं ढीला HTML को अनुमति देना चाहता हूं।

यह क्रोम, फ़ायरफ़ॉक्स, नवीनतम आईई के साथ संगत होना चाहिए।

+0

मैंने इस मुद्दे को हल किया .. आप किसी भी टैग के लिए src को बदलने में इसे अनुकूलित कर सकते हैं http://stackoverflow.com/questions/6671461/replace-img-elements-src-attribute-in-regex – samccone

+0

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

उत्तर

1
var html = someHTML; //passed in html, maybe $('textarea#id').val();? I don't understand what you mean by 'passed in html' 
var container = document.createElement('div'); 
container.innerHTML = html; 
$(container).find('img,embed,head,script,style').remove(); 
//or 
$(container).find('[src]').remove(); 

var target = someTarget; //place to put parsed html 
$(container).appendTo($(target)); 

संपादित

परीक्षण

removeExt = function(cleanMe) { 
    var toScrutinize = $(cleanMe).find('*'); //get ALL elements 
    $.each(toScrutinize, function() { 
     var attr = $(this)[0].attributes; //get all the attributes 
     var that = $(this); 
     $.each(attr, function(){ 
      if ($(that).attr(this.nodeName).match(/^http/)) {//if the attribute value links externally 
      $(that).remove(); //...take it out 
      } 
     }) 
    }) 
    $('script').remove(); //also take out any inline scripts 
} 

var html = someHTML; 
var container = document.createElement('div'); 
container.innerHTML = html; 
removeExt($(container)); 
var target = someTarget; 
$(container).appendTo($(target)); 

यह src, href, लिंक, डाटा-foo की पूर्ति करेंगे काम कर रहा है, जो कुछ ... कोई रास्ता नहीं बाहर से लिंक हो। http और https दोनों मेल खाते हैं। इनलाइन स्क्रिप्ट मारे गए हैं। यदि यह अभी भी एक सुरक्षा चिंता है, तो शायद यह सर्वर पक्ष किया जाना चाहिए, या अपने जेएस obfuscate।

+0

दिलचस्प समाधान, लेकिन सुरक्षा के लिए विशेष रूप से अच्छा नहीं है। क्षमा करें, ऐसा लगता है कि जवाब है "यह ब्लैकलिस्ट के बिना नहीं किया जा सकता"। –

+0

बाहरी रूप से, क्या आपका मतलब हमेशा स्क्रिप्ट के डोमेन के अलावा किसी अन्य डोमेन पर होस्ट किया जाता है? या क्या आपका मतलब कोई तत्व है जिसे एक HTML फ़ाइल में चित्रित नहीं किया जा सकता है? –

+0

मैं पार्स होने पर कोई नेटवर्क गतिविधि नहीं करना चाहता हूं, और मैं नहीं चाहता कि कोई स्क्रिप्ट चलें। –

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