dojo.xhrGet解析脚本标记

时间:2015-06-22 19:26:23

标签: javascript ajax dojo

我的代码类似于

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并且在浏览器完全加载它时处理它时,是否有不同的功能或不同?

3 个答案:

答案 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小部件,它具有urlexecuteScripts属性,可以异步加载HTML页面并在其上执行脚本。但是,第一种解决方案仍然更好。

当你使用eval()时,你只是很难调试代码,而且与在主页上加载脚本而不是异步加载它相比,这也是一个性能问题。原因是eval()是不可预测的。编译器总是尽可能地假设/预测以提高速度,这种情况在这种情况下不会发生。