Как я могу динамически загружать и выполнять Javascript с сервера без использования eval ()? - PullRequest
3 голосов
/ 22 декабря 2010

Я пишу PHP Framework , который позволяет разработчикам PHP создавать интерфейсы ExtJS с формами, сетками, табуляциями и меню , используя только классы PHP .

Например, для создания TabPanel * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1011* '*' * '*. заголовок вкладки.

Для этого я использую следующую функцию Javascript, которая загружает страницу PHP через вызов AJAX и выполняет любые скрипты внутри нее.

function loadViewViaAjax(url) {
    Ext.Ajax.request({
        url: url,
        success: function(objServerResponse) {
            var responseText = objServerResponse.responseText;
            var scripts, scriptsFinder=/<script[^>]*>([\s\S]+)<\/script>/gi;
            while(scripts=scriptsFinder.exec(responseText)) {
                eval(scripts[1]);
            }
        }
    });
}

Я часто читаю , как и в ответах на этот вопрос , что обычно нет необходимости использовать eval () , поскольку обычно нужно выполнить то, что вам нужно сделать с помощью eval () достигается другими способами . Я также понимаю, что выполнение сценариев на странице PHP, загруженной через AJAX, представляет угрозу безопасности, которую необходимо заблокировать другими способами, поэтому я хотел бы найти другой, более безопасный способ сделать это, если это возможно.

Какой был бы альтернативный способ динамической загрузки и выполнения javascript с сервера без eval (), чтобы у меня была та же функциональность, что и сейчас, с вышеупомянутым сценарием, т.е. TabPanels, которые загружают и выполняют Javascript из сервер только при нажатии на заголовки вкладок?

Ответы [ 3 ]

7 голосов
/ 22 декабря 2010

Вы всегда можете загрузить свой дополнительный Javascript через внедрение скрипта.Если вы создадите новый элемент SCRIPT и поместите его в DOM, браузер загрузит скрипт и выполнит его.В качестве упрощенного примера вы можете использовать это:

var newScript = document.createElement('script'); 
newScript.setAttribute('src', 'http://www.example.com/url/of/your/script.php'); 
document.body.appendChild(newScript); 

Если вы хотите более безопасный подход, я бы рекомендовал исследовать "JSONP".

0 голосов
/ 22 декабря 2010

Альтернатива eval, хотя это и небезопасно, - заключить код в тело функции и вызвать функцию.

var body = "you source here";

var f = Function(body);

f();

Это можно использовать для загрузки повторно используемых сегментов кода.

0 голосов
/ 22 декабря 2010

Вы можете вернуть URL-адрес файла сценариев в ответе вашего сервера (даже временные файлы).С помощью этого URL вы можете динамически добавлять эти скрипты в вашу голову.Если это сложно, вы также можете вернуть текст и включить его через:

var head = document.getElementsByTagName('head').item(0);
var script = document.createElement('script');
    script.language = "javascript";
    script.type = "text/javascript";
    script.id = "script-id";
    script.defer = true;
    script.text = source;

    head.appendChild(script);

Надеюсь, это поможет.

...