2009-10-29 6 views

答えて

5

のこの機能を使用しない何をしているのか知っている限り。

xhrオプションを使用すると、ajax()コールで舞台裏で使用されるXMLHttpRequestオブジェクトを作成するための独自のコールバックを定義できます。ほとんどすべての場合、このオプションを指定する必要はありません。

+1

はい、それほど役に立ちません。 –

+2

不明な点がある場合は、まずAPIにアクセスしてください。 –

+2

本当に...?これはかなり悲しい試みです... [編集:このEDITセクションを追加することで、私のコメントは少し参考になります。 – SgtPooki

0

http://api.jquery.com/はあなたの友達です。そのサイトからajax()コマンドを検索するとき:

xhr(機能):XMLHttpRequestオブジェクトを作成するためのコールバック。使用可能な場合はActiveXObject(IE)、それ以外の場合はXMLHttpRequestになります。 XMLHttpRequestの独自の実装、またはファクトリの拡張機能を提供するためにオーバーライドします.jQuery 1.2.6およびそれ以前のバージョンでは使用できません。

一般

、あなたはあなたが本当にsomeone does know、実際には$アヤックス()関数

+1

はい、この機能ではもっと深く学ぶことがポイントでしたが、ここでは十分に親切ではありませんでした。 Sujalはそれを明確にした。 –

17

私は、これは古い、古い質問ですけど、私はこのために検索し、次の人が、何が起こっているのか理解してこれを投稿したいました。この機能のために

、あなたのブラウザのための適切なXHRオブジェクトを返すようにしたいです。デフォルトの動作は、XMLHTTPRequestまたはIE相当のものを使用することです。ここではデフォルトの動作です:

jQuery.ajaxSettings.xhr = window.ActiveXObject ? 
/* Microsoft failed to properly 
* implement the XMLHttpRequest in IE7 (can't request local files), 
* so we use the ActiveXObject when it is available 
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so 
* we need a fallback. 
*/ 
function() { 
    return !this.isLocal && createStandardXHR() || createActiveXHR(); 
} : 
// For all other browsers, use the standard XMLHttpRequest object 
createStandardXHR; 

これら2メソッドcreateStandardXHRを作成し、createActiveXHRは、基本的に、我々はすべて知っていた基本的なXHRの作成メソッドをコールし、年間愛さ。ここcreateStandardXHRです:あなたはこれを上書きしたい場合

function createStandardXHR() { 
try { 
    return new window.XMLHttpRequest(); 
} catch(e) {} 
} 

ので、あなたは、単にnew XMLHttpRequest()オブジェクトを返す独自の関数に渡すことができます。

なぜこれをやりたいですか?たとえば、クロスドメインHTTPリクエストを作成する必要があり、IFRAMEシムを使用してdocument.domainを使用して動作させる場合、同じ発信元ルール内で作業するとします。これは、あなたが話したいドメインに基づいて正しいフレームからXHRオブジェクトをJavaScriptにロードさせるための良い方法です。

Twitter.comではこの手法を使用しています。

JavaScriptがhttp://twitter.com/上で実行されますが、データがhttp://api.twitter.comです。彼らは単にdocument.domain"twitter.com"に設定するapi.twitter.comを指すIFRAMEを作成します。メインページのdocument.domainから"twitter.com"にも設定されています。

HTTPリクエストを作成するときに、彼らのJSは、ちょうどIFRAMEの代わりのメインページから、それを作成します。同じ起点のポリシーを通じてそれらを取得します。

あなたは$アヤックス()へのXHRオプションでこれを行うことができます。メインページとiframeの両方が同じ値にそのdocument.domainを設定している限り動作します

$.ajax({url: "http://api.myapp.com", xhr: function(){ 
    return new ($('#my_api_iframe')[0].contentWindow.XMLHttpRequest)(); 
}, success: function(html) { 
    // format and output result 
    } 
}); 

:ここでは、スニペット(http://myapp.comでページ上で実行されているこのコードを想像しては)です。(これはちょっとした例です。私は不正行為をして標準のXMLHttpRequestオブジェクトしか使用しないため、IEの一部のバージョンでは動作しません - 修正する必要があります)。

(追加するには、編集:これは古いブラウザのために必要な技術である - 最も近代的なブラウザでCORSサポートは、これが不要になるだろう)

Sujal

+1

あなたの遅い投稿をありがとう、それは良い説明になります –

8

別の後半の答えが、以下のコードは、良い例ですあなたがxhrオプションを無効にするときにできることのThis is taken from Ben Nolan's blog xhr getの進行状況を追跡することができます。大規模なjsonデータセットをロードするときにプログレスバーを作成するためにこれを使用しました。それは私にトンを助けた。

interval = null 

$.ajax { 
    url : "endpoint.json" 

    dataType : 'json' 

    xhr :() => 
    xhr = jQuery.ajaxSettings.xhr() 

    interval = setInterval(=> 
     if xhr.readyState > 2 
     total = parseInt(xhr.getResponseHeader('Content-length')) 
     completed = parseInt(xhr.responseText.length) 
     percentage = (100.0/total * completed).toFixed(2) 

     console.log "Completed #{percentage}%" 
    , 50) 

    xhr 

    complete: -> 
    clearInterval(interval) 

    success : (data) => 
    alert(data) 
} 
+5

あなたはCoffeeScriptの代わりにJavaScriptでこの答えを提供する可能性がありますか? – pydanny

+2

@pydannyチェックアウトhttp://js2coffee.org/ –