2011-05-02 45 views
5

是否可以通過JavaScript將HTML傳遞給瀏覽器並使用jQuery解析它,但是不加載外部資源? (腳本,圖像,閃存,任何東西)瀏覽器在不加載資源的情況下解析jQuery的HTML

如果這是我能做的最好的,我會用XML解析器來做,但如果可能的話,我想讓寬鬆的HTML。

它必須與Chrome,Firefox,最新的IE兼容。

+0

我解決了這個問題..你可以適應這個替換任何標籤的src http://stackoverflow.com/questions/6671461/replace-img-elements-src-attribute-in-regex – samccone 2011-07-12 22:48:17

+0

因爲我不控制源HTML,並有太多棘手的黑客攻擊,我不能接受正則表達式的答案。抱歉。另外,腳本不應該被執行,因爲他們可能決定自己加載外部資源。 – 2011-07-13 00:43:17

回答

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,鏈接,數據富,什麼...沒辦法從外部鏈接。 http和https都匹配。內聯腳本被殺死。如果它仍然是一個安全問題,那麼也許這應該做服務器端,或混淆你的JS。

+0

有趣的解決方案,但不是特別有利於安全。對不起,看起來答案是「沒有黑名單就無法完成」。 – 2012-02-01 23:17:59

+0

通過外部,你的意思是總是託管在域名以外的域名的腳本?或者你的意思是任何無法在單個HTML文件中描述的元素? – 2012-02-01 23:25:04

+0

我不想在解析發生時執行任何網絡活動,並且我不希望任何腳本運行。 – 2012-02-01 23:32:58

相關問題