2

貼り付け後にテキストエリアに入力されたデータを評価しようとしています。onkeyup を使用すると、問題がないかどうかが検出され、ユーザーが Cntl-V を使用して貼り付けたときに評価が正常に行われます。右クリックして貼り付けを選択しても何もしません。Cntl-V と右クリックによる貼り付けの両方を検出する onkeyup から onpaste に変更しましたが、データがありません。実際の貼り付けが実行される前に onpaste がトリガーされることを知っているので、setTimeout() で評価を遅らせようとしましたが、5 秒の遅延があっても関数関数が完了するまでデータを取得しません。何をしても、入力されたアイテムの数を数えることができないようです。これが私のコードです:

function delayStart() {                                                 

  alert("delayStart() function");                                       

  var inData = " ";                                                     
  setTimeout(function()                                                 
                {inData = document.getElementById("loanNumberPaste").value},
                5000);                                                      
  var iData = inData.value;                                             
  alert("iData = " + iData);                                            
  setTimeout(fnUpdCt(iData),5000);                                      
}                                                                       


function fnUpdCt(vId) {                                  

  var strVId = vId.value;                                
  alert("fnUpdCt() function \n" +                        
          "vId = " + strVId);                              

  var i;                                                 
  var iVal = vId.value;                                  
  var vCt  = 0;                                          

  iVal     = iVal.replace(/\s/g,' ');                    
  iVal     = iVal.split('  ');                           

  for (i=0; i < iVal.length; i++) {                      
         if (iVal[i].length > 0) {vCt++;}                  
  }                                                      

  document.getElementById("loanNumberCount").value = vCt;
}                                                        



<textarea id="loanNumberPaste" rows=17 cols=37 tabindex="1"          
             onpaste="delayStart();";onkeyup="fnUpdCt(this);"></textarea>

アドバイスをいただければ幸いです。

4

1 に答える 1

3

参照によって関数を渡す代わりに、すぐに呼び出してその値を返そうとしているため、タイムアウトは機能しません。

fnUpdCt を匿名関数でラップするだけで問題ありません。

setTimeout(function(){fnUpdCt(iData)},5000);  

また、5 秒間待つ必要はありません。これは、x 時間待機しているという事実ではなく、非同期であるという事実です。

于 2013-01-02T21:06:57.593 に答える