亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 最近研究ajaxslt的心得 [打印本頁]

作者: 夜貓子    時(shí)間: 2007-04-06 10:34
標(biāo)題: 最近研究ajaxslt的心得
最近需要在javascript中控制xml數(shù)據(jù),前段時(shí)間用dojo,但這玩意是在是太重了,太重的東西有種本能的抗拒
現(xiàn)在又想找點(diǎn)輕型的庫來用,prototype、script.aculo.us和ajaxslt就是我看了半天之后的選擇,這里單說ajaxslt

ajaxslt是google提供的js庫,bsd協(xié)議,可以放心使用,而且google也用在了gmail、google map這些產(chǎn)品上,所以還是很可靠的。唯一不爽的就是資料幾乎沒有,只有幾篇很簡單的文章說一下大概用法,其實(shí)這東西也不復(fù)雜,但是資料太少不易消除初學(xué)的恐懼。
資料少就只好自己讀代碼了,讀代碼的時(shí)候看到如下注釋

  1. // Parses the given XML string with our custom, JavaScript XML parser. Written
  2. // by Steffen Meschkat (mesch@google.com).

  3.   // For the record: in Safari, we would create native DOM nodes, but
  4.   // in Opera that is not possible, because the DOM only allows HTML
  5.   // element nodes to be created, so we have to do our own DOM nodes.
復(fù)制代碼

不得了,google的哥們就是牛啊,原來是完全寫了個(gè)js原生的xml實(shí)現(xiàn)。
下面就零零碎碎的說一下看到的東西

  1. function XNode(type, name, opt_value, opt_owner) {
  2.   this.attributes = [];
  3.   this.childNodes = [];

  4.   XNode.init.call(this, type, name, opt_value, opt_owner);
  5. }

  6. // Don't call as method, use apply() or call().
  7. XNode.init = function(type, name, value, owner) {
  8.   this.nodeType = type - 0;
  9.   this.nodeName = '' + name;
  10.   this.nodeValue = '' + value;
  11.   this.ownerDocument = owner;

  12.   this.firstChild = null;
  13.   this.lastChild = null;
  14.   this.nextSibling = null;
  15.   this.previousSibling = null;
  16.   this.parentNode = null;
  17. }
復(fù)制代碼

這個(gè)地方用call方法做了一個(gè)構(gòu)造函數(shù),從這里可以看出node類型的屬性就是這些了。和平時(shí)用的DOM模型不同,這里沒有tagName,代替為nodeName

  1. function XDocument() {
  2.   // NOTE(mesch): Acocording to the DOM Spec, ownerDocument of a
  3.   // document node is null.
  4.   XNode.call(this, DOM_DOCUMENT_NODE, '#document', null, null);
  5.   this.documentElement = null;
  6. }

  7. XDocument.prototype = new XNode(DOM_DOCUMENT_NODE, '#document');
復(fù)制代碼

Document也作為一個(gè)節(jié)點(diǎn)對待,這邏輯也沒錯(cuò),根節(jié)點(diǎn)嘛,整個(gè)xml全部抽象成節(jié)點(diǎn)集合,干得漂亮!
沒看過其它DOM實(shí)現(xiàn)的代碼是不是這么干的,我是腳本技術(shù)原教旨主義分子,想看也看不懂……

常見的dom api都有了,appendChild() replaceChild() getElementsByTagName() ....
但是沒有insertAfter(),只有insertBefore(),干脆DIY一個(gè)

  1. XNode.prototype.insertAfter = function(newNode, oldNode){
  2.     if (oldNode == newNode){ return; }

  3.     if (newNode.parentNode) {
  4.         newNode.parentNode.removeChild(newNode);
  5.     }

  6.     var newChildren = [];
  7.     for (var i = 0; i < this.childNodes.length; i++){
  8.         var c = this.childNodes[i];
  9.         newChildren.push(c);
  10.         if (c == oldNode) {
  11.             newChildren.push(newNode);

  12.             newNode.parentNode = this;

  13.             newNode.nextSibling = oldNode.nextSibling;
  14.             if (newNode.nextSibling) {
  15.                 newNode.nextSibling.previousSibling = newNode;
  16.             }
  17.             oldNode.nextSibling = newNode;
  18.             newNode.previousSibling = oldNode;

  19.             if (this.lastChild == oldNode) {
  20.                 this.lastChild = newNode;
  21.             }
  22.         }
  23.     }
  24.     this.childNodes = newChildren;
  25. }
復(fù)制代碼

再來DIY點(diǎn)好用的

  1. // 返回所有xpath查詢結(jié)果
  2. XDocument.prototype.selectNodes = function(/* string */xpathString){
  3.     var expr = xpathParse(xpathString);
  4.     var result = expr.evaluate(new ExprContext(this));
  5.     return result.nodeSetValue();
  6. }

  7. // 返回第一個(gè)xpath查詢結(jié)果
  8. XDocument.prototype.selectNode = function(/* string */xpathString){
  9.     var result = this.selectNodes(xpathString);
  10.     return result.length ? result[0] : null;
  11. }
復(fù)制代碼

selectNodes()包含了xpath的使用方法,湊合著參考吧
你可以這樣寫

  1. // 獲取所有require屬性等于1的aaa元素
  2. var node = xmldoc.selectNodes('//aaa[@require=1]');
  3. // 獲取第一個(gè)require屬性等于1的aaa元素
  4. var node = xmldoc.selectNode('//aaa[@require=1]');
復(fù)制代碼


好用的函數(shù),xmlValue()和xmlText()
用xmlValue()獲得元素的文字內(nèi)容,你就不用node.firstChild.nodeValue這么麻煩了,直接xmlValue(node)完事
xmlText()返回xml文本,參數(shù)可以用node,也可以用document

暫時(shí)就這么多,ajaxslt感覺還是不錯(cuò)的,js原生,不用考慮那么多瀏覽器DOM實(shí)現(xiàn)差異了
Hell is another browser!!!
作者: james.liu    時(shí)間: 2007-04-06 11:43
不錯(cuò),,為啥不用jquery。。
作者: cid73    時(shí)間: 2007-04-06 12:07
這玩意兒現(xiàn)在能在 IE 上用了嗎? 我差不多一年前試過, 那時(shí)候只支持 Firefox.

不過 xpath... 還真是不好用, 僅僅是和客戶端交互的話還是 json 吧
作者: lyhiving    時(shí)間: 2007-04-06 12:10
Jquery
作者: eye_onme    時(shí)間: 2007-04-06 15:19
性能如何?
作者: 夜貓子    時(shí)間: 2007-04-06 17:41
原帖由 lyhiving 于 2007-4-6 12:10 發(fā)表
Jquery

jquery大抵相當(dāng)于prototype + script.aculo.us
jquery能夠load一段xml,然后返回一個(gè)XML Document對象?我大概瀏覽了一遍API,辦不到,更何況ajaxslt還有xlst
jquery能夠操作的dom對象僅限于HTML Document
原帖由 cid73 于 2007-4-6 12:07 發(fā)表
這玩意兒現(xiàn)在能在 IE 上用了嗎? 我差不多一年前試過, 那時(shí)候只支持 Firefox.
不過 xpath... 還真是不好用, 僅僅是和客戶端交互的話還是 json 吧

ie上工作正常,暫時(shí)沒發(fā)現(xiàn)和firefox有什么區(qū)別
我把xml作為客戶端數(shù)據(jù)庫(姑且這么叫吧)使用,在客戶端上全部做好了才向服務(wù)器端一次提交,json貌似和這個(gè)主題無關(guān)

性能沒有測試過,感覺gmail都在用,應(yīng)該可以吧

[ 本帖最后由 夜貓子 于 2007-4-6 17:45 編輯 ]
作者: 一棵白菜    時(shí)間: 2007-04-06 19:32
原帖由 james.liu 于 2007-4-6 11:43 發(fā)表
不錯(cuò),,為啥不用jquery。。


搞的太臃腫了。。
作者: 傲梟    時(shí)間: 2007-04-06 19:39
聽不懂在說什么啊




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2