Head First JS阅读笔记之动态数据

动态数据.md

我们希望能够把页面的结构和页面的内容能够分开,结构负责框架,数据负责内容。主要涉及到这么几方面的问题。

  1. 数据存储 XML(extensible markup language)
  2. 数据通信 Ajax (asynchronous javascript and xml)

数据存储方案
XML可以用来创建一切你想创建的东西,ML指标记语言,X…代表了任何事件!
它并不是一门特殊的语言,也不像HTML一样是组既定的标签和属性。XML没有定义任何的标签与属性。

它只是一组标签与属性该如何创建和使用的规则!!!
并且它可以自定义标签!

XML形式上是文本,本质上是规则!

这些规则主要包括:
1. 所有 XML 元素都须有关闭标签,包括空标签也要用/>来结尾
2. XML 标签对大小写敏感,必须使用相同的大小写来编写打开标签和关闭标签
3. XML 必须正确地嵌套
This text is bold and italic
4. XML 文档必须有根元素
5. XML 的属性值须加引号
6. 实体引用

实体引用字符意义
&lt;<小于
&gt;>大于
&amp;&和号
&apos;单引号
&quot;"引号
  1. 注释
  2. 在 XML 中,多个空格会被保留,不会被删节。
  3. XML 以 LF 存储换行

引申到XHTML和HTML之间的差别:

XHTML 元素必须被正确地嵌套。
XHTML 元素必须被关闭。
标签名必须用小写字母。
XHTML 文档必须拥有根元素。

数据通信Ajax,动态载入文件至网页

Ajax以request 和response 为中心概念
Ajax应用程序最主要工作的地方是创建自定义的事件处理器handlerRequest()

  • 浏览器送出Ajax请求到服务器,并等待响应,因为是异步的,请求在后台运作,所以此时浏览器还可以处理其他网页事物
  • 服务器收到请求,开始工作,创建响应。服务器端脚本处理Ajax请求并预备相应的数据。
  • 服务器创建给浏览器的响应,并且把内容数据打包,由Ajax响应送回。
  • 浏览器解开响应中打包的XML数据,整合至网页中

Ajax的原理

js有一个内置的对象,XMLHttpRequest(XHR),用于发起Ajax请求并处理Ajax的响应。

对于该对象(readyStates = 4 & status=200)比较重要的一个特性是onreadysatechange。
onreadystatechange特性存储了一个readystate状态改变时被调用的自定义事件处理器handler的引用

XHR对象在不同的浏览器上,有不同的运行代码。并且选用不同的request类型,GET或者POST,也有不同的代码块。

request.onreadystatechange = handler
request.open(type,url,true)

request.open("GET","blog.xml",true);
request.send(null);//请求被传送时没有数据,所以send()的自变量是null

request.open("POST","addblogentry.php",true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");// 设定数据类型
request.send("...&...&...")

注意,这里的GET/POST和HTML里表单的get/post还是有一定的区别。
这里的GET/POST主要是看传送给服务器的数据,是否会改变服务器的状态。
GET是不会改变,主要适用于从服务器获取数据。
POST是会改变服务器的状态,比如说要存储数据到数据库中。
而我们在HTML里面主要指的是加密和不加密传输
另外,Ajax的请求和响应可以用于请求任何类型的数据,而不局限于HTML数据。

为了解决这个问题,我们采用了自定义对象AjaxRequest

封装了XMLHttpRequest标准对象的的自定义对象AjaxRequest,它把底层的XMLHttpRequest对象存储在特性request里面。它的send()方法就负责处理开启(准备Ajax请求)与传送(对服务器发出请求的的细节工作, 是AjaxRequest中真正的劳动者。

AjaxRequest.prototype.send = function(type,url,handler,postDataType,postData){
    if(this.request != null){
        this.request.abort();
        url += "?dummy=" + new Date().getTime();

        try{
            this.request.onreadystatechange = hanlder;
            this.request.open(type,url,true);

            if(type.toLowerCase() == "get"){
                this.request.send(null);
            }else{
                this.request.setRequestHeader("Content-Type",postDataType);
                this.send(postData);
            }

        }catch(e){
            alert("Ajax error communicating with the server. \n"+ "Details:"+e);
        }
    }
}

如何处理事件?自定义事件处理器handler

来自服务器的请求,在JS代码中使用自定义的请求处理器回调函数handlerRequest()。(这个函数会在Ajax请求结束后立刻被调用,表示请求已经完全成功)
handlerRequest()主要通过getResponseXML()(数据是XML格式)和getResponseText()(数据是纯文本格式)来提供对响应数据的访问。

var ajaxReq = new AjaxRequest();

function handleRequest() {
    if (ajaxReq.getReadyState() == 4 && ajaxReq.getStatus() == 200) {
      // Store the XML response data
      var xmlData = ajaxReq.getResponseXML().getElementsByTagName("blog")[0];

      // Set the blog-wide signature
      Blog.prototype.signature = "by " + getText(xmlData.getElementsByTagName("author")[0]);

      // Create the array of Blog entry objects
      var entries = xmlData.getElementsByTagName("entry");
      for (var i = 0; i < entries.length; i++) {
        // Create the blog entry
        blog.push(new Blog(getText(entries[i].getElementsByTagName("body")[0]),
          new Date(getText(entries[i].getElementsByTagName("date")[0])),
          getText(entries[i].getElementsByTagName("image")[0])));
      }

      // Show the blog
      showBlog(5);
    }
  }

对于XML格式的数据,显然可以考虑使用DOM来处理XML响应数据。

function getText(elem) {
    var text = "";
    if (elem) {
      if (elem.childNodes) {
        for (var i = 0; i < elem.childNodes.length; i++) {
          var child = elem.childNodes[i];
          if (child.nodeValue)
            text += child.nodeValue;
          else {
            if (child.childNodes[0])
              if (child.childNodes[0].nodeValue)
                text += child.childNodes[0].nodeValue;
          }
        }
      }
    }
    return text;
  }

URL encoding 数据域编码
浏览器通过网页URL传送表单域中的数据给服务器,每段数据需要有自己的名称与值,中间插入等号,每对名称/值中间则以&区隔。

"date=10/04/2008&body=I'm readlly looking forward...&image="

Ajax的POST请求要设定数据类型

"application/x-www-form-urlencoded;charset=utf-8"

URL 只能使用 ASCII 字符集来通过因特网进行发送。
由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。
URL 不能包含空格。URL 编码通常使用 + 来替换空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值