jQuery与XML

快而强的遍历系统,华丽丽的选择器语法,这或许是jQuery 那么流行的原因。当然它还有详尽的文档。它主要是用来处理HTML的,但在这里妳会看到如何应用到XML。

使用jQuery进行DOM元素的操作和遍历

首先确定妳在页面引用的jQuery库,才能使用它。然后简单地使用jQuery()或者它的简化形式$(), 传递一个选择器作为它的第一个参数。选择器通常是一个指定了一个或多个元素的字符串。清单20展示了一些基本的jQuery选择器的使用。

Listing 20. Basic jQuery selectors

<script type="text/javascript">

var allImages = $("img"); // all IMG elements

var allPhotos = $("img.photo"); // all IMG elements with class "photo"

var curPhoto = $("img#currentPhoto"); // IMG element with id "currentPhoto"

</script>

需要记住的一点是jQuery方法返回的始终是一个jQuery对象。这种对象支持链式操作(见清单21)。这一特性在其他JavaScript框架中也是通用的。

Listing 21. Basic jQuery operation with chained method calls

<script type="text/javascript">

$("img").css({"padding":"1px", "border": "1px solid #333"})

.wrap("<div class='img-wrap'/>");

</script>

上述代码选中页面中所有img元素并设置padding和border, 然后用一个带img-wrap class 的div 来包裹所有这些img.

清单22则展示了jQuery 是如何将前面章节的一个例子进行简化。

Listing 22. Creating and injecting a DOM node with jQuery

<script type="text/javascript">

alert($("h1:first").html()); // .text() also works and might be better suited here

$("#auth").text("Sign Out");

var $li = $("<li>List Item Text</li>");

// $ is used as var prefix to indicate jQuery object

$("ul#nav").append($li);

</script>

使用jQuery 处理XML

之前有提到过传递给jQuery $()的第一个参数是一个字符串形式的选择器。第二个不起眼的参数则允许你设置context,或者开始一个jQuery节点,抑或把当前选择的元素当作一个根节点来使用。默认jQuery会把Document作为当前的Context, 但更好的做法是把context指定得更详细更一些,具体到某个特定的元素身上。在进行XML处理时,需要把context设置为XML的根节点(见清单23)。

Listing 23. Retrieving values from an XML document with jQuery

<script type="text/javascript">

// get value of single node (with jQuery)

var description = $("description", xmlData).text();

// xmlData was defined in previous section

// get values of nodes from a set (with jQuery)

var relatedItems = $("related_item", xmlData);

var relatedItemVals = [];

$.each(relatedItems, function(i, curItem){

relatedItemVals.push(curItem.text());

});

</script>

上述代码使表示变得相当简洁。通过向jQuery传递节点名称和设置它的context为xmlData,可以很方便地获取想要的节点。取得元素的值,刚需要一翻周折了。

因为innerHTML 对于非HTML元素不管用,所以就不能使用jQuery的html()方法来获取节点的值。jQuery 虽然提供了一个跨浏览器的方法innerText 来获取元素的值,但当用来处理XML时在浏览器间仍有些差异。比如IE会把包含空值(空格,Tab点位符,换行)的节点给忽略掉,而处理这样的情况时,FireFox则会把这些节点当作正常节点。为了避免这点不一致性,可以创建一个函数来处理。这个函数里需要用到一些jQuery函数: contents(), filter() 和 trim()。

Listing 24. Cross-browser JavaScript functions for accurate text value retrieval of a node

<script type="text/javascript">

/**

* Retrieves non-empty text nodes which are children of passed XML node.

* Ignores child nodes and comments. Strings which contain only blank spaces

* or only newline characters are ignored as well.

* @param node {Object} XML DOM object

* @return jQuery collection of text nodes

*/

function getTextNodes(node){

return $(node).contents().filter(function(){

return (

// text node, or CDATA node

((this.nodeName=="#text" && this.nodeType=="3")

|| this.nodeType=="4") &&

// and not empty

($.trim(this.nodeValue.replace("\n","")) !== "")

);

});

}

/**

* Retrieves (text) node value

* @param node {Object}

* @return {String}

*/

function getNodeValue(node){

var textNodes = getTextNodes(node);

var textValue = (node && isNodeComment(node)) ?

// isNodeComment is defined above

node.nodeValue : (textNodes[0]) ? $.trim(textNodes[0].textContent) : "";

return textValue;

}

</script>

现在来看看如何设置节点的值(见清单25)。示例代码中有两点需要注意:一是设置根结果的文本值会重写所有子节点。另外就是如果一个节点之前是没有值的,那么就用 node["textContent"]而不是node.textContent。因为在IE中空节点根本就没有textContent属性。

Listing 25. Cross-browser JavaScript function for accurate setting of the text value of a node

<script type="text/javascript">

function setNodeValue(node, value){

var textNodes = getTextNodes(node);

if (textNodes.get(0)){

textNodes.get(0).nodeValue = value;

}

else {

node["textContent"] = value;

}

}

</script>

DOM属性与jQuery

在之前的一些例子中已经展示了即使用最原始的JavaScript来处理DOM中的属性也是非常直观明了的了。同样地,jQuery也提供了相应的简化方式。更重要的是,属性可以用在选择器中,非常的强大。

Listing 26. Getting and setting DOM element attributes with jQuery

<script type="text/javascript">

var item = $("item[content_id='1']", xmlData);

// select item node with content_id attribute set to 1

var pubDate = item.attr("date_published");

// get value of date_published attribute

item.attr("archive", "true");

// set new attribute called archive, with value set to true

</script>

从代码中可以看出,jQuery的attr()方法即可以设置设置也可以返回属性值。更强大的是jQuery允许在选择器中提供属性来返回特定的元素。下如上面的代码所展示的那样,我们获取到了content_id为1的元素。

通过jQuery的Ajax来装载XML

或许你已经有所了解,Ajax是用JavaScript来异步从服务器获取XML的一种Web技术。Ajax本身是依赖XMLHttpRequest (XHR) 所提供的API来向服务器发送请求和从服务器获取响应的。jQuery除了提供强大的用于遍历和处理DOM元素的方法外,还提供了跨浏览器的Ajax支持。也就是说通过Ajax获取XML简单得就是调用Ajax的get方法。清单27展示了这样的例子。

Listing 27. Loading an external XML file with jQuery's Ajax method

<script type="text/javascript">

$.ajax({

type : "GET",

url : "/path/to/data.xml",

dataType : "xml",

success : function(xmlData){

var totalNodes = $('*',xmlData).length; // count XML nodes

alert("This XML file has " + totalNodes);

},

error : function(){

alert("Could not retrieve XML file.");

}

});

</script>

$.ajax()方法有一系列丰富的选项设置,并且可以通过其他一些简化的变形方式来调用,比如$.getScript()会导入JavaScript脚本并执行,$.getJSON()会获取JSON数据然后可以在Success回调中使用。当装载XML文件时,妳需要了解一下Ajax的基本语法。如上面代码所示,我们设置类型为get,url设置为从"/path/to/data.xml"这个路径获取XML文件,然后还指明文件类型为XML。当从服务器获取了数据后,success 或error中的一个方法会被触发。本例中,装载成功的话会弹出窗口显示所有节点数目。jQuery的星号选择器表示匹配所有元素。最重要的一点是在回调函数中,第一个参数用来接收从服务器返回的数据。这个参数的名字随便起,接下来的Context就被设置成了这个返回的数据。

在处理Ajax相关的请求时需要注意跨域问题,出于安全性考虑一般不允许从不同的域获取文件。所以上述例子中的代码可能在妳实际的程序中有所不同。

像处理XML一样处理外部的XHTML

因为XHTML是XML的一个子集,所以像XML一样处理XHTML是完全没有问题的。至于为什么妳有处理XHTML的需求是另一回事,但事实是妳确实可以这样做。比如,导入一个XHTML页面然后从中解析数据是可行的,虽然我会建议用另外更强健的方法来实现。

尽管之前讲述了DOM元素的遍历和处理,jQuery同时也可以用来处理XML,虽然需要先将XML文件破费周折地装载进代码中。本节的内容包含了不同的方法和基本的用于完成XML处理的例子。

用jQuery 处理XML-- jQuery与XML的更多相关文章

  1. jquery解析xml,获取xml标签名

    先给一个简单的XML,结构如下 <?xml version="1.0" encoding="uft-8" ?> <msg> <ro ...

  2. jQuery、JS读取xml文件里的内容(JS先通过document.implementation.createDocument方法将xml转换成document对象,jQuery将读取到的xml转成table)

    xml文件:test.xml <?xml version="1.0"?> <note> <to>George</to> <fr ...

  3. Ajax--PHP+JQuery+Ajax解析json、XML数据、加载页面

    一.JQuery+Ajax用get.post方式提交和请求数据 知识要点: $('#userName').blur(function () { var txt = $(this).val(); $.a ...

  4. jquery ajax 访问webServer的xml文件

    最近项目中要使用到通过ajax访问webServer的xml文件,通过下面的方式可以直接访问webServer的xml文件,不需要在web.xml中进行任何配置.它的返回参数就是服务器上的xml文件. ...

  5. jquery IE中加载xml

    $.ajax({ url: 'xml/myXML.xml', dataType: ($.browser.msie) ? "text" : "xml", time ...

  6. jquery解析XML及获取XML节点名称

    ).tagName $().tagName [].tagName[] $(].tagName context.nodeName $(this).context.nodeName function ge ...

  7. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  8. jQuery学习之jQuery Ajax用法详解

    jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍. 我们先从最简单的方法看起 ...

  9. jQuery学习之jQuery Ajax用法详解(转)

    [导读] jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,下面我来给各位同学介绍介绍.我们先从最简单的 ...

  10. 锋利的jQuery读书笔记---jQuery中Ajax--get、post等方法

    load()方法通常用来从Web服务器上获取静态的数据文件,然而这并不能体现ajax的全部价值. 在项目中,如果需要传递一些参数给服务器中的页面,那么可以使用$.get()或者$.post()方法(或 ...

随机推荐

  1. animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画

    通过 @keyframes 规则,您能够创建动画. 创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式. 在动画过程中,您能够多次改变这套 CSS 样式. 以百分比来规定改变发生的时间,或者通 ...

  2. Leetcode按Tag刷题

    按照Leetcode的Tag来刷题,从easy到hard刷题 关于如何让Leetcode按难易程度排序,可按以下步骤: 1. 进入Leetcode后,点击code 2.点击code后,可查看所有题目, ...

  3. [CSS]white-space 属性详解

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...

  4. 用 BPL 封装数据连接

    BPL 代码: uDM.pas unit uDM; interface uses SysUtils, Classes, uIntf, DB, ABSMain; type TDM = class(TDa ...

  5. windows store app search contract

    代码如下: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  6. hadoop-streaming 配置之---参数分割

    map: -D stream.map.output.field.separator=. 定义mapoutput字段的分隔符为. 用户可以自定义分隔符(除了默认的tab) -D stream.num.m ...

  7. linux dump 命令详解

    功能说明:备份文件系统. 语 法:dump [-cnu][-0123456789][-b <区块大小>][-B <区块数目>][-d <密度>][-f <设备 ...

  8. size_t为何这么重要?

    原文Why size_t matters 合理的使用size_t可以提高程序的可移植性和代码的可读性,让你的程序更高效. Numerous functions in the Standard C li ...

  9. ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。

    http://blog.csdn.net/fox123871/article/details/8165431 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在20分钟之后 ...

  10. 安装edX DevStack

    概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...