2010-06-28 71 views
6

我有一個WordPress插件,可以通過AJAX加載頁面,並確保與其他插件和「小部件」的兼容性。什麼是動態沙箱內聯JavaScript的最佳方法?

截至目前我使用下面的代碼來評估所有的內聯JS就是裏面的內容塊進行更新:

function do_JS(e){ 
     var Reg = '(?:<script.*?>)((\n|.)*?)(?:</script>)'; 
     var match = new RegExp(Reg, 'img'); 
     var scripts = e.innerHTML.match(match); 
     var doc = document.write; 
     document.write = function(p){ e.innerHTML = e.innerHTML.replace(scripts[s],p)}; 
     if(scripts) { 
      for(var s = 0; s < scripts.length; s++) { 
       var js = ''; 
       var match = new RegExp(Reg, 'im'); 
       js = scripts[s].match(match)[1]; 
       js = js.replace('<!--',''); 
       js = js.replace('-->',''); 
       eval('try{'+js+'}catch(e){}'); 
      } 
     } 
     document.write = doc; 
    } 

我希望能夠沙箱JS更好一點所以衝突風險最小化。我的一個想法是動態創建一個並在其中運行JS,但我希望有一個更好的方法來確保兼容性和增加安全性。

回答

1

可能這不會給你你需要什麼,但如何對包裝的功能或自動執行功能字面(function(){/*...*/})()裏面的腳本文本。

var strEval = 'try{'; 
strEval += 'widget[' + intWidgetNumber + '] = (function(){'; 
strEval += js; 
strEval += '})();'; 
strEval += '}catch(e){}'; 

這提供了比直接保護更多的保護並將代碼保留在同一文檔中。缺點是,如果你導入的代碼對於全局變量是混亂的(這可能是你問這個確切問題的原因),你仍然可以讓他們的代碼跺腳在其他代碼上。如果他們使用this關鍵字,他們的代碼可能無法按預期工作。但是這至少會在封裝範圍內保留正確聲明的變量和函數聲明。

我已經使用第三方代碼很多(主要是可怕的,可怕的書面廣告代碼),我發現最好的解決方案是讓您的網站代碼包裝在一個冗長而獨特的命名空間(mySiteUtils,mySiteGames,等等或com.mysite.utils,com.mysite.games等)。如果廣告代理商決定放棄與您的確切名稱空間相匹配的代碼,他們會破壞您的頁面,但迄今爲止從未發生過。

2

你可以嘗試用卡哈重新編譯的JavaScript: http://en.wikipedia.org/wiki/Caja_project

+0

不幸的是,這個插件運行在數百個我根本不能控制的站點上,所以我不能通過Caja運行JS片段,就像myspace這樣的站點。該解決方案需要重新分配。 – 2010-06-28 23:08:27

相關問題