如何在不使用eval()的情况下从服务器动态加载和执行Javascript?

时间:2010-12-22 09:07:54

标签: php javascript ajax extjs eval

我正在编写一个 PHP框架,它允许PHP开发人员使用PHP类创建ExtJS接口表单,网格,tabpanel和菜单

例如,为了创建一个TabPanel, PHP类被实例化,其中包含一个URL 动态加载用户单击选项卡标题。

为了做到这一点,我使用以下Javascript函数,通过AJAX调用加载PHP页面执行其中的任何脚本

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]);
            }
        }
    });
}

我经常阅读as in the answers to this question 通常不需要使用eval(),因为您需要对eval()执行的操作通常可以以其他方式实现即可。我也理解在通过AJAX加载的PHP页面中执行脚本会带来安全风险,需要以其他方式锁定,所以我想找到另一种更安全的方法来做到这一点。

在没有eval()的情况下,从服务器动态加载和执行javascript的替代方法是什么,这样我就可以使用与上面脚本相同的功能,即从中加载和执行Javascript的TabPanels仅在单击选项卡标题时服务器?

3 个答案:

答案 0 :(得分:7)

您可以随时通过脚本注入加载其他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”。

答案 1 :(得分:0)

您可以在服务器响应中返回脚本的文件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);

我希望这会有所帮助。

答案 2 :(得分:0)

eval的替代方法,即使它不是更安全的是将代码包装在函数体中并调用函数。

var body = "you source here";

var f = Function(body);

f();

这可用于加载可重用的代码段。