使用ajax操作JavaScript 对象详解

通过请求获取充分格式化的HTML虽然很方便,但这也意味着必须在传输文本内容的同时也 传输很多HTML标签。有时候,我们希望能够尽量少传输一些数据,然后马上处理这些数据。在 这种情况,我们希望取得能够通过JavaScript进行遍历的数据结构。
          使用jQueiy的选择符可以遍历和操作取得的HTML结构,但是还有一种JavaScript内置的数据 格式,既能减少数据传输量,也会减少编码量。

1.取得JSON

前面我们曾经看到过,JavaScript对象是由一些“键-值”对组成的,而且还可以方便地使 用花括号({})来定义。另一方面,JavaScript的数组则可以使用方括号([])和隐式声明的 逐渐递增的键进行动态定义。将这两种语法组合起来,可以轻松地表达复杂而且庞大的数据 结构。
S是synchronous的首字母,即同步。
         作者这里的意思是,如果不是Ajax,而是SJAX,即不是异步加载,而是同步加载,那么就不会有那么大的影响了。
Douglas Crockford为这种简单的语法起了一个名字,叫做JSON (JavaScript Object Notation, JavaScript对象表示法)。通过这种表示法能够方便地取代数据量庞大的XML格式:

代码如下:

{
"key": "value",
"key 2":[
"array",
"of",
"items"
]
}

在对象字面量和数组字面量的基础上,JSON格式的语法具有很强的表达能力,但对其中的 值也有一定的限制。例如,JSON规定所有对象键以及所有字符串值,都必须包含在双引号中。 而且,函数也不是有效的JSON值。由于存在这些限制,开发人员最好不手工编辑JSON,而应该 用服务器端语言来生成。

要了解JSON的语法要求以及它有哪些优势,都有哪些语言支持这种数据格 式,请访问 http://json.org/。如果用这种格式对字典中的解释进行编码,那么可能会有很多种编码方式。这里,我们把一 些字典的词条放在一个名叫b.json的JSON文件中,这个文件开头部分的代码如下:

代码如下:

[
{
"term": "BACCHUS",
"part": "n.",
"definition": "A convenient deity invented by the...",
"quote": [
"Is public worship, then, a sin,",
"That for devotions paid to Bacchus",
"The lictors dare to run us in,",
"And resolutely thump and whack us?"
],
"author": "Jorace"
},
{
"term": "BACKBITE",
"part": "v.t.",
"definition": "To speak of a man as you find him when..."
},
{
"term": "BEARD",
"part": "n.",
"definition": "The hair that is commonly cut off by..."
},
... file continues ...

要取得这些数据,可以使用$.getJS0N()方法,这个方法会在取得相应文件后对文件进行处理。在数据从服务器返回后,它只是一个简单的JSON格式的文本字符串。$.getJSON()方法 会解析这个字符串,并将处理得到的JavaScript对象提供给调用代码。

2.使用全局jQuery函数

到目前为止,我们使用的所荀Query方法都需要通过$()函数构建的一个jQuery对象进行调 用。通过选择符表达式,我们可以指定一组要操作的DOM节点,然后再用这些jQuery方法以某种 方式对它们进行操作。然而,$.getJS〇N()函数却不一样。从逻辑上说,没有该方法适用的DOM 元素;作为结果的对象只能提供给脚本,而不能插人到页面中。为此,getJS〇N()是作为全局 jQuery对象(由jQuery库定义的jQuery*$对象)的方法定义的,也就是说,它不是个别jQuery 对象实例(即通过$()函数创建的对象)的方法。

如果JavaScript中有类似其他面向对象语言中的类,那我们可以把$.getJS〇N()称为类方法。 为了便于理解,我们在这里称其为全局函数;实际上,为了不与其他函数名称发生冲突,这些全 局函数使用的是jQuery命名空间。

在使用这个函数时,我们还需要像以前一样为它传递文件名,如代码清单6-3所示。
代码清单6-3

代码如下:

//未完成的代码
$(document).ready(function() {
$('#letter-b a').click(function(event) { event.preventDefault();
$.getJSON('b.json');
});
});

当单击按钮时,我们看不到以上代码的效果。因为虽然函数调用加载了文件,但是并没有告 诉JavaScript对返回的数据如何处理。为此,我们需要使用一个回调函数。
              $.getJSON()函数可以接受第2个参数,这个参数是当加载完成时调用的函数。如上所述, Ajax请求都是异步的,回调函数提供了一种等待数据返回的方式,而不是立即执行代码。回调函 数也需要一个参数,该参数中保存着返回的数据。因此,我们的代码要写成代码清单6-4这样。
代码清单6-4

代码如下:

//未完成的代码
$(document).ready(function() {
$('#letter-b a').click(function(event) { event.preventDefault();
$.getJSON('b.json', function(data) {
});
});
});

我们在此使用了匿名函数表达式作为回调函数,这在jQuery代码中很常见,主要是为了保持 代码简洁。当然,对函数声明的引用同样也可以作为回调函数。

这样,我们就可以在函数中通过data变量来遍历JSON数据结构了。具体来说,需要迭代顶 级数组,为每个项构建相应的HTML代码。虽然可以在这里使用标准的for循环,但我们要借此机会介绍jQuery的另一个实用全局函数$.each(),在第5章中,我们曾看到过它的对应方 法.each()。$.each()函数不操作jQuery对象,它以数组或对象作为第一个参数,以回调函数 作为第二个参数。此外,还需要将每次循环中数组或对象的当前索引和当前项作为回调函数的两 个参数,参见代码清单6-5。

代码清单6-5

代码如下:

$(document).ready(function() {
$('#letter-b a').click(function(event) { event.preventDefault();
$.getJSON('b.json', function(data) { var html ='';
$.each(data, function(entryIndex, entry) { html += '<div class="entry">';
html += '<h3 class="term">' + entry.term + '</h3>';
html += '<div class="part">' + entry.part + '</div>';
html += '<div class="definition">';
html += entry.definition;
html += '</div>';
html += '</div>';
});
$('#dictionary').html(html);
});
});
});

这里通过$.each()函数依次遍历每个项,并使用entry对象的内容构建起HTML代码结构。 构建好HTML之后,通过.html()把它插人到<div id="dictionary">*,替换其中原有的所 有内容。

安全的HTML

这种方法要求数据中包含可以直接用来构建HTML的安全内容,例如,数据 中不能包含任何<字符。

现在所剩的就是处理词条中的引用语了,这需要使用另一个$.each()循环,参见代码清 单 6-6。
          代码清单6-6

代码如下:

$(document).ready(function() {
$('#letter-b a').click(function(event) { event.preventDefault();
$.getJSON('b.json', function(data) { var html ='';
$.each(data, function(entryIndex, entry) { html += '<div class="entry">';
html += '<h3 class="term">' + entry.term + '</h3>'; html += '<div class="part">' + entry.part + '</div>';
html += '<div class=MdefinitionM>'; html += entry.definition; if (entry.quote) {
html += '<div class=,,quote,,>';
$.each(entry.quote, function(lineIndex, line) {
html += '<div class=Hquote-lineH>' + line + '</div>';
});
if (entry.author) {
html += '<div class=Hquote-authorH>' + entry.author + '</div>';
}
html += '</div>';
}
html += '</div>'; html += '</div>';
});
$('#dictionary').html(html);
});
});
});

编写完这些代码后,就可以单击下一个B链接来验证我们的成果了,如图6-4所示,页面右侧 出现了相应的字典条目。

尽管JSON格式很简洁,但它却不容许任何错误。所有方括号、花括号、引号和逗号都必须 合理且正确地使用,否则文件不会加载。而且,在多数浏览器中,当文件加载失败时我们看不到 任何错误信息;脚本只是静默地彻底终止运转。

(0)

相关推荐

  • javascript ajax的5种状态介绍

    在<Pragmatic ajax(动态网站静态化) A Web 2.0 Primer >中偶然看到对readyStae状态的介绍,感觉这个介绍很实在,摘译如下: 0: (Uninitialized) the send( ) method has not yet been invoked. 1: (Loading) the send( ) method has been invoked, request in progress. 2: (Loaded) the send( ) method ha

  • JavaScript AJAX之惰性载入函数

    在JS中有些内存只需执行一遍即可,如浏览器类型检测是最常用的一个功能,因为我们使用Ajax的时候需要检测浏览器的内置的XHR.我们可以在第一次检测的时候记录下类型,往后在使用Ajax的时候就不需要再去检测浏览器类型了.在JS中就算只有一个if也总比没有if的语句效率要高. 普通Ajax方法 复制代码 代码如下: /**  * JS惰性函数  */   function ajax(){     if(typeof XMLHttpRequest != "undefined"){      

  • javascript中AJAX用法实例分析

    本文实例讲述了javascript中AJAX用法.分享给大家供大家参考.具体分析如下: 兼容地获得XMLHttpRequest对象: var xhr = null; if(window.XMLHttpRequest){ //非IE浏览器 xhr = window.XMLHttpRequest; }else if(window.ActiveXObject){ //IE浏览器 try{ //高版本,受msxml3.dll+支持 xhr = new ActiveXObject("Msxml2.XMLH

  • JavaScript调用ajax获取文本文件内容实现代码

    这几年JQuery写多了,传统的的javascript已经很久不写了,不少东西都忘掉了,还有多少人记得javascript中实现ajax操作需要借助XMLHttpRequest对象,其实jquery的ajax本质也是这个,好了,今天就花点时间演示一下如何用传统javascript获取文本内容并展示在页面上,废话不多少,直接上代码,注释写的很详细,大家应该能看懂: 复制代码 代码如下: <script type="text/javascript"> //(A)①获取文本文件方

  • JavaScript结合AJAX_stream实现流式显示

    当使用AJAX进行信息交互的时候,如果服务器返回的信息比较大,那么相对于传送完成之后的统一显示,流式显示就比较友好了. 流式实现 原理就是设置定时器,定时的查看AJAX对象的状态并更新内容,如果传送完成,就取消定时器. 复制代码 代码如下: function ajax_stream(url,data,element) {     var xmlHttp=null;     if (window.XMLHttpRequest)       {// code for IE7, Firefox, Op

  • javascript模拟实现ajax加载框实例

    本文实例讲述了javascript模拟实现ajax加载框的方法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: function loading(p_value,str) { if (p_value) { if (!document.getElementById("load_area")) { var para1 = document.createElement("span"); var node=document.createTextNode(str)

  • javascript结合ajax读取txt文件内容

    代码很简洁,这里就不多废话了,直接上源码 html代码 复制代码 代码如下: <!doctype html>  <html>   <head>       <meta charset="utf-8"/>       </head>       <body>           <button type="button"  onclick="show()">请求数据

  • 使用ajax操作 JavaScript 对象

    通过请求获取充分格式化的HTML虽然很方便,但这也意味着必须在传输文本内容的同时也 传输很多HTML标签.有时候,我们希望能够尽量少传输一些数据,然后马上处理这些数据.在 这种情况,我们希望取得能够通过JavaScript进行遍历的数据结构.           使用jQuery的选择符可以遍历和操作取得的HTML结构,但是还有一种JavaScript内置的数据 格式,既能减少数据传输量,也会减少编码量. 1.取得JSON 前面我们曾经看到过,JavaScript对象是由一些"键-值"

  • Javascript Ajax异步读取RSS文档具体实现

    RSS 是一种基于 XML的文件标准,通过符合 RSS 规范的 XML文件可以简单实现网站之间的内容共享.Ajax 是Asynchronous JavaScript and XML的缩写.通过 Ajax 技术可以经由超文本传输协议(Http) 向一个服务器发出请求并且在等待该响应时继续处理另外的数据.通过 Ajax 技术可以很容易实现读取远程 XML文件,因此,可以使用 Ajax技术实现远程访问依据 RSS 标准生成的摘要信息,甚至我们可以自己写一个 RSS 阅读器. Ajax 并不是一门新的语

  • 使用ajax操作JavaScript 对象详解

    通过请求获取充分格式化的HTML虽然很方便,但这也意味着必须在传输文本内容的同时也 传输很多HTML标签.有时候,我们希望能够尽量少传输一些数据,然后马上处理这些数据.在 这种情况,我们希望取得能够通过JavaScript进行遍历的数据结构.           使用jQueiy的选择符可以遍历和操作取得的HTML结构,但是还有一种JavaScript内置的数据 格式,既能减少数据传输量,也会减少编码量. 1.取得JSON 前面我们曾经看到过,JavaScript对象是由一些"键-值"

  • JavaScript操作DOM对象详解

    一.DOM基础 DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口).DOM描绘了一个层次化的节点树,运行开发人员添加.移除和修改页面的某一部分.DOM中的三个字母,D(文档)可以理解为整个Web加载的网页文档:O(对象)可以理解为类似Window对象之类的东西,可以调用属性和方法,这里我们说的是document对象:M(模型)可以理解为网页文档的树型结构. 1.节点 加载HTML页面时,Web浏览器生成一个树型结构,用来表示页面内

  • JavaScript——DOM操作——Window.document对象详解

    一.找到元素: docunment.getElementById("id"):根据id找,最多找一个:     var a =docunment.getElementById("id");将找到的元素放在变量中:     docunment.getElementsByName("name"):根据name找,找出来的是数组:     docunment.getElementsByTagName("name"):根据标签名找,找

  • JavaScript浏览器对象之一Window对象详解

    JavaScript提供了一组以window为核心的对象,实现了对浏览器窗口的访问控制.JavaScript中定义了6种重要的对象: window对象 表示浏览器中打开的窗口: document对象 表示浏览器中加载页面的文档对象: location对象包含了浏览器当前的URL信息: navigation对象 包含了浏览器本身的信息: screen对象 包含了客户端屏幕及渲染能力的信息: history对象 包含了浏览器访问网页的历史信息. 除了window对象之外,其他的5个对象都是windo

  • javascript中的糖衣语法Promise对象详解

    目录 一.Promise的诞生 1.回调地狱 二.Promise的行为 1.Promise的语法 2.Promise的方法 (1)Promise.prototype.then() (2)Promise.prototype.catch() (3)Promise.prototype.finally() (4)Promise.resolve() (5)Promise.reject() (6)Promise.all() (7)Promise.race() 三.Promise的场景 1.Ajax请求 2.

  • JavaScript history 对象详解

    目录 1.路由导航 2.历史状态管理API (1)hashchange 事件 (2)popstate 事件 (3)history.pushState() 方法 (4)history.replaceState()方法 3.补充:URL的hash 前言: 我们浏览一个网页时可能不太会注意网页前进后退这些操作,但是在开发时你是否想过页面之间的跳转经历了什么,浏览器时怎么保存的页面信息,重新返回上一个页面的时候是否需要重新加载页面呢,会有很对疑问,要想解决这些问题,首先需要知道浏览器中的window下的

  • Javascript之BOM(window对象)详解

    ECMAScript是JavaScript的核心,但在web使用JavaScript,那么BOM(浏览器对象模型)才是真正的核心. BOM的核心对象是window,它表示浏览器的一个实例. 在浏览器中,window对象既是JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象.也就是说,在网页中定义的任何一个变量.对象和函数以window作为其Global对象. 1.全局作用域 既然window对象扮演着Global对象,那么所有在全局作用域中声明的对象.变

  • JavaScript利用html5新方法操作元素类名详解

    目录 1.classList属性 2.实务应用 早先JavaScript处理起来特别不方便,需要先取到class属性,然后对字符串进行处理. 现在html5给所有元素增加了classList属性来操作类属性,非常方便. 1.classList属性 先看如下代码: <ul class="nav"> <li class="active">栏目1</li> <li>栏目2</li> <li>栏目3&l

  • COM组件中调用JavaScript函数详解及实例

    COM组件中调用JavaScript函数详解及实例 要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scriptCallbackFunc.实现这个技术很简单: 1 .组件方(C++) 组件A 的方法在IDL中定义: [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional

随机推荐