我正在编写一个 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仅在单击选项卡标题时服务器?
答案 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();
这可用于加载可重用的代码段。