2012-02-07 1 views
1

id 'typehere'の入力タイプです。タイプエリアにはキーダウンイベントが設定されています。簡単な問題は、e.srcElement.valueの値が1つ遅れているようです。つまり、その値が ''であるべきであれば、その値はブランクとしてログに記録されます。私が 'ss'と入力すると、表示される値は 's'になります。私はこれを理解することができない。e.target.valueは、1つのキー 'behind'の値を示します。

console.log(e)は、コンソールのe.srcElement.valueの正しい値を示しますが、console.log(e.srcElement.value)は間違った値を示しています。どうして?

<script type="text/javascript"> 
      var xmlHttp = createXmlHttpRequestObject(); 
      selectOption = document.getElementById('choose_colony') ; 

      document.body.onload = function() { 
       typehere = document.getElementById('typehere') ; 

       addAnEvent(typehere,"keydown",handleKeyDownevent,false) ; 
      } 

      function handleKeyDownevent (e) { 
       e = e || window.event ; 
       if (xmlHttp) { 
        try { 
         //xmlHttp.open('GET' , 'async.txt', true) ; 
          console.log(e.srcElement.value) ; 
         var target= e.target || e.srcElement ; 
         var typed = target.value  ; 
         if (typed != ""){ 
          console.log('sennding request') ; 
          //ajax request 
         } 
         else { 
          console.log(e.srcElement.value + "is blank") ; 
         } 
        } 
        catch(e) { 
         console.log('could not connect to server') ; 
        } 
       } 

      } 
</script> 

スクリプトタグは、タグの前ところで

​​を前に解雇されたおかげで

答えて

3

(typeable文字について、あなたは一般的にkeypressはなく​​keypressとして繰り返しをしたい。)です値が変更されました(keypressなど)。キーの押下を取り消すことができますので、変更後の値を処理したい場合は、d setTimeout(func, 0)を使用して電話をかけてください。イベントチェーンが巻き戻された後、あなたのコールが処理されます。 (一般的に5〜10ミリ秒以内。)あなたのコード中のSO

Live example

、次のようになりますよう:

addAnEvent(typehere,"keydown",function(e) { // or "keypress" 
    e = e || window.event; 
    setTimeout(function() { 
     handleKeyDownevent(e); 
    }, 0); 
},false) ; 
+0

私のコードで同じことを実装するのに問題があります。しかし、これは明らかに解決策です。ありがとう –

+0

それはうまくいった。私は間違ってsettimeoutを使用していました。 –

+0

'keyup'は役に立ちませんか? ...ユーザーがキーを離すのをどれくらい待つべきですか? – Stefan

0
代わりのkeydownの

使用からkeyupイベント。

0

簡単な答えは、イベント内にある変数の値を決定しようとしているときに、イベントハンドラによって処理されるため、単にイベント自体を記録することが最もよいということにあります。だから、それに対応するためにコードを修正して、役立つかどうかを調べることができます。また、私はあなたが明確にするなど、任意のキーストロークをキャンセルしようとしている場合を除き、タイムアウト(機能)を含める/設定する必要について上記の答えに反対する:

<script type="text/javascript"> 
     var xmlHttp = createXmlHttpRequestObject(); 
     selectOption = document.getElementById('choose_colony') ; 

     document.body.onload = function() { 
      typehere = document.getElementById('typehere'); 
      addAnEvent(typehere, "keydown", function(e) { 
       e = e || window.event; 
       handleKeyDownevent(e);}, false); 
     } 
function handleKeyDownevent (e) { 
      e = e || window.event ; 
      if (xmlHttp) { 
       try { 
        //xmlHttp.open('GET' , 'async.txt', true) ; 
         console.log(e.srcElement.value) ; 
        var target= e.target || e.srcElement ; 
        var typed = target.value  ; 
        if (typed != ""){ 
         console.log('sennding request') ; 
         //ajax request 
        } 
        else { 
         console.log(e.srcElement.value + "is blank") ; 
        } 
       } 
       catch(e) { 
        console.log('could not connect to server') ; 
       } 
      } 
      return true; 
     } 
</script> 

私はあなたを助け願っています。下部にあるreturn trueは、ブラウザのデフォルトの応答を許可します。

関連する問題