<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(10763) 評論(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
    被科普了一下  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 中文字幕精品三区无码亚洲| 中文字幕 亚洲 有码 在线| 免费人成再在线观看网站| 日本一道一区二区免费看| 亚洲色大情网站www| 午夜视频在线观看免费完整版| ww亚洲ww在线观看国产| 97在线观免费视频观看 | 亚洲乱码中文字幕久久孕妇黑人| 久久久久亚洲AV无码去区首| 午夜老司机免费视频| 亚洲av成人一区二区三区在线播放| 全免费a级毛片免费看不卡| 人人狠狠综合久久亚洲| 亚洲 无码 在线 专区| 一个人免费观看日本www视频| 亚洲最大激情中文字幕| 国产成人精品无码免费看| 亚洲成人福利在线| 午夜免费福利网站| 日韩a毛片免费观看| 亚洲国产三级在线观看| 99久久精品国产免费| 亚洲国产激情在线一区| 国产又大又黑又粗免费视频 | 成在线人免费无码高潮喷水| 久久久久无码精品亚洲日韩| 99久热只有精品视频免费观看17| 亚洲最大福利视频| 亚洲乱码中文字幕综合234| 在线涩涩免费观看国产精品 | 亚洲国产精品成人一区| a毛片视频免费观看影院| 久久亚洲sm情趣捆绑调教| 午夜视频免费成人| 国精产品一区一区三区免费视频 | 四虎影视永久免费视频观看| 三年在线观看免费观看完整版中文| 亚洲色图在线播放| 又黄又爽无遮挡免费视频| 日本免费久久久久久久网站|