Что это лучший способ, чтобы динамически песочнице встроенного кода 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 6

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