我的代码类似于
import xml.etree.cElementTree as ET
root = ET.Element("root")
doc = ET.SubElement(root, "doc", location="one")
ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
但是从url调用返回的html包含javascript
var targetNode = dojo.byId('xyz');
var xhrArgs = {
url: 'Welcome.do?call=JS',
preventCache: true,
load: function(data){
targetNode.innerHTML = data;
dojo.parser.parse('xyz');
}
}
};
var deferred = dojo.xhrGet(xhrArgs);
并且永远不会解析和执行这些块,这会导致问题,因为在它们中定义了一些dojo存储(除其他外)。
当你可以用服务器端调用替换div并且在浏览器完全加载它时处理它时,是否有不同的功能或不同?
答案 0 :(得分:0)
如果您使用" dojox / layout / ContentPane"而不是简单的div,你将获得一个属性" executeScripts"。这就是你想要的。
答案 1 :(得分:0)
从另一个stackoverflow帖子看起来像解析之前我需要这样做:
var arr = targetNode.getElementsByTagName('script');
for (var n = 0; n < arr.length; n++) {
eval(arr[n].innerHTML)
}
dojo.parser.parse('xyz');
答案 2 :(得分:0)
异步加载HTML页面并通过eval()
抛出它以加载那里的脚本是一种不好的做法。
解决方案非常简单,将JavaScript放在主页上,例如:
var targetNode = dojo.byId('xyz');
var xhrArgs = {
url: 'Welcome.do?call=JS',
preventCache: true,
load: function(data){
targetNode.innerHTML = data;
dojo.parser.parse('xyz');
// Doing something
}
};
var deferred = dojo.xhrGet(xhrArgs);
另一种解决方案就像ben提出的那样,使用dojox/layout/ContentPane
小部件,它具有url
和executeScripts
属性,可以异步加载HTML页面并在其上执行脚本。但是,第一种解决方案仍然更好。
当你使用eval()
时,你只是很难调试代码,而且与在主页上加载脚本而不是异步加载它相比,这也是一个性能问题。原因是eval()
是不可预测的。编译器总是尽可能地假设/预测以提高速度,这种情况在这种情况下不会发生。