2011-07-14 11 views
0

jQuery.ajax()に基づいてAJAXスクリプトを作成していますが、ロードしようとしているリンクがhtmlページであるかどうかチェックする必要があります。 swf、image、またはzipのようなものです。だから私は何とかcontent-typeヘッダーをチェックして、コンテンツを取得するか(htmlの場合)、ajax呼び出しをスローしてwindow.location = theUrlを実行する必要があるかどうかを判断する必要があります。私が望まないのは、100MBのzipファイルであることを知るためにファイル全体を取得することです。jQuery AJAXはヘッダーのみを取得し、内容を取得するには湿度を決定します

依然として進行中にリクエストを一時停止(または中止)する方法はありますか? HEAD呼び出しはオプションではありません。これは、毎回サーバーに2つの要求を行う必要があるためです。

setTimeoutと低レベルのxhr機能で何らかの種類のハッキングがありますか?

ありがとうございます! :)

EDIT:要求が完了する前にxhrからxhrのヘッダーを取得しようとしましたが、すべてのデータが取得されるまでデータが入力されていないようです。

EDIT 2:これは、順番に私は、1を述べた2、3、4与えたと私はコンテンツタイプを得ることができ

var xhrr = new window.XMLHttpRequest(); 
$.ajaxSetup({ 
    xhr: function() { return xhrr } 
}); 

... 
$.ajax(....); 

var theirfunc = xhrr.onreadystatechange; 
xhrr.onreadystatechange = function() { 
    console.log('xhr state: ', xhrr.readyState); 
    theirfunc(); 
}; 

:私はonreadystatechangeにするために自分自身をバインドするjQueryのものを中心に自分の道をハッキング正常に中断します。私はまだjquery自体がXMLHttpRequestオブジェクトを作成するときにうまくいかない理由を調べています。 ajaxSetupの部分をスキップしてvar xhrr = $.ajax(...)を取得すると、同じ方法でバインドできなくなります。では、私のxhrはjqueryとどう違うのですか?私は彼らが次のようにそれをするのを見る:

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

だから違いはありませんか?

編集3:それを見つけました! jquery 1.6はプロパティの数が少ない偽のxhrオブジェクトを返し、onreadystatechangeはその1つではありません。

+2

なぜHEADないオプションがありますか?これはまさにそのためのものであり、HEAD要求のコストは何もない横にあるべきです。人々がその機能のすべてを使い始めるならば、HTTPは素晴らしいプロトコルであり、ウェブはより良い場所になるでしょう。 – Daff

+0

私はこれ以上のリクエストをしたくありません。たぶん私はそれを行う別の方法を見つけることができない場合... – stormbreaker

答えて

4

jQueryをハックする必要があるかもしれません。私はこれを詳細に行う方法はわかりませんが、...

jQueryはXMLHttpRequest()を使用してデータをロードします。あなたはここに(ページがスクロールされます心)

http://en.wikipedia.org/wiki/XMLHttpRequest#The_onreadystatechange_event_listener

を見れば、あなたはそれをロードするためのヘッダをリッスンするリスナーを添付する何とか可能だということでしょう。データは引き続きロードされますが、abort()関数を使用するとそのデータを中断できます。あなたはjQueryのソースコードを見ると :

http://www.google.com/codesearch#LARMQtWqu54/trunk/spec/support/jquery-1.4.4.js&q=xmlhttprequest%20package:jQuery&type=cs

とxhr.send(1試合)とwindow.XMLHttpRequest(2試合)を探し、あなたはそれらのオプションは、ネイティブのjQueryで使用されていないことがわかります(xhrはXMLHttpRequestであることに注意してください)。しかし、window.XMLHttpRequestの最初の試合では、このオブジェクトをオーバーライドすることができるというコメントが表示されます。しかし、2回目の試合ではコメントは存在しないので、これもオーバーライドされるかどうかはわかりません(したがって、すべてのブラウザで動作させるためにはハックする必要があります)。 XMLHttpRequestを拡張し、コンストラクタを変更したり、メソッドを送信してその親を呼び出す必要があります。コメントを参照する方法で、そのオブジェクトをjQueryに渡します。

リスナーがどのように動作し、オブジェクト指向がjavascriptでどのように機能するかをご存知でしょうか?

+0

ありがとうございました。私の編集#2を参照してください また、jQuery 1.6.2のソースを探しています。彼らはいくつかのものを変更しました – stormbreaker

+0

私はこれを見つけましたhttp://dev.jquery.it/ticket/9324と完璧に動作したコメントのソリューション。しかし、あなたはその方向に私を指摘しました。私は答えとしてあなたの投稿をマークしています。再度、感謝します :) – stormbreaker

0

たとえば、あなたが指定した場合、私は思う:あなたのAJAXリクエストで

contentType: "text/html; charset=utf-8" 

を送信されたデータを使用して、要求が失敗し、私は、これはあなたが行くことができる方法だと思う指定されたMIMEタイプと一致しない場合これを処理する。このことができます

$.ajax({ 
    url: 'http://fiddle.jshell.net/favicon.png', 
    beforeSend: function(xhr) { 
    xhr.overrideMimeType('text/html; charset=x-user-defined'); 
    }, 
    success: function(data) { 
    if (console && console.log){ 
     console.log('Sample of data:', data.slice(0,100)); 
    } 
    } 
}); 

希望:

詳細についてはまた多分あなたはbeforeSendパラメータでやってみることができますthis section of the jQuery documentation

をチェックしてください。

+0

これは動作しません。とにかく、サーバーはファイル全体を送信します。私はまた、Acceptヘッダーを 'text/html'に設定しようとしましたが、サーバーはファイルを無視しているように送信します... ApacheとNginxでテストしました – stormbreaker

+0

beforeSendパラメーター? – XGreen

+0

これは実際にあなたのために機能しますか?サーバーは何を応答しますか? – stormbreaker

8

'HEAD'タイプを使用すると、jQueryはコンテンツをダウンロードせず、ヘッダーのみをフェッチします。

返されたXHRオブジェクトでgetResponseHeaderを使用すると、名前でそれらを取得できます。

$.ajax({ 
     type: 'HEAD', 
     url: 'http://example.com/api.php', 
     complete: function(xhr) { 
      var contentLength = xhr.getResponseHeader('Content-Length'); 
     } 
}); 

あなたはまたして、すべてのレスポンスヘッダの一覧を取得することができます。

xhr.getAllResponseHeaders() 
関連する問題