2016-07-19 12 views
0

私は検索していますが、私の問題に関連するものは見つかりませんでした。ユーザーがアクションを開始したときにカーソルを変更して、リクエストをショットガンしないようにする必要があります。Javascriptカーソル:イベントのシーケンス

カーソルを変更する文は単純ですが、正しくシーケンスに入ることができません。関数が完了するまでカーソルは変化しません。カーソルを通常の動作に戻すステートメントをコメントアウトすることで、これを見ることができます。

私は、彼がajax関数が呼び出されるまでカーソルを待ってそのままにして、通常の状態に戻ります。

// wrapper to set wait cursor during ajax calls (the cursor change doesn't work, btw -- leaving it here so it can be fixed) 
function loadForm(){ 
    setTimeout("document.getElementsByTagName('BODY')[0].style.cursor = 'wait'",1); 
    populateReadPage(); 
    setTimeout("document.getElementsByTagName('BODY')[0].style.cursor = 'auto'", 1); 
} 

// configure calls to populate entire page: first string identifies the call, the second string identifies the custom function to implement 
function populateReadPage(){ 
    setScreenObject("noncom","grid1"); 
    setScreenObject("cur_cert","grid2"); 
    setScreenObject("cur_hecm","grid3"); 
    setScreenObject("prev_cert","grid4"); 
    setScreenObject("prev_hecm","grid5"); 
} 
+1

jqueryを使用できませんか? ajaxStop(function()){ $(this)} css({'cursor': 'wait'}); })ajaxStop(function(){ $(this).css {'カーソル': 'デフォルト'}); }); –

+0

ここではjqueryを標準として受け入れていません。 –

答えて

0

Javascriptの実行はシングルスレッドなので、これはあなたがloadForm機能を実行するときに何が起こるかです:

  1. setTimeout(Action1,1):現在の(メイン)実行ラインは
  2. を終了したときにアクション1が実行されるようにエンキューされます
  3. populateReadPage()このメソッドは実行されます
  4. setTimeout(Action2,1):再度、現在の(メイン)実行行が終了すると、Action2が実行されるようにエンキューされます。メインラインで他の
  5. 何も、Action1

UPDATEを実行する

  • Action2を実行されない:いくつかの研究の後、そう、ボディスタイルの変更を設定する「一時停止」が必要と思われます

    function loadForm(){ 
        document.body.style.cursor = 'wait'; //sets the cursor to wait 
    
        setTimeout(()=> { //enqueues the tasks 
        populateReadPage(); 
        document.body.style.cursor = 'auto'; //once all is done, sets the regular pointer 
        }); 
    } 
    

    ただ一つのこと:それは動くまでカーソルは、変更されませんわからない、なぜ

    私はそれが次のコードで働かせました
  • +0

    それは私が元々コードを持っていた方法でした。症状は同じです。 setTimeout呼び出しを削除しましたが、変更はありませんでした。 –

    +0

    私のシステムが利用可能になるのを待つ間に - 構文を説明できますか? 私はこれを理解しています: setTimeout(function(){// do stuff})} 「()=>」は何ですか? –

    +0

    これは動作します。ありがとうございました。(私のajax呼び出しは通常かなり速いので、確認するために関数に人為的な遅延を追加する必要がありました) –

    0

    これはトピック交換のビットです...私はそれらをjQueryを使用するように話しました。

    私がトップで言ったように。私がしたいのは、カーソルを「待機」にして、非同期タスクを実行してから「自動」に戻すことだけです。以下のコードは私が今使っているもので、うまくいくようです(塗料はgetの後までは起こらない)が、カーソルは変わらないように見える。

    これまでのところ、(受け入れられた回答を含む)何も私のために働いていません。

    これは私の現在のコードです。

    function setWait(){ 
        if(document.body.style.cursor = 'wait'){ 
         return this; 
        } 
    } 
    function setAuto(){ 
        document.body.style.cursor = 'auto'; 
        return this; 
    } 
    
    function loadForm(){ 
        setWait(); 
        setTimeout(function() { 
         $.when(setScreenObject("prev_cert"),setScreenObject("noncom"), setScreenObject("cur_cert")).done(function() {parseResults();}); 
        setAuto(); 
        }); 
    } 
    
    function setScreenObject(str1){ 
        // if "_user" exists use url 1 (counselor view), otherwise use url2 (hud/contractor view) 
        if(document.getElementById('_user')){ 
         url="/clas/html/f17counselor_emp_req_db.cfc?method=getAgencyList&qCode=" + str1 + "&uid=" + document.getElementById('_user').value; 
        } else { 
         url="/clas/html/f17counselor_emp_req_db.cfc?method=getAgencyList&qCode=" + str1 + "&uid=&cid=" + document.getElementById('_identry').value; 
        } 
        $.ajax({ 
         type : 'GET', 
         url : url, 
         async : false, 
         success : function (json) { 
         switch(str1) { 
          case "noncom": 
           noncom = json; 
          break; 
          case "cur_cert": 
           cur_cert = json; 
          break; 
          case "prev_cert": 
           prev_cert = json; 
          break; 
          default: 
           sysFault = true; 
           displayError(); 
          } 
         }, 
         error : function() { 
          sysFault = true; 
          displayError(); 
          }, 
         }); 
    } 
    
    関連する問題