Каков наилучший метод для динамической песочницы встроенного JavaScript? - PullRequest
6 голосов
/ 28 июня 2010

У меня есть плагин 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 ]

2 голосов
/ 28 июня 2010

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

1 голос
/ 29 июня 2010

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

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

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

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

...