2010-06-28 11 views
6

Ho un plugin per WordPress che carica pagine con AJAX e garantisce la compatibilità con altri plugin e "widget".Qual è il metodo migliore per sandbox in linea dinamico in modo dinamico?

A partire da ora io uso il seguente codice per valutare tutte JS in linea che si trova all'interno dei blocchi di contenuto da aggiornare:

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; 
    } 

mi piacerebbe essere in grado di sandbox JS un po 'meglio così che il rischio di conflitti è ridotto al minimo. Un'idea che ho avuto è stata quella di creare dinamicamente uno ed eseguire il JS al suo interno, ma speravo che ci fosse un metodo migliore per garantire la compatibilità e aumentare la sicurezza.

risposta

1

È probabile che questo non vi darà esattamente quello che ti serve, ma come su avvolgendo il testo dello script all'interno di una funzione o di una funzione self-executing letterale (function(){/*...*/})().

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

Questo fornisce maggiore protezione rispetto dritto eval uation e mantiene il codice nello stesso documento. Il rovescio della medaglia è che se il codice che si sta importando è disordinato per le variabili globali (che è probabilmente il motivo per cui si sta facendo questa domanda esatta), si potrebbe ancora avere il proprio codice stomping su altro codice. E se usano la parola chiave this, il loro codice probabilmente non funzionerà come previsto. Ma questo almeno manterrà le variabili correttamente dichiarate e le dichiarazioni di funzione in un ambito incapsulato.

Ho lavorato molto con il codice di terze parti (codice dell'annuncio per lo più orribilmente orribilmente scritto) e ho trovato che la soluzione migliore è mantenere il codice del sito avvolto in uno spazio dei nomi lungo e unico (mySiteUtils, mySiteGames, ecc. o com.mysite.utils, com.mysite.games, ecc.). Se un'agenzia pubblicitaria decide di inserire il codice che corrisponde al tuo spazio dei nomi esatto, distruggerà la tua pagina, ma finora non è mai successo.

2

Si potrebbe provare a ricompilare il JavaScript con caja: http://en.wikipedia.org/wiki/Caja_project

+0

Sfortunatamente, questo plugin gira su centinaia di siti che non controllo affatto, quindi non posso eseguire snippet JS attraverso Caja come un sito come myspace. La soluzione deve essere ridistribuibile. –

Problemi correlati