V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

help! XMLHttpRequest.onload 似乎不会触发, XMLHttpRequest.statu=0,无法从本地服务器 got 到想要的数据,该怎么解决?谢谢!

  •  
  •   Newyorkcity · 2017-08-13 12:38:54 +08:00 · 4006 次点击
    这是一个创建于 2659 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学者,跟着《 Head First HTML5 》在学,书上说本地托管也可以,然后我就用了本地托管(应该就是本地服务器吧?远程托管就是阿里云腾讯云之类的吧?)。本地服务器的建立是根据这个做出来的...
    然后代码是根据书上写的,如下

    function updataSales(responseText){
        var salesDiv = document.getElementById("sales");
        salesDiv.innerHTML = responseText;
    }
    window.onload = function(){    
        var url = "http://localhost/chapter6/sales.json";
        var request = new XMLHttpRequest();
        request.open("GET",url);
        alert("!!!!!");
        request.onload = function(){        
            if (request.status == 200){
                updataSales(request.responseText);
            }        
        }
        request.send(null);
    }
    

    但是由于网页中 id="sales"元素的内容并未改变,在试探哪里错的过程中发现
    request.onload 这个状态可能没有触发(?),用一个 alert("!!!!!");,放在 request.onload 的外面都是能弹出来的,但是放到里面就不会触发。
    然后是第二个问题,request.status = 0。。。
    url 肯定没有输错。
    请问各位能否在不换用远程托管的前提下解决这些问题呢?这些问题又是因为什么发生的啊?
    另外还想请教几个自己在学的过程中感到不解的事儿
    ①.onload 这个在 window.onload 里指的是网页的 DOM 建立完成吗?那放在 request.onload 里,又是以什么事情做完为触发的呢——请求发送过去并且服务器返回了数据吗?
    ②XMLHttpRequest 的 open 方法,书上这么说『 open 方法听上去好像不仅会在请求对象中设置这些值,还会打开连接并获取数据。但实际上并非如此,open 只是用一个 url 建立一个请求,并告诉这个请求对象要使用哪种请求,以便 XMLHttpRequest 验证连接。
    书上这段话『在请求对象中设置这些值』我听懂了,就是给这个对象的一些属性赋值吧?『打开连接并获取数据』就是指向服务器要求 URL 定位的文件的数据吧?但之后的斜体字我就理解不了,它的意思是,open 这个方法仅仅只告知了服务器说我可能会通过什么方式想你要哪里的文件,但是我没有索要,你也不必发送吗??
    谢谢愿意解答的人~!
    7 条回复    2017-08-13 16:34:49 +08:00
    jugelizi
        1
    jugelizi  
       2017-08-13 12:44:46 +08:00
    先装各 apache 或 nignx
    然后用 jquery
    Newyorkcity
        2
    Newyorkcity  
    OP
       2017-08-13 13:12:32 +08:00
    @jugelizi 前面两个可以网上搜搜教程自己安装本地服务器,jquery 的话我现在 js 都没学好还只是初学者,不可能切过去学 jauery 啊。另外请问你觉得是什么问题呢?
    oott123
        3
    oott123  
       2017-08-13 15:20:36 +08:00   ❤️ 1
    你的代码没有问题。我猜测是 xhr 请求出错,请学习如何使用 Chrome Dev Tools。
    onload 没有触发的话,onerror 或者 onreadystatechange 应该触发了。
    以及看书不要太抠字眼,如果你理解不了就跳过。个人觉得这句话挺晦涩的,拿不准要表达什么意思。
    oott123
        4
    oott123  
       2017-08-13 15:21:05 +08:00
    以及,补充一句,这和本地还是远程服务器无关。
    Newyorkcity
        5
    Newyorkcity  
    OP
       2017-08-13 16:24:21 +08:00
    @oott123 谢谢 chrome consolo 做出如下错误提示
    XMLHttpRequest cannot load
    http://gumball.wickedlysmart.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
    我自己也去搜索了一下,已有的问题都比我复杂些,然后我还是看到了跨域问题。然而我觉得这不可能是跨域问题啊,文件在本地,我的网页在本地,本地访问本地,这都能跨域吗。。。
    可以麻烦你再看看可能是什么原因该怎么解决吗,谢谢。
    zhoufenfens
        6
    zhoufenfens  
       2017-08-13 16:30:38 +08:00 via Android
    requet.open 放在 request.onload 后面试试
    oott123
        7
    oott123  
       2017-08-13 16:34:49 +08:00
    @Newyorkcity #5 很明显,你访问了一个不在本地的 url: http://gumball.wickedlysmart.com/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1095 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.