2010-06-28 5 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 внутри него, но я надеялся, что существует немного лучший метод для обеспечения совместимости и повышения безопасности.

ответ

1

Скорее всего, это не даст вам именно то, что вам нужно, но как насчет упаковки текст сценария внутри функции или самостоятельного выполнения функции буквального (function(){/*...*/})().

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

Это обеспечивает более высокий уровень защиты, чем прямой eval туации и сохраняет код в том же документе. Недостатком является то, что если код, который вы импортируете, беспорядочен по отношению к глобальным переменным (вероятно, именно поэтому вы задаете этот точный вопрос), вы все равно можете поменять свой код на другой код. И если они используют ключевое слово this, их код, скорее всего, не будет работать так, как предполагалось. Но это, по крайней мере, будет поддерживать корректно объявленные переменные и объявления функций в инкапсулированной области.

Я работал с сторонним кодом много (в основном ужасно, ужасно написанный рекламный код), и я нашел лучшее решение - сохранить код сайта, завернутый в длинное и уникальное пространство имен (mySiteUtils, mySiteGames, или com.mysite.utils, com.mysite.games и т. д.). Если рекламное агентство решит отказаться от кода, совпадающего с вашим точным пространством имен, оно уничтожит вашу страницу, но пока этого не произошло.

2

Вы можете попробовать перекомпиляции JavaScript с Caja: http://en.wikipedia.org/wiki/Caja_project

+0

К сожалению, этот плагин работает на сотнях сайтов, на которых я вообще не контролирую, поэтому я не могу запускать фрагменты JS через Caja, такие как сайт myspace. Решение должно быть перераспределяемым. –

Смежные вопросы