Что лучший метод должен динамично поиграть в песочнице встроенный 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 в нем, но я надеялся, был немного лучший метод для и обеспечения совместимости и безопасности увеличения.

6
задан Aaron Harun 23 July 2010 в 18:34
поделиться

2 ответа

Скорее всего, это не даст вам именно то, что вам нужно, но как насчет того, чтобы обернуть текст вашего скрипта внутри функции или литерала самоисполняющейся функции (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 и т. д.). Если рекламное агентство решит добавить код, который точно соответствует вашему пространству имен, они уничтожат вашу страницу, но пока этого не произошло.

1
ответ дан 17 December 2019 в 18:09
поделиться

Вы можете попробовать перекомпилировать javascript с помощью caja: http://en.wikipedia.org/wiki/Caja_project

2
ответ дан 17 December 2019 в 18:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: