2017-03-14 20 views
0

1つのことを除いて、すべてうまくいきます。入力ボックスに何かを書き込むと、まずそれが通過して一瞬正しくエコーされ、最後の数文字/数字が消えます。 たとえば、次のように書いている場合: こんにちは PHPエコーこんにちは、しばらくしてからHまたはHELLになります 消えた文字の数は、単語の入力の速さによって決まります。文字が消えると 私は非常にゆっくりと手紙を書くと、その言葉は正しくエコーされ、何も変わりません。ここ は参照用のコードです:jQuery投稿がPHPに間違った入力値を渡しています

HTML:

<input name="paramA" id="paramA" type="text" class="form-control" maxlength="5" required/> 

のjQuery:

$("#paramA").on("keyup", function() { 
    var paramB = $('#paramB').val(); 
    var paramA = $('#paramA').val(); 
    var spaced = $.trim($(this).val()); 
    if (!$(this).val() || $(this).val() !== spaced) { 
     $("#result").html(""); 
    } else { 
     $.post('http://localhost/folder/code.php',  
       {'paramB':paramB,'paramA':paramA}, 
       function(data) { 
        $("#result").html(data); 
       } 
     ); 
    } 
}); 

PHP:

echo $_POST["paramA"]; 

すべてのヘルプは理解されるであろう。

+0

? - > if(!$(this)).val()|| $(this).val()!== spaced){ – Oliver

+0

入力が空でないことをチェックするので、JavaScriptは処理のためにPHPに渡すことができます。 – weblover

+1

代わりに:if(spaced.length> 0){ここにコードを移動してください}、他に必要なものはありません – Oliver

答えて

2

問題は、ajax呼び出しでは常に同じ時間がかかるとは限りません。
あなたが速く入力している場合、「地獄」と「こんにちは」の呼び出しがほぼ同時に開始されます。

何らかの理由で「地獄」の呼び出しに時間がかかる場合、PHPは「こんにちは」エコーを返し、その後「地獄」を受け取ります。 (出力に "Hello"を上書きします)

この解決策はcancel the pending ajax request before starting a new oneになります。

keyup機能でtimeoutを使用すると、500ミリ秒間何も入力されなかった場合にのみajaxコールが開始されます。
(あなたはまだ念のために、保留中のAJAX呼び出しをキャンセルしなければならない)、このよう

:あなたはこの行をアーカイブするかどう

var timeout = null; 
$("#paramA").on("keyup", function() { 
    clearTimeout(timeout); // clear currently waiting timeout 
    timeout = setTimeout(function(){ // wait 500 ms before ajax call 
     var paramB = $('#paramB').val(); 
     var paramA = $('#paramA').val(); 
     var spaced = $.trim($(this).val()); 
     if (!$(this).val() || $(this).val() !== spaced) { 
      $("#result").html(""); 
     } else { 
      $.post('http://localhost/folder/code.php',  
        {'paramB':paramB,'paramA':paramA}, 
        function(data) { 
         $("#result").html(data); 
        } 
      ); 
     } 
    }, 500); 
}); 
+0

あなたの本と問題の説明のためにアンディに感謝します。私はこれが理想的な解決策だと思う。しかし私は自分自身のコードに何か間違っている、私はそれがスクリプトのこの部分の内部で動作しないことを確認しようとしています。 timeout = setTimeout(function(){}、500); – weblover

+0

Andy、もう一度、ありがとう、私とうまくいった、私はちょうどPost関数の直前にsetTimeout関数を移動する必要がありました。 – weblover

+0

注:私はあなたの答えを編集しました。 – weblover

0

これはあなたのために行う必要があります。

var to = null; 
$("#paramA").on("keyup", function() {   
    var paramB = $('#paramB').val(); 
    var paramA = $.trim($(this).val()); 
    if (paramA.length > 0) { // adjust 0 to a minimum number of characters before post to php 
     if (to !== null) { 
      clearTimeout(to); 
     } 
     to = setTimeout(function() { 
      $.post('http://localhost/folder/code.php',  
       {'paramB':paramB,'paramA':paramA}, 
       function(data) { 
        $("#result").html(data); 
       } 
      ); 
     }, 500); // adjust the time in ms, how long you want to wait until the post will be send 
    } 
}); 
+0

コードを改善して、投稿前の文字数を確認するのが簡単でした。しかし、大きな問題は解決されませんでしたが、渡された値は入力ボックスの実際の値とはまだ異なります。 – weblover

+0

申し訳ありませんが、私はあなたがそれを持っているthougth。私はタイミングの問題に直面するために私の答えを変更します... – Oliver

+0

ありがとうオリバー、私は感謝します。 – weblover

関連する問題