代码之家  ›  专栏  ›  技术社区  ›  CW Holeman II

为什么jquery.get(“/home/user/0/0a.html”)在使用file:而不是http:时失败?

  •  1
  • CW Holeman II  · 技术社区  · 14 年前

    在前两段中,单击将生成一个包含指定文件内容的警告框。在第二个框中没有警报框。

    <html><head>
    <script type="text/javascript" src="../../../../resources/jquery_1-4-2.js"></script>
    </head><body>
    <p onclick="$.get('/home/user/0/1/2/3/4/4a.html','',function(a){alert(a);});">
    Get /home/user/0/1/2/3/4/4a.html</p>
    <p onclick="$.get('/home/user/0/1/2/3/4/resources/4ra.html','',function(a){alert(a);});">
    Get /home/user/0/1/2/3/4/resources/4ra.html</p>
    <p onclick="$.get('/home/user/0/0a.html','',function(a){alert(a);});">
    Get /home/user/0/0a.html</p>
    <p onclick="$.get('/home/user/0/1/2/3/resources/3ra.html','',function(a){alert(a);});">
    Get /home/user/0/1/2/3/resources/3ra.html</p>
    </body></html>
    

    系统和浏览器:

    Linux Road 2.6.32-23-generic-pae #37-Ubuntu SMP Fri Jun 11 09:26:55 UTC 2010 i686 GNU/Linux
    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6
    

    文件在本地文件系统上。使用的URL是:

    file:///home/user/0/1/2/3/4/test.html
    

    通过直接从显示的页面复制URL,将URL输入到Web浏览器地址栏时,四个文件中的每个文件的内容都将按预期显示。( /home/user/0/1/2/3/4/4a.html , /home/user/0/1/2/3/4/resources/4ra.html , /home/user/0/0a.html , /home/user/0/1/2/3/resources/3ra.html )

    但是,使用 http://localhost:8000/home/user/0/1/2/3/4/test.html ,使用:

    python -m SimpleHTTPServer
    

    然后,这四项工作按预期进行。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Bartek    14 年前

    我可能错了,但我觉得失败是因为 $.get() 遵循 Same origin policy 当处理一个请求时,由于/home/user/whatever不是有效的链接,而是一个文件路径,所以它在那里失败。

    我建议花2分钟运行一个快速测试服务器,并在本地域中使用真正的URL进行尝试。

    如果安装了python,只需在终端中键入以下命令即可:

    python -m SimpleHTTPServer
    
        2
  •  1
  •   Community Johnny    7 年前

    security.fileuri.strict_origin_policy 正在阻止访问。要更正输入 about:config 在地址栏中,然后更改 true false 对于 security.fileuri.strict来源策略 它将授予使用方案访问所有文件的权限 file: 除了 http: .

    从长远来看,这个信息的出发点来自于巴特克对这个词的使用。 Same origin policy 维基百科链接 his answer .

    Browser Security Handbook, part 2 -谷歌代码上的项目托管:

    目前只有Firefox 3 使用基于目录的浏览器 同一来源访问的范围界定方案 在文件中://。这是有风险的 打破了当地古怪的应用, 不得为 共享下载目录,但 否则明智的做法。

    来自Mozilla开发中心 Same-origin policy for file: URIs :

    从gecko 1.9开始,文件是 只允许读取某些其他 文件夹。具体来说,文件可以读取 只有当父级 原始文件的目录是 目标的祖先目录 文件。

    但是,

    新的 security.fileuri.strict来源策略 首选项,默认为true, 如果用户 不想严格执行 文件上的同一源策略:uris。

    因此,第二个文件遇到了这个限制,可以通过更改 security.fileuri.strict来源策略 .

    请注意,在层次结构的其他部分中启用访问权限不会授予超出文件系统直接允许的任何访问权限。

        3
  •  0
  •   JAL    14 年前

    我先关闭你的 <p> 标签,然后看看它是如何工作的。

    此外,您确实应该将事件与 $().bind('click', function(){}) $().click(function(){}) 而不是 onclick .

    您是在使用Firebug,还是在查看错误控制台?

    我得到了 mismatched tag. Expected: </p>. 单击第一个后出错。然而,他们都为我工作。

    确保文件存在并且路径正确。

    下面是一个具有更多jquery类绑定的版本:

    <html>
      <head>
        <script type="text/javascript" src="file:////var/duck/js/jquery-1.4.2.js"></script>
    
        <script>
          $(document).ready(function(){
            $('#p_1').click(function(){
              $.get('/home/user/whatever.html','',function(a{alert(a);});
            });
          });
        </script>
      </head>
        <body>
          <p id='p_1'>
            Get /home/user/0/1/2/3/4/4a.html
          </p>
          <p id='p_2'>
            Get /home/user/0/1/2/3/4/resources/4ra.html
          </p>
          <p id='p_3'>
            Get /home/user/0/0a.html
          </p>
          <p id='p_4'>
            Get /home/user/0/1/2/3/resources/3ra.html
          </p>
        </body>
      </html>
    

    填写每个的绑定 <P & GT; . 有很多种方法可以将元素链接到首选文件,实际上是委派、数组、索引等。