自定义dojo小部件未在default.htm上加载

时间:2014-10-17 14:50:27

标签: javascript iis dojo

我有一个加载一些自定义dojo小部件的网页(default.htm)。在输入整个网址时,小部件加载正常:

的http:/www.eg/default.htm

但当网站被点击时:     HTTP:/www.eg 小部件不加载。

当它们正确加载时(指定default.htm时),控制台消息是: XHR完成装载:

GET "http://www.eg/Templates/WatershedMap.htm"

当他们没有加载控制台消息时:

OPTIONS http://templates/WatershedMap.htm net::ERR_NAME_NOT_RESOLVED 

我正在运行iis 7.有没有人知道如何解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:0)

我怀疑你在dojoConf或data-dojo-conf中使用的是location.pathname,这是正确的吗?或者可能直接在你的xhr请求中加载WatershedMap.htm?

当您仅使用http; // www.eg/查看页面时,location.pathname只是一个斜杠“/”。如果那时,例如,xhr尝试这样做:

xhr(location.pathname + "/Templates/WatershedMap.html")...

...然后请求将实际转到//Templates/WatershedMap.html

双斜杠表示“protocol relative url”。浏览器将采用与当前页面相同的协议方案(http / https),并附加双斜杠后的任何内容。

换句话说,这实际上会尝试向http; //模板发出跨域请求,从而触发preflight OPTIONS request

但是,当你的页面加载http; // www.eg/foo/时,location.pathname将是“/ something / something”,请求将转到http; // www.eg /foo/Templates/WatershedMap.htm。

如果您需要帮助来查明问题,则必须共享更多代码。查看location.pathname的代码,看看是否找到了可能相关的内容。

根据您的评论

修改,您的dojoConf具有以下内容:

packages: [{
   name: "Templates", 
   location: location.pathname.replace(/\/[^/]+$/, "") + "/Templates"
}] 

其中带有replace()的行采用当前页面的路径(例如/foo/bar.htm),并删除最后一个斜杠及其后的所有内容,然后附加“/ Templates”。

应该确保无论何时加载以“模板”开头的内容(例如,如果执行dojo/text!Templates/Map.htm,它将在服务器上与当前页面相同的目录中查找。

但是,当您使用http; // www.eg/时,路径名只是斜杠,并且不会删除任何内容。所以你最终得到了“//模板”。如前所述,这将成为协议相对URL,模板作为主机名。绝对不是你想要的!

另一方面,当您使用http; // www.eg/default.htm时,路径名为/default.htm,因此所有这些都被删除了,而您只剩下“/ Templates ”。这个你想要的东西!

您只需将以下行替换为

即可解决此问题
   location: location.pathname.replace(/\/[^/]*$/, "") + "/Templates"

只有一个字符差异(+成为*)!现在,如果您正在查看http; // www.eg/,它将删除单斜杠。

在我看来,最好使用显式路径。如果您知道/ Templates将始终是http; // www.eg/Templates,您可以这样做:

   location: "/Templates"