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