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

Edw*_*uay 3 javascript php ajax extjs eval

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

为了创建一个的TabPanel,例如,PHP类被实例化与网址的阵列,其获得动态加载,当用户点击一个标签报头.

为了做到这一点,我使用以下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]);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我经常看作为这个问题的答案,有通常不需要使用eval() ,因为你需要的eval做什么()可以通常可以在其他方式来实现.我也理解在通过AJAX加载的PHP页面中执行脚本会带来安全风险,需要以其他方式锁定,所以我想找到另一种更安全的方法来做到这一点.

什么是动态加载,并从服务器没有的eval(执行JavaScript)的另一种方式,让我有相同的功能我用上面的脚本现在要做的,即TabPanels其负载从服务器执行JavaScript只有当标签点击标题?

kio*_*opi 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); 
Run Code Online (Sandbox Code Playgroud)

如果您想要更安全的方法,我建议研究"JSONP".