0

次の ajax スクリプトが 1 を返さない場合、validator.registercallback 関数全体に対して true を返そうとしています。それを理解してください。

validator.registerCallback('unique_username', function(value) {

        //use ajax to run the check  
        var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      if(xmlhttp.responseText != 1) {
          alert('Username Exists');
          return false;
      } else {
          alert('Username Available!');
          return true;
      }
    }
  }
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();

})

奇妙なのは、次のように機能することです。ajax スクリプトの値に基づいて機能しないだけです。

validator.registerCallback('unique_username', function(value) {

        //use ajax to run the check  
        var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      if(xmlhttp.responseText != 1) {
          alert('Username Exists');
          return false;
      } else {
          alert('Username Available!');
          return true;
      }
    }
  }
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();

return true;

})

したがって、基本的には、メイン関数で true を返すように指示できますが、ajax スクリプトの値が 1 を返さない場合にのみ true を返そうとすると、機能しません。ちなみに、アラートは機能します。したがって、正しい値を取得していますが、trueまたはfalseを返すことはありません。

どんな助けでも大歓迎です!

アップデート

validator.registerCallback('unique_username', function(value) {

        //use ajax to run the check  
function ajax_result() {
  var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    }
  }
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();
}

if(ajax_result() != 1) { 

alert('Username Exists');
return false;

} else {

alert('Username Available!');
return true;

}

})
4

3 に答える 3

1

あなたが見逃しているのは、ajax 呼び出しが非同期であることです。関数が終了すると、ajax 呼び出しはまだ完了しておらず、値 (true または false) は後でのみ返されます。

これに対処するには、ajax 呼び出しを同期させるか、連鎖ロジックを変更する必要があります。たとえば、逆にして ajax 呼び出し内で validator.registerCallback() を実行します。promiseなどのより高度な手法を検討することもできます。

[更新] これは、リクエストを同期させる方法です。

xmlhttp.open("GET","uniqueuser.php?username="+value,false);

残りのコードも変更する必要があります。たとえば、この MDN 記事を参照してください。

于 2013-03-29T00:05:14.393 に答える
0

再試行:

is_user_existing('foo', function(result)
{
  if (result)
    alert("user is existing");
  else
    alert("user is not existing");
});

function is_user_existing(username, continuation)
{
    $.get('uniqueuser.php', {username: username}, function(webpage)
    {
      continuation (webpage == 1);
    });
}
于 2013-03-29T00:11:54.773 に答える
0

この質問のキーワード リストに jQuery を追加したので、jQuery を使用して回答します。

var username = "foo";
$.get('uniqueuser.php', {username: username}, function(webpage)
{
  if (webpage == 1)
    alert("user exists");
  else
    alert("Username available!");
});
于 2013-03-28T23:53:58.037 に答える