dojo加载js脚本然后执行它

时间:2013-10-13 03:49:02

标签: dojo

我正在尝试使用xhr加载模板,然后将其附加到某个div中的页面。 问题是页面加载脚本但不执行它。 我得到的唯一解决方案是在页面中添加一些标志(比如说:“Splitter”),在分割器之前,我把js代码,在分割器之后我添加了html代码,当我通过ajax获取模板时,我拆分它。这是一个例子:

我通过ajax请求的数据是:

//js code:
work_types = <?php echo $work_types; ?>; //json data

<!-- Splitter -->

html code:
<div id="work_types_container"></div>

所以回调返回“数据”,我只是将其拆分并执行:

data = data.split("<!-- Splitter -->");
dojo.query("#some_div").append(data[1]); //html part
eval(data[0]); //js part

虽然这适合我,但它似乎并不那么专业! 道场还有另一种方法可以使它发挥作用吗?

1 个答案:

答案 0 :(得分:2)

如果您正在使用Dojo,那么查看dojox/layout/ContentPane模块(reference guide)可能是值得的。它与dijit/layout/ContentPane变体非常相似,但有一个特殊的扩展名,它允许在该页面上执行JavaScript(使用eval())。

因此,如果您不想自己完成所有工作,可以执行以下操作:

<div data-dojo-type="dojox/layout/ContentPane" data-dojo-props="href: myXhrUrl, executeScripts: true"></div>

如果您担心它是 DojoX 模块(DojoX将在Dojo 2.0中消失),该模块将标记为维护,因此它有更高的机会在以后的版本中集成在dijit中。


作为eval()安全问题的答案(在评论中)。当然,它是允许的,否则他们就不会有这样一个名为eval()的函数。但事实上,它不太安全,其原因是客户端实际上信任服务器并执行服务器发送给客户端的所有内容。

通常情况下,除非服务器发送恶意内容(这可能是由于服务器上的问题或中间人攻击中的问题),否则不会出现问题,这会导致XSS漏洞。

在理想世界中,服务器仅发送数据,客户端会解释此数据并自行呈现。在此设计中,客户端仅信任来自服务器的数据,因此不能执行恶意逻辑(因此不存在XSS漏洞)。

它不太可能发生,并且在许多情况下甚至不可能实现理想的世界解决方案,因为初始页面请求(加载您的网页)实际上是客户端执行服务器发送的任何内容的类似场景。

Web应用程序安全性不是100%安全(这是不可能的),而是尝试尽可能少地创建可供黑客使用的打开门。这取决于您认为安全的内容,并验证在这种特定情况下是否可以使用“理想世界”解决方案(可能不是,或者与其他解决方案相比可能需要花费太多时间)。