首先,让我向您展示文件夹结构:
public_html[]
|_ project_folder[]
|_another_folder[]
|_xml_folder[]
|_xmlfile.xml
|_ js_folder[]
|_javascriptfile.js
|_ file.html
|_ file2.html
我有一些file.html和file2.html在文档加载时加载使用jQuery ajax。 Ajax使用以下代码:
$(document).ready(function()
{
$.ajax({
type: "GET",
url: "xml/xmlfile.xml",
dataType: "xml",
...
...
...
}
当在文件的根目录中找到HTML文件时,这些工作正常(就像他们现在的样子一样)
现在,当我将html文件移动到文件夹(例如,将file2.html移动到another_folder)时,加载xml文件不再起作用了。请注意,我已经在html上更改了必要的src标签,即:从src \“js / javascriptfile.js”到src = \“../ js / javascriptfile.js”。
我没有改变的是javascript文件中的“url”。现在,XML没有加载,因为它试图在它自己的目录(another_folder / xml / xmlfile.xml)上查找XML文件,而不是从它所在的根目录中查找。
我的问题是,为了避免这个问题应该怎么做?
答案 0 :(得分:4)
在js文件中使用绝对URL,例如
'/project/xml/xmlfile.xml'
如果你希望它比这更通用,你可以做其他事情,比如阅读当前网址并从中构建ajax网址。
更新:回复评论 您可以如何生成正确路径的示例。 如果项目始终是第一个子目录,那么这应该可以构建正确的URL。
function xml_url(){
var first_dir_regexp = /https?:\/\/[^\/]+\/([^\/]+)\/.+/;
matches = first_dir_regexp.exec(document.location.toString());
return matches[1]+"/xml/xmlfile.xml";
}
//...
xml_url()
此代码使用regexp来提取url的第一个目录并将/xml/xmlfile.xml附加到其中。
例如如果页面是example.com/project1/awesome/index.html,则会返回example.com/project1/xml/xmlfile.xml
注意这段代码非常脆弱,您可能想要添加一些检查。这只是一个例子。
如果你的项目不止一个级别,你应该考虑添加一些配置设置,让javascript更多地了解它运行的环境。
答案 1 :(得分:3)
使用相对于Web根目录的URL,而不是当前目录。
$(document).ready(function()
{
$.ajax({
type: "GET",
url: "/xml/xmlfile.xml", // note the leading slash
dataType: "xml",
...
...
...
}
答案 2 :(得分:1)
由于我讨厌重复代码,我也遇到了同样的问题。
我这样想:
我的目录结构:
include_db/
dbconnect.php
main_project/
shared_code/
ajax/
ajax_script.php
shared_js.php
sub_project/
sub_index.php
index.php
请注意,我在 .php 文件中确实有javascript!我会解释为什么会降低。
从 index.php 我包含共享java声明:
<script type="text/javascript" src="./shared_code/shared_js.php"></script>
从 sub_index.php 我这样做:
<script type="text/javascript" src="../shared_code/shared_js.php?path=."></script>
shared_js.php 文件正在使用AJAX,所以这就是为什么它在 .php 而不是 .js :
$.ajax({
url: ".<?php echo $_GET[path]; ?>/shared_code/ajax/ajax_script.php",
...
因为我必须根据我从哪里调用它来改变该ajax脚本的路径。这是我在 index.php 或 sub_index.php 中设置的 $ _ GET [路径] 变量的内容。
AJAX脚本 ajax_script.php 然后再次使用相对于自身的路径,因此它会像您通常那样:
<?php
require("../../../include_db/dbconnect.php");