为什么Javascript对待相对URL的方式与标准HTML不同?请考虑以下URL(或直接浏览到它):http://en.wikipedia.org/wiki/Rome。打开Firebug控制台(或另一个Javascript控制台)并输入以下内容:
var x = new XMLHttpRequest();
x.open("GET", "foo", true);
x.send("bar");
在我的系统中,请求被发送到“http://en.wikipedia.org/wiki/foo“。URL中的“罗马”被简单地忽略。在URL中带有尾部斜杠的相同请求(“http://en.wikipedia.org/wiki/Rome/“)将“foo”附加到完整的URL。
这似乎使得用Javascript编码正确的URL变得相当困难。有没有任何Javascript库可以帮助克服这个问题?
(我以前问过一个类似的question问题,但更具体地说是jQuery,在哪里也会发生这种情况。我希望这个更独立于库的问题能得到更好的答案。)
2条答案
按热度按时间pjngdqdw1#
(更新后可读性更强)
这就是相对路径的工作原理。
假设当前地址为:
如果你只指定了一个新文件名“foo”,你会得到相同的协议,主机和目录,只是文件名被改变了:
foo
protocol://some.domain.name/dir1/dir2/foo
如果您指定完整路径“/dir 3/filename 2”,则会获得相同的协议和主机名,但路径不同:
/dir3/filename2
protocol://some.domain.name/dir3/filename2
您还可以指定主机名“//another.domain.name/dir5/filename3“,并获得相同的协议,但使用另一个主机、目录和文件名:
//another.domain.name/dir5/filename3
protocol://another.domain.name/dir5/filename3
令人困惑的是,如果指定的url指向一个目录而不是一个文件,那么web服务器内部可以在url的末尾添加一个/。
protocol://some.domain.name/somename
如果“somename”是一个目录,则Web服务器可能会将其转换到该目录(可以使用重定向)
protocol://some.domain.name/somename/
更新
正如cameron在评论中所说:有关参考,请参见RFC 1808第4节中的步骤6
cqoc49vn2#
http://code.google.com/p/js-uri/似乎是URL操作的首选库,尤其是这种类型的绝对到相对计算: