我有一个加载一些自定义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.有没有人知道如何解决这个问题?
谢谢
答案 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"