jQueryの中でgetJSONはドメインの原理の深く解説にまたがります。


先日ツールを開発した時、このページのショートアドレスを取得する機能がありました。
この考えはいいですが、私が行動に移す時、これは国境を越える必要があります。
最初の考えは、ドメインをまたぐ一番簡単な方法はスクリプトタグを増やすことです。スクリプトタグはドメインをまたぐことができるからです。
しかし問題はまた来ました。相手のAPIが戻ってきたのはjsonオブジェクトです。scriptタグで実行するしかないですが、中のものが取れないです。つまり戻ってくるものは制御できないです。
その後私はjQueryのgetJSONの方法を思い付いて、学習して、中の文章がこんなに大きいとは思いませんでした。
jQueryはとても頭がいいです。彼もscriptの要求だけでは帰れないものだと気づきました。だから彼はグローバルなcalback関数を設計しました。要求を送る時にこのcalback関数を伝えました。
このcalback関数があるかどうかをサーバが判断し、ない場合はオブジェクトに戻り、ある場合は関数名(オブジェクト)を返します。
私たちは下の住所から見てもいいです。
http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn
みんなは開けてもいいです。結果はjsonオブジェクトに戻ります。
もし私がカルバックパラメータを追加したら
http://to.ly/api.php?json=1&longurl=http%3A%2F%2Fwww.skiyo.cn&callback=somefunc
帰ってきたのが見えます。

somefunc({“shorturl”: “http:\/\/to.ly\/3XHP”, “ok”: true})

入ってきたのもちょうど関数名です。
この考えはいいです。欠点は相手のサーバーがコントロールできるものでなければなりません。
大きな方向はこれですが、匿名関数に大域関数を設定する方法など、詳細なテクニックがあります。この大域関数を匿名関数にするにはどうすればいいですか?
jQueryの中のgetJSONを直接に使ってみたいですが、見てみたら、jQueryのajax方法が全部混ざっています。剥がれ落ちるのも簡単なことではないと分かりました。
幸いなことに、JavaScriptは少し分かります。私の加工と修正を経て、下記の例は正常に使えます。詳細はコメントを見ることができます。
コードセグメントは以下の通りです。

(function() {
 var cross = {
 //       callback  ..            
 callback : 'cross' + parseInt(Math.random()*1000),
 init : function() {
 this.getJSON('http://to.ly/api.php?json=1&longurl='+encodeURIComponent('http://www.skiyo.cn/'), function(data){
 alert(data.shorturl);
 });
 },
 getJSON : function(url, callback) {
 var c = this.callback;
 url = url + "&callback=" + c;
 // Handle JSONP-style loading
 //       window     ,           .
 window[ c ] = window[ c ] || function( data ) {
 //      
 callback(data);
 // Garbage collect
 window[ c ] = undefined;
 try {
  delete window[ c ];
 } catch(e) {}
 if ( head ) {
  head.removeChild( script );
 }
 };
 var head = document.getElementsByTagName("head")[0] || document.documentElement;
 var script = document.createElement("script");
 script.src = url;
 // Handle Script loading
 var done = false;
 // Attach handlers for all browsers
 script.onload = script.onreadystatechange = function() {
 if ( !done && (!this.readyState 
  this.readyState === "loaded" || this.readyState === "complete") ) {
  done = true;
  // Handle memory leak in IE
  script.onload = script.onreadystatechange = null;
  if ( head && script.parentNode ) {
  head.removeChild( script );
  }
 }
 };
 head.insertBefore( script, head.firstChild );
 },
 };
 //go
 cross.init();
})();
締め括りをつける
以上でjQueryの中でgetJSONのドメインを跨ぐ原理に関する文章を紹介しました。jQuery getJSONのドメインを跨ぐ原理の内容については、以前の文章を検索したり、下記の関連記事を引き続き閲覧したりしてください。これからもよろしくお願いします。