emu in blogjava

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評論 :: 2 Trackbacks


          本來一直覺得這么基礎的功能是沒有什么好拿出來講的,今天和網友聊天發現,由于缺乏對json的理解,很多人都還在繼續帶著自己的項目往ajax的方向進軍,而完全不知道有一個好得多的替代品。所以寫下這么個demo給大家參考:

          <HTML>
          <HEAD>
          <title>異步json例子</title>
          <SCRIPT LANGUAGE="JavaScript">
          function test(){
              
          var s = document.createElement("SCRIPT");
              s.id
          ="cgi_emotion_list"
              document.getElementsByTagName(
          "HEAD")[0].appendChild(s);
              s.src
          ="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";
              test
          =function(){}; 
          }
          function visitCountCallBack(data){
              document.getElementsByTagName(
          "HEAD")[0].removeChild(document.getElementById("cgi_emotion_list")); 
              
          for(var i in data){
                  
          var e =document.getElementById(i);
                  
          if(e) e.innerHTML=data[i];
              }
          }
          </SCRIPT>
          </HEAD>
          <BODY>
          <button onclick="test()">test</button><BR>
          歷史訪問人數:
          <span id="visitcount" style="color:#6600CC">點擊test按鈕獲取數據</span><BR>
          今天訪問人數:
          <span id="dayvisit" style="color:#CC6633">點擊test按鈕獲取數據</span><BR>
          陽光指數:
          <span id="sun" style="color:red">點擊test按鈕獲取數據</span><BR>
          愛心指數:
          <span id="love" style="color:violet">點擊test按鈕獲取數據</span><BR>
          雨露指數:
          <span id="rain" style="color:blue">點擊test按鈕獲取數據</span><BR>
          營養指數:
          <span id="nutri" style="color:green">點擊test按鈕獲取數據</span><BR>
          花匠級別:
          <span id="gardener" style="color:#996633">點擊test按鈕獲取數據</span>
          </BODY>
          </HTML>

          這里請求的資源是
          返回的是類似這樣的一個js語句 :
          visitCountCallBack({"visitcount":1941,"dayvisit":4,"spacemark":0,"markchange":0,"sun":200,"love":14,"rain":200,"nutri":200,"level":4,"gardener":11});


          科普一下:
          相比xml,json的好處是:天生的跨瀏覽器(比如我的這個demo應該可以跨所有支持dhtml的瀏覽器而不需要任何修改),客戶端解析代價(CPU和內存)非常小,非單根結構(xml是單根結構),標記名只出現一次(xml的標記名在大多數情況下都需要出現兩次:<tag>...</tag>,因此浪費了很多流量)

          這種方式獲取數據的主要缺點是只支持get方式請求,另外跨編碼的時候要注意一下。xml文件的第一行就可以聲明文件的編碼:encoding="...",因此同一個xml源即使編碼經常換來換去(一般不會有人這么做啦)也沒有什么關系,而json的數據包裝中沒有類似的標記來聲明自己,因此必須要實現約定好編碼,不能隨意變換,在跨編碼(json資源的編碼和引用頁面的編碼不同)調用的時候要指定script的charset為約定的charset。非要經常變換編碼的話就要參數化charset,每次變換的時候用某種形式通知到腳本去更改charset。一般的應用不會有這么變態的需求啦,一般是在做網站國際化的時候,在做數據切割的過程中,才會出現一個數據源有兩種編碼需要處理的情況。

          此外很多人并不知道json可以異步獲取,這個例子很重要的一點是展示了如何異步獲取json。
          posted on 2007-05-14 19:37 emu 閱讀(10767) 評論(23)  編輯  收藏

          評論

          # re: json的例子 2007-05-15 09:17 Java初心
          dwr也能很好的實現這個功能,不知孰優孰劣  回復  更多評論
            

          # re: json的例子 2007-05-15 17:06 dennis
          json跟ajax矛盾嗎?不矛盾吧,你可以使用xml做數據傳輸,也可以使用json做前后臺數據傳輸,各有各的優缺點  回復  更多評論
            

          # re: json的例子 2007-05-16 09:55 chinalu
          同意部分:json比xml輕巧,在小對象的傳輸中具有很大的優勢,簡但實用,
          不同意部分:只支持get方式請求?這個問題好像是樓主沒有真正搞清楚json是什么吧;
          跨編碼?異步獲取是json獨有的嗎?
          還是沒搞清楚json是什么吧。

          按我的理解,json只是一種數據封裝,組織的形式,xml也是一種數據封裝組織形式,只是兩者的形式不一樣罷了  回復  更多評論
            

          # re: json的例子 2007-05-16 12:22 AM
          json只是一種數據封裝,組織的形式,xml也是一種數據封裝組織形式,只是兩者的形式不一樣罷了
          同意。
          這篇是不是該改一下, 小心誤人。  回復  更多評論
            

          # re: json的例子 2007-05-16 19:08 emu
          to: dennis & AM
          不覺得會誤人。我的意思是,當你決定用ajax的時候,你要知道還有個json,你要知道他們各自的優點在哪里,知道你其實在進行的是怎樣的取舍。
          to:chinalu
          我明白你的意思,json只是一個數據描述方式,并不一定要用我的方式來獲取的,當然也可以用xmlhttp甚至form post來獲取。
          我在這里主要是展現一種不用xmlhttp的,異步獲取json數據的方法。
          至于跨編碼,我的意思是,json跨編碼的時候比較麻煩,直接用xml就簡單得多了,因此這是json的一個劣勢。可能你沒有仔細看清。
          json和xml確實都是數據封裝的形式,但是除了形式不同之外還有各自的優劣,運用之妙,存乎一心。舉個最簡單的例子,我貼出來的這段代碼放到任何一個網站(域名)上,在任何瀏覽器上都可以從 http://g2.qzone.qq.com 域名上獲取回來一串數據,如果用xml,你試試看能不能跨得了域?  回復  更多評論
            

          # re: json的例子 2007-06-11 20:39 zkjbeyond
          http://agiletao.com/read.php?tid=958  回復  更多評論
            

          # re: json的例子 2007-06-27 11:16 永恒
          覺得json絕對替代不了xml,但在目前javascript為主流客戶端開發腳本的情況下,xml是絕對比不上json的  回復  更多評論
            

          # re: json的例子[未登錄] 2007-08-29 21:04 huangyi
          @emu
          用你這種方法做跨域拉取 xml 不也一樣嗎!
          visitCountCallback(parseXML("<...>"));

          你還是沒有能深入領會 json 與 xml 只是形式上不同的內在含義啊。  回復  更多評論
            

          # re: json的例子 2007-08-31 15:55 emu
          @huangyi
          你的意思是用js返回xml字符串再parse嗎?當然是可以的,我們實際應用中也有采用這樣的方式。

          補充一下,我同意大多數情況下xml和json主要是數據包裝形式上的不同,但是我認為json和xml并不只是形式上不同,就講最基本的數據結構吧,xml必需是單根結構的,json沒有這個限制。也就是說,下面這個基本的json數據,不包一層皮是無法轉換成為對應的xml表現的:

          {a:1,b:2,c:3}

          當然你可以說包上一層皮以后也沒什么不同

          <data><a>1</a><b>2</b><c>3</c></data>

          不過要注意到,這個xml轉換為對應的json的時候應該變成這樣:

          {data:{a:1,b:2,c:3}}

          再舉一個例子:

          {toString:function(){return "abc"}}

          可以轉成<toString>function(){return &quot;abc&quot;}</toString>嗎?試試把這個xml轉回對應的json?

          當然,稍微做一點點妥協和變化,我們確實是可以掩蓋這些不同,讓他們大多數時候可以表達幾乎等同的信息:

          <toString type="function">function(){return &quot;abc&quot;}</toString>  回復  更多評論
            

          # re: json的例子 2007-09-04 15:53 nickey's home
          來個異步調用的方法總結吧.  回復  更多評論
            

          # re: json的例子 2007-09-19 16:46 kuan
          多點幾點test的時候,會不會重復生成script標簽的問題,有必要優化嗎?  回復  更多評論
            

          # re: json的例子 2007-09-20 21:38 emu
          有必要。這里是我疏忽了。這樣如何:
          function test(){
              var s = document.createElement("SCRIPT");
               s.id="cgi_emotion_list";
              document.getElementsByTagName("HEAD")[0].appendChild(s);
              s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";
               test=function(){};
          }
          function visitCountCallBack(data){
               document.getElementsByTagName("HEAD")[0].removeChild(document.getElementById("cgi_emotion_list"));
              for(var i in data){
                  var e =document.getElementById(i);
                  if(e) e.innerHTML=data[i];
              }
          }  回復  更多評論
            

          # re: json的例子 2007-10-08 18:56 nap
          看了這個文章我感覺好象變魔術啊哈哈,又學了一點。

          不過callback方法中那個刪除script的代碼看起來很不美觀啊,不知道各位有沒有什么好的辦法解決一下?直接在頁面上事先寫好空的script然后改它的src?

          還有我想問一下emu,如果按了test按鈕之后,想在數據加載期間出現loading效果,應該是不行的,有辦法解決嗎?  回復  更多評論
            

          # re: json的例子 2007-10-10 13:52 emu
          在test函數里面加就可以了嘛:
          for(var ar=document.getElementsByTagName("SPAN"),i=0;i<ar.length;i++)ar[i].innerHTML="loading..."
          還是你想要出來沙漏圖標?還是別的什么“loading效果”?
            回復  更多評論
            

          # re: json的例子 2007-10-11 18:05 nap
          謝謝你的回復,我明白了。
          我其實我想要的就是這個效果,按下按鈕的時候顯示個loading的字樣就可以了。有點菜,見笑了!嘿嘿。  回復  更多評論
            

          # re: json的例子 2007-11-08 15:16 A1
          @nap
          或許設置script的onreadystatechange事件可以實現你要的loading progress 指示功能。  回復  更多評論
            

          # re: json的例子[未登錄] 2008-01-24 16:06 jack
          可以用預先定義script標簽的方式 優化 appendChild 和remove的過程
          我寫了個demo的部分代碼:
          <script language=javascript id="aScript" src=""></script>

          js:aScript.src = "http://10.2.76.62/json/JSONData.aspx?stamp=" + new Date(); //不需要瀏覽器緩存時的策略  回復  更多評論
            

          # re: json的例子[未登錄] 2008-01-24 16:07 jack
          另外想問下樓主,
          不知道用script 這種方式實現異步 跟其他方式比 有什么缺點 ?  回復  更多評論
            

          # re: json的例子 2008-01-26 10:54 emu
          其他方式的異步指的是什么呢?用XHR異步獲取script字符串后eval或者execscript嗎?我前面有說過了,好處很多,天生的跨瀏覽器,客戶端解析代價非常小,非單根結構,標記名只出現一次。也許還有其他的,暫時沒想到。
          或者你想研究其他異步化獲取數據的方式?iframe方式我覺得沒有什么競爭力了,還有些什么方式一時沒想出來。  回復  更多評論
            

          # re: json的例子 2009-02-05 13:48 IT公司面試手冊
          這個還得有待研究  回復  更多評論
            

          # re: json的例子 2009-04-24 15:35 王銀龍
          s.src="http://g2.qzone.qq.com/fcg-bin/cgi_emotion_list.fcg?uin=123456";
          這行有錯呀!
          唉。。。
          老大幫幫忙!
          語法錯誤  回復  更多評論
            

          # re: json的例子 2010-11-01 15:24 spyking945
          @AM
          太正確了,
          不知道的還以為json是別的什么操作方法呢  回復  更多評論
            

          # re: json的例子 2011-10-10 10:38 hqkjack
          被科普了一下  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 于都县| 牟定县| 连山| 大城县| 德庆县| 嘉禾县| 呼和浩特市| 贵州省| 陆丰市| 西盟| 金华市| 赞皇县| 新郑市| 濮阳市| 仁怀市| 鄯善县| 安平县| 大石桥市| 偃师市| 资兴市| 虞城县| 乐平市| 江都市| 新野县| 巴林左旗| 银川市| 建宁县| 灯塔市| 祁连县| 昌乐县| 河北省| 灌阳县| 石城县| 梁河县| 武穴市| 台南县| 南靖县| 蒙阴县| 宝坻区| 永吉县| 长兴县|