最近看一些代碼時,邊看邊改代碼,發(fā)現(xiàn)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
究其原因,發(fā)現(xiàn)url里有個callback,這里使用的是JSONP,一種跨域技術(shù)。
網(wǎng)上搜了下JSONP,多數(shù)都是在講如何使用,而沒有說明為什么它能跨域,且沒有說明url服務(wù)器端的代碼時如何生成的。
這方面,上面的文章里有比較詳細(xì)的描述。
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標(biāo)簽。
而服務(wù)器端會返回
callbackFunction( { "x": 10, "y": 15} );
這樣的數(shù)據(jù)。
這其實(shí)是一段javascript代碼,
callbackFunction是方法名,{ "x": 10, "y": 15}是參數(shù)。客戶端代碼里必須要有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 }
之后客戶端會調(diào)用
callbackFunction。
使用JQuery的getJSON方法后,callback部分會變成如下形式。
callback=jQuery1710461701650187642_1326201333794&_=1326201356534
callbackFunction自然就是jQuery1710461701650187642_1326201333794部分了。
返回來的數(shù)據(jù)也會是
jQuery1710461701650187642_1326201333794( { "x": 10, "y": 15} ) 這種形式。
最后JQuery會調(diào)用匿名函數(shù)function(data),data即為json數(shù)據(jù)。
JQuery已經(jīng)將客戶端部分實(shí)現(xiàn)了,服務(wù)器端也得遵循同樣的規(guī)則才能實(shí)現(xiàn)跨域。
*這里有一點(diǎn),JQuery如何將匿名函數(shù)換名字的?有哪位大俠知道的,請用簡單的語言講解下。
記錄一個小問題。
在Win7系統(tǒng)上裝一個軟件時失敗,提示2個DLL沒有注冊成功。
于是準(zhǔn)備手動注冊。
運(yùn)行
cd C:\WINDOWS\system32\
regsvr32 xxx.dll
后出現(xiàn)如下錯誤:
The module "xxx.dll" was loaded but the call to DllRegisterServer failed with error code 0x80004005.
網(wǎng)上搜索一番后,找到如下地址
http://forums.cnet.com/7723-12546_102-237219.html
其中有條說run as administrator,這是權(quán)限問題,不過我登陸的就是管理員賬號,應(yīng)該不存在這樣的問題。
抱著姑且一試的想法,寫了個cmd文件,右鍵run as administrator后,居然真的注冊成功了!
看來Win7系統(tǒng)真的很安全,就算是管理員,也得來個run as administrator后才能做一些事,是在向sudo學(xué)習(xí)么?
最近試著用html5在頁面加載mp3文件。在chrome下測試通過了,偶然的用firefox4打開,居然沒法用……
懷疑哪里寫錯了,可audio標(biāo)簽也就幾個屬性而已。
幾經(jīng)搜索,最后發(fā)現(xiàn)的真相讓我很崩潰……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定義了媒體標(biāo)簽,但沒規(guī)定媒體的默認(rèn)編碼格式,導(dǎo)致各瀏覽器各自為政。
真是不方便……