V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
zhiml0ve
V2EX  ›  JavaScript

js小白,搞不清楚XMLHttpRequest对象的异步过程。实在是不知道可以在哪里发问和向谁发问...请见谅..

  •  
  •   zhiml0ve · 2012-10-09 23:38:16 +08:00 · 3904 次点击
    这是一个创建于 4432 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想在页面输入豆瓣的链接,然后显示书名,到底是哪个地方有问题?
    希望好心人解答一下,麻烦了。

    <html>
    <head>
    <title>Get Book Name..</title>

    <script type="text/javascript">
    function getit(){
    var xmlReg = new XMLHttpRequest();
    var curl = document.getElementById("e_url").value;
    xmlReg.open("GET",curl,true);
    xmlReg.onreadystatechange = handleRequest;
    xmlReg.send(null);
    }
    function handleRequest(){
    if (xmlReg.readyState==4 && xmlReg.status==200) {
    var bookname = document.title;
    var change = document.getElementByTagName("h1")[0];
    change = bookname;
    };
    }
    </script>
    </head>

    <body>
    <input type="text" id="e_url" value="" />
    <input type="button" id="get_it" value="Get It.." onclick="getit();"/>
    </br>
    <h1></h1>
    </body>
    </html>
    11 条回复    1970-01-01 08:00:00 +08:00
    raptium
        1
    raptium  
       2012-10-09 23:41:04 +08:00
    没细看
    不过跨站的 XHR 默认是不允许的,如果豆瓣服务器没有特别支持的话
    raptium
        2
    raptium  
       2012-10-09 23:42:28 +08:00   ❤️ 1
    另外楼主如果用 Chrome 调试,Console 里应该会提到 Same Origin Policy 之类的东西,就是说的这个问题
    zhiml0ve
        3
    zhiml0ve  
    OP
       2012-10-09 23:50:07 +08:00
    @raptium 就是在chrome调试的,现在发现getElementsByTagName少了s,加上了;在change = bookname;语句前面加了alert(change);却完全没有反应。就是跨站不行吗?
    感谢回答..
    zythum
        4
    zythum  
       2012-10-09 23:52:22 +08:00
    xhr不能跨区,安全问题。如果要做的话可以做成chrome插件之类的可以。
    tux
        5
    tux  
       2012-10-10 01:59:43 +08:00   ❤️ 1
    chrome默认不能跨域
    用 iframe 吧~
    chone
        6
    chone  
       2012-10-10 03:25:20 +08:00
    除了跨域的问题,handleRequest的逻辑也不对,数据应该是从xmlReg.responseXML取得。
    document是当前页面的。
    还有没有.getElementByTagName这个方法,应该是.getElementsByTagName。

    关于dom的操作lz可以看一下这个 http://www.w3school.com.cn/xmldom/dom_nodes_info.asp
    nicolazj
        7
    nicolazj  
       2012-10-10 21:47:58 +08:00
    v2ex 发帖不能格式化代码吗~
    ant_sz
        8
    ant_sz  
       2012-10-10 22:10:24 +08:00
    @tux iframe也不行哦。现在在js里加载跨域的page,是不能通过访问iframe的document访问到iframe的内容了

    @zhiml0ve 可以考虑豆瓣开放的API,豆瓣甚至有一个封装好的JS库可以直接调用。另外,实现跨域的js通讯交流有种方法叫做 JSONP ,可以 Google 一下试试
    liuyl
        9
    liuyl  
       2012-10-10 22:23:17 +08:00
    douban图书有api,调用api吧
    foru17
        10
    foru17  
       2012-10-10 22:28:57 +08:00
    我学Jquery ,到Ajax Jsonp那块,犯晕了.
    chone
        11
    chone  
       2012-10-10 22:58:18 +08:00
    @ant_sz
    @tux
    用iframe设置document.domain的方法解决的是跨子域访问的问题,不过可以通过iframe 的hash值来弄,但显然这种方法不适合lz的需要。

    我的建议是要么用豆瓣的api(不太清楚是否有jsonp的接口),要么可以在当前域名下做一个代理页面。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1644 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:50 · PVG 00:50 · LAX 08:50 · JFK 11:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.