2016-05-09 3 views
-1

に設定されているとき、私はJavaScriptを使用にかなり新しいですし、任意の助けをいただければ幸いfalseに設定されていないが、XMLHttpRequestの作業内部のコードがありません。 私は、ブラウザーがxmlhttprequestを使用してサーバーからの応答(テスト目的でtrueまたはfalse)を使用し、応答に基づいて、ユーザーがアップロード用のローカルファイルを選択するためのファイル選択ダイアログを開きます。なぜ非同期フラグは、それが真

asyncフラグをFALSEに設定してXMLHttpRequestを作成すると、クライアントがサーバーから「本当の」応答を受け取ると、ファイル選択ダイアログボックスが開きます(Chrome、IEの両方)。

asyncフラグをTRUE(推奨)に設定してXMLHttpRequestを作成すると、クライアントがサーバーから「真の」応答を受け取ると、同じコードパスが適用されますが、ファイル選択ダイアログボックスは開きません。 Chrome用のデバッガにエラーは表示されませんが、IEではまだ動作します。私はそれがTRUEに設定されているときに非同期フラグがFALSEに設定されていないが、ときに、このコードは完璧に動作することを改めて表明したいと思います

... 
// user has clicked button to upload a file 
$scope.uploadFile = function() { 
    request = new XMLHttpRequest(); 
    request.open("GET", "some-url", true);// false 
    request.onreadystatechange = $scope.checkUploadPermissions; 
    request.send();  
} 

// the callback 
// If the user has permission (based on various factors not shown here) 
// we open the dialog 
// Otherwise we inform them that they are not allowed 
$scope.checkUploadPermissions = function() { 
    // simplified for brevity 
    if (request.readyState == 4 && request.status == 200) { 
    // for this sample, we are only checking if the server returned true/false 
    var hasPerms = request.responseText; 
    if (hasPerms === "true") { 
     $scope.openFileSelector(); 
    } 
    else { 
     alert("You do not have permission to upload a file."); 
    } 
    } 
} 

// if the user has permission to proceed, we trigger a click on a hidden element 
$scope.openFileSelector = function() {  
    angular.element("#presentUpload").trigger("click"); 
} 
... 

:ここ

はコードです。

フラグをTRUEに設定すると、この動作を正しく行うことができます。

ありがとうございます。

+0

は通常、それはだと完了コールバックで実行されなければならないいくつかのものは、そこで行われていません。 – jfriend00

+0

'angular.element( "#presentUpload")とは何ですか?trigger( "click");非同期でajaxを実行しているときに 'openFileSelector()'が呼び出されるかどうか知っていますか?ブラウザ内の一部のアクションは非同期で実行することはできません。実際のユーザーイベントの処理中にのみ動作します。 – jfriend00

+0

@ jfriend00 openFileSelector()の呼び出しは、ユーザーがファイルをアップロードする権限を持っている場合に必要なTODOを含む関数に過ぎません。 'angular.element(「#presentUpload」)への呼び出しトリガ(「クリック」);'単にのonchange ... 'の ' – codephreek

答えて

1

ファイルのアップロードは、ユーザーのアクション(通常はあなたのJSコードは、マウスクリックやキーボードイベントを処理している間)の直接の結果として開始することができ、ブラウザの機能です。タイマーや非同期コールバックを使用して非同期に開始することはできません。

あなたが同期するためにあなたの最初のAjax呼び出しを設定すると、それは隠し要素のクリックイベント内でまだあるように、その後、隠し要素であなたのJSをクリックすると、ブラウザに表示されますので、アップロードが許可されます。最初のAjax呼び出しを非同期に設定すると、非表示の要素をクリックしようとするまでにユーザー・クリック・イベントが終了し、ブラウザーはアップロード・ダイアログを表示しません。

詳細はTrigger click on input=file on asynchronous ajax done()を参照してください。何かが同期ではなく非同期に動作したときに実行パス内のいくつかのコードが誤って同期実行を想定しているので、

関連する問題