У меня есть плагин WordPress, который загружает страницы Ajax и гарантировать совместимость с другими плагинами и "виджетами".
С прямо сейчас я использую следующий код для оценки, все встраивают 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 немного лучше так, чтобы риск конфликтов был минимизирован. Одна идея, которую я имел, состояла в том, чтобы динамично создать <iframe>
и выполненный JS в нем, но я надеялся, был немного лучший метод для и обеспечения совместимости и безопасности увеличения.
Скорее всего, это не даст вам именно то, что вам нужно, но как насчет того, чтобы обернуть текст вашего скрипта внутри функции или литерала самоисполняющейся функции (function () {/*...*/}) ( )
.
var strEval = 'try{';
strEval += 'widget[' + intWidgetNumber + '] = (function(){';
strEval += js;
strEval += '})();';
strEval += '}catch(e){}';
Это обеспечивает большую защиту, чем прямая eval
uation, и сохраняет код в том же документе. Обратной стороной является то, что если код, который вы импортируете, беспорядочно относится к глобальным переменным (вероятно, поэтому вы задаете именно этот вопрос), вы все равно можете столкнуть их код с другим кодом. И если они используют ключевое слово this
, их код, скорее всего, не будет работать должным образом. Но это, по крайней мере, сохранит правильно объявленные переменные и объявления функций в инкапсулированной области.
Я много работал со сторонним кодом (в основном ужасно, ужасно написанным рекламным кодом), и я нашел лучшее решение - хранить код вашего сайта в длинном и уникальном пространстве имен (mySiteUtils, mySiteGames и т. Д. .или com.mysite.utils, com.mysite.games и т. д.). Если рекламное агентство решит добавить код, который точно соответствует вашему пространству имен, они уничтожат вашу страницу, но пока этого не произошло.
Вы можете попробовать перекомпилировать javascript с помощью caja: http://en.wikipedia.org/wiki/Caja_project