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

时间: 2024-11-09 19:44:22

ajax操作之操作 JavaScript 对象的相关文章

JavaScript之Ajax-6 Ajax的增强操作(jQuery对Ajax的支持、表单操作)

一.jQuery对Ajax的支持 load() - 作用: 将服务器返回的数据字节添加到符合要求的节点之上 - 用法: $obj.load(请求地址,请求参数) - 请求参数 - "username=tom&age=22" - {'username':'tom','age':22} - 有请求参数时,load方法发送POST请求,否则发送GET请求 get() - 作用: 发送GET类型的请求 - 用法: $.get(请求地址,请求参数,回调函数,服务器返回的数据类型) - 说

深入理解javascript对象系列第二篇——属性操作

× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对象系列的第二篇——属性操作 属性查询 属性查询一般有两种方法,包括点运算符和方括号运算符 var o = { p: 'Hello World' }; o.p // "Hello World" o['p'] // "Hello World" [注意]变量中可以存在中文,因

AJAX入门---DOM操作HTML

一边学习AJAX一边坐着总结加深印象,上次写的是如何简单的使用XMLHttpRequest对象,今天写的是DOM(文档对象模型(Document Object Model))操作HTML,希望我的博客对大家的学习能够起到帮助作用. 一.什么是DOM 文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构.换句话说,这是表示和处理一个HTML或XML文档的常用方

Numeral.js – 格式化和操作数字的 JavaScript 库

Numeral.js 是一个用于格式化和操作数字的 JavaScript 库.数字可以格式化为货币,百分比,时间,甚至是小数,千位,和缩写格式,功能十分强大.支持包括中文在内的17种语言. 您可能感兴趣的相关文章 太赞了!超炫的页面切换动画效果[附源码下载] 创意无限!一组网页边栏过渡动画[附源码下载] 真是好东西!13种非常动感的页面加载动画效果 你见过吗?9款超炫的复选框(Checkbox)效果 时尚设计!三种奇特网格加载效果[附源码下载] 源码下载      在线演示 本文链接:Numer

jquery的常用操作(操作html页面的Dom对象的元素)

一:页面加载完成时,会执行jquery的方法(不需要等待图片加载完成,只要dom结构加载完成,就执行该方法) //第一种写法: $(document).ready(function() { // 执行体 }); //第二种写法 $(function() { //执行体 }); 二:用jquery获取dom对象,判断该对象是否有内容的两种方法(有返回true,没有返回false) jqObj.text().trim() var jqObj = $(this); if(jqObj.text().tr

[python学习篇][书籍学习][python standrad library][内置类型]对象测试真值,布尔值操作, 比较操作

几乎所有对象都可以比较.测试真值.转换为字符串(其实就是用repr()函数,或略有差异的str()函数来转换) 1 对象是否为真 任何对象都可以测试真值,用于if或while的条件或下面布尔运算的操作数.下面的值被视为假: None False 任何数值类型的零,例如,0. 0L.0.0. 0j. 任何空的序列,例如, ''. (). []. 任何空的映射,例如,{}. 用户定义的类的实例,如果该类定义一个__nonzero__()或__len__()的方法,在该方法返回整数零或布尔值False

JavaScript对象之关联数组

Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要的区别就是前者的属性名是标示符,后者的属性名是一个字符串. 用"."运算符来存取一个对象的属性时,属性名是标示符,JavaScript程序中,标示符必须被逐字输入,它们不是一种数据类型,因此程序不能对他们进行操作. 用数组的概念"[]"来存取一个对象的属性时,属性名是用

javascript对象转化为基本数据类型规则

原文:Object-to-Primitive Conversions in JavaScript 对象转化为基础数据类型,其实最终都是用调用对象自带的valueOf和toString两个方法之一并获得其返回值,作为其基础数据类型. 基础数据类型包括这么几种:null, undefined, number, boolean, string 内部实现机制 但是什么时候调用valueOf,什么时候调用toString,却困惑了很长一段时间. var obj = { toString: function

javaScript对象-基本包装类型的详解

本人按书上的内容大致地把javaScript对象划分成“引用类型”.“基本包装类型”和“内置对象”三块内容. 我们这篇先了解下基本包装类型的详细用法吧! 一.我们先解下相关概念: 1.引用类型的值(对象)是一个引用类型的一个实例. 在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起.它也通常称为类. 尽管ECMASript中,从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构.引用类型有时候也被称为对象定义,因为它们描述是一类对象所具