我在grails 1.3.7应用程序中添加了资源插件,除了异步加载的javascript之外,一切正常.
所以,如果我有一个包含a的模板
<r:script>
// javascript here
</r:script>
Run Code Online (Sandbox Code Playgroud)
并通过ajax加载js代码不执行,我得到这个错误:
看起来您缺少对r:layoutResources标记的一些调用
这是有道理的,因为页面已经被渲染,并且没有r:layoutResources来处理新添加的r:script js代码.
我发现的唯一的解决方法是添加
render r.layoutResources(disposition:"defer") 后,实际render(template:...)在异步呈现内容的控制器操作.
还有其他更明确的解决方案吗?
我正在使用jQuery发出ajax请求,并且一切正常。但是它在错误的上下文中评估脚本。
我有一个iframe(相同的域,这里没有后顾之忧),我正在尝试使脚本在iframe的上下文中进行评估,而不是发出ajax请求的位置-例如。不同的框架。
我想我可以告诉Ajax不要评估脚本,而我会自己做工作以在正确的环境中评估脚本。有什么想法或禁用自动评估的方法吗?
编辑
因此,对于最初的问题,我有些不对。加载时不会评估脚本,而是将内容放置在文档中时才评估脚本。您可以通过测试示例来了解这一点:
$('#some_element').html('<span>content</span><script>alert(window)</script>');
Run Code Online (Sandbox Code Playgroud)
现在,当从不同的框架执行此操作时,评估将在调用的范围内进行,而不是要在其中插入内容的元素。
我最终在不使用jQuery的情况下设置了内容,然后查找/避开了任何脚本标签:
element.get(0).innerHTML = data;
element.find('script').each(function() {
otherWindow.eval(this.innerText);
});
Run Code Online (Sandbox Code Playgroud)
最终更新
我最终将其跟踪到源,并从那里覆盖它。.下面是coffeescript,但是您可以理解。我选择覆盖它是因为对于我来说,它永远不会在顶部窗口中发生,但是应该在iframe内容中出现。
$.globalEval = (data) -> (iframeWindow.execScript || (data) -> iframeWindow["eval"].call(iframeWindow, data))(data) if (data && /\S/.test(data))
Run Code Online (Sandbox Code Playgroud) 假设我有
1)HTML文档.
2)这个HTML文档加载Javascript文件"code.js",如下所示:
<script src="code.js">
Run Code Online (Sandbox Code Playgroud)
3)用户点击"code.js"中运行"fetchdata"功能的按钮,
4)"fetchdata"函数如下所示:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4) {
myjsdata = xmlhttp.responseText;
}
}
xmlhttp.open("GET", 'http://www.example.com/data.js', false);
xmlhttp.send(null);
Run Code Online (Sandbox Code Playgroud)
...
现在我如何成功完成以下操作:
我想以某种方式插入/评估我的Javascript,因此"code.js"中的所有函数(包括"fetchdata"和上面/下面定义的函数)都可以访问"中的数据(结构,声明,预先计算的数据值等)". data.js".
(如果这是可能的,那么我会等到加载实际的JS数据文件,直到用户明确请求它为止.)