2010-06-28 12 views
6

Tengo un plugin de WordPress que carga páginas con AJAX y para garantizar la compatibilidad con otros complementos y "widgets".¿Cuál es el mejor método para sandbox dinámicamente en línea?

A partir de ahora uso el siguiente código de evaluar toda la JS en línea que está dentro de los bloques de contenido que se actualicen:

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

Me gustaría ser capaz de sandbox de la JS un poco mejor por lo que el riesgo de conflictos se reduce al mínimo. Una idea que tenía era crear dinámicamente un y ejecutar el JS dentro de él, pero esperaba que hubiera un método un poco mejor para garantizar la compatibilidad y aumentar la seguridad.

Respuesta

1

Lo más probable es que esto no le dará exactamente lo que necesita, pero ¿qué hay de envolver el texto de la escritura dentro de una función o función autoejecutable literal (function(){/*...*/})().

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

Esto proporciona más protección que la recta eval nente y mantiene el código en el mismo documento. La desventaja es que si el código que está importando está desordenado sobre las variables globales (que es probablemente la razón por la que hace esta pregunta), aún podría tener su código pisoteando otro código. Y si usan la palabra clave this, es probable que su código no funcione según lo previsto. Pero esto al menos mantendrá las variables declaradas y las declaraciones de funciones correctamente en un alcance encapsulado.

He trabajado mucho con código de terceros (en su mayoría código de anuncio horrible y horriblemente escrito) y he encontrado que la mejor solución es mantener el código de su sitio envuelto en un espacio de nombres largo y exclusivo (mySiteUtils, mySiteGames, etc. o com.mysite.utils, com.mysite.games, etc.). Si una agencia de publicidad decide incluir un código que coincida con su espacio de nombre exacto, destruirá su página, pero hasta ahora eso nunca sucedió.

2

usted podría intentar volver a compilar el código JavaScript con Caja: http://en.wikipedia.org/wiki/Caja_project

+0

Desafortunadamente, este complemento se ejecuta en cientos de sitios que no controlo en absoluto, por lo que no puedo ejecutar fragmentos de JS a través de Caja como un sitio como myspace. La solución debe ser redistribuible. –

Cuestiones relacionadas