李威 さぽている

          小說翻譯,日語相關轉移至http://blog.hjenglish.com/liwei

          2011年3月31日 #

          JSONP 跨域原理小解

          最近看一些代碼時,邊看邊改代碼,發現getJSON這個方法沒法正常使用。

          1 var sURL= "http://api.xxxxxx.com/services/feeds/   
          2    xxxxxxx?format=json&callback=?";
          3 $.getJSON(sURL, function(data) {
          4 // do something with the JSON data returned
          5 }); // end get

          究其原因,發現url里有個callback,這里使用的是JSONP,一種跨域技術。
          網上搜了下JSONP,多數都是在講如何使用,而沒有說明為什么它能跨域,且沒有說明url服務器端的代碼時如何生成的。
          http://www.west-wind.com/weblog/posts/2007/Jul/04/JSONP-for-crosssite-Callbacks
          這方面,上面的文章里有比較詳細的描述。

           1 function jsonp(url,callback,name, query)
           2 {                
           3     if (url.indexOf("?"> -1)
           4         url += "&jsonp=" 
           5     else
           6         url += "?jsonp=" 
           7     url += name + "&";
           8     if (query)
           9         url += encodeURIComponent(query) + "&";   
          10     url += new Date().getTime().toString(); // prevent caching        
          11     
          12     var script = document.createElement("script");        
          13     script.setAttribute("src",url);
          14     script.setAttribute("type","text/javascript");                
          15     document.body.appendChild(script);
          16 }

          客戶端的javascript代碼會有如上的操作,代碼不難,很容易理解,也就是加了一個script標簽。

          而服務器端會返回
          callbackFunction( { "x": 10, "y": 15} );
          這樣的數據。這其實是一段javascript代碼,
          callbackFunction是方法名,
          { "x": 10, "y": 15}是參數。客戶端代碼里必須要有
          callbackFunction方法的定義。

           1 public partial class JSONP : System.Web.UI.Page
           2 {
           3     protected void Page_Load(object sender, EventArgs e)
           4     {
           5         if (!string.IsNullOrEmpty(Request.QueryString["jsonp"]) )
           6             this.JsonPCallback();
           7     }
           8 
           9     public void JsonPCallback()
          10     {
          11         string Callback = Request.QueryString["jsonp"];
          12         if (!string.IsNullOrEmpty(Callback))
          13         {
          14             // *** Do whatever you need
          15             Response.Write(Callback + "( {\"x\":10 , \"y\":100} );");
          16         }
          17 
          18         Response.End();
          19     }
          20 }

          之后客戶端會調用callbackFunction
          使用JQuery的getJSON方法后,callback部分會變成如下形式。
          callback=jQuery1710461701650187642_1326201333794&_=1326201356534
          callbackFunction自然就是
          jQuery1710461701650187642_1326201333794部分了。
          返回來的數據也會是jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。

          最后JQuery會調用匿名函數
          function(data),data即為json數據。

          JQuery已經將客戶端部分實現了,服務器端也得遵循同樣的規則才能實現跨域。


          *這里有一點,JQuery如何將匿名函數換名字的?有哪位大俠知道的,請用簡單的語言講解下。

          posted @ 2012-01-10 21:30 李威 閱讀(348) | 評論 (0)編輯 收藏

          error code 0x80004005

          記錄一個小問題。
          在Win7系統上裝一個軟件時失敗,提示2個DLL沒有注冊成功。
          于是準備手動注冊。
          運行
          cd C:\WINDOWS\system32\
          regsvr32 xxx.dll
          后出現如下錯誤:
          The module "xxx.dll" was loaded but the call to DllRegisterServer failed with error code 0x80004005.

          網上搜索一番后,找到如下地址
          http://forums.cnet.com/7723-12546_102-237219.html
          其中有條說run as administrator,這是權限問題,不過我登陸的就是管理員賬號,應該不存在這樣的問題。

          抱著姑且一試的想法,寫了個cmd文件,右鍵run as administrator后,居然真的注冊成功了!

          看來Win7系統真的很安全,就算是管理員,也得來個run as administrator后才能做一些事,是在向sudo學習么?

          posted @ 2011-12-06 21:13 李威 閱讀(362) | 評論 (0)編輯 收藏

          HTML5的audio標簽很坑爹!

          最近試著用html5在頁面加載mp3文件。在chrome下測試通過了,偶然的用firefox4打開,居然沒法用……
          懷疑哪里寫錯了,可audio標簽也就幾個屬性而已。

          幾經搜索,最后發現的真相讓我很崩潰……firefox的audio不支持播放mp3。

          Codec support in modern desktop browsers
          Browser Ogg Vorbis MP3 WAV
          FireFox 3.6+ ?
          ?
          Safari 5+
          ? ?
          Chrome 6 ? ?
          Opera 10.5+ ?
          ?
          Internet Explorer 9 (beta)
          ? ?
          出自 http://html5doctor.com/native-audio-in-the-browser/

          看了這個表之后,雖然很多瀏覽器都支持html5,但如果你想播放一個文件,任何一種格式都不能讓所有瀏覽器正常播放。
          哈哈哈,html5定義了媒體標簽,但沒規定媒體的默認編碼格式,導致各瀏覽器各自為政。
          真是不方便……

          posted @ 2011-06-11 22:30 李威 閱讀(272) | 評論 (0)編輯 收藏

          PHP GD畫圖時出現的文字亂碼問題

          GD畫圖時通常顯示文字是用imagettftext方法,但它的參數必須是UTF-8編碼的。
          此時得注意php文件的編碼
          1.如果是UTF-8的,直接傳硬編碼字符串就可正常顯示
          2.如果是gb2312或其它的,則必須進行轉換 mb_convert_encoding($str, 'UTF-8')

          另外,還有一種情況,JIS-mapped Japanese Font Support被開啟時,imagettftext就必須傳SJIS編碼,傳UTF-8反而會亂碼。
          此時必須將其轉碼后傳入,mb_convert_encoding($sStr,"SJIS", "UTF-8")。

          以上。

          posted @ 2011-03-31 15:46 李威 閱讀(1054) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 乃东县| 射阳县| 深州市| 临沧市| 房山区| 正蓝旗| 营口市| 扎兰屯市| 金山区| 兴义市| 赣州市| 满城县| 乐亭县| 凌云县| 宿州市| 喀喇| 安顺市| 尚义县| 恩施市| 秦皇岛市| 开平市| 呼玛县| 施秉县| 晋江市| 綦江县| 武夷山市| 郴州市| 白朗县| 同心县| 广平县| 霸州市| 涞源县| 新河县| 威宁| 紫阳县| 鲁甸县| 什邡市| 五河县| 游戏| 大英县| 霞浦县|