【问题标题】:Retrieving AJAX value from a different Javascript function从不同的 Javascript 函数中检索 AJAX 值
【发布时间】:2013-02-06 20:56:36
【问题描述】:

在这个大型网络应用的简化示例中,考虑一个简单的注册表单,其中包含以下字段:用户名、名字、姓氏和注册按钮 type="button"

<form action="" method="post" id="cns_form">
    <table id="companyTable"><tr>
        <td width="200">
            First name*:<br />
            <input type="text" id="first_name" name="first_name">
        </td>
        <td width="200">
            Last name*:<br />
            <input type="text" id="last_name" name="last_name">
        </td>
    </tr></table>
    <input type="button" value="Register" id="register" >
</form>
<div id="alert" title="Alert"></div>

当用户名字段完成时,jQuery 会触发数据库的 ajax 搜索以查看该用户名是否已经存在。当单击 Register 时也会触发相同的搜索(原因已从这个简化示例中删除)。

问题:离开用户名字段时一切正常。但是,单击Register 后,如果用户名已经存在,我不知道如何检索AJAX 搜索的结果并停止提交表单。我尝试了各种不同的东西,但将代码返回到这种状态,因此读者最容易提供帮助。

例如,我尝试集成来自this question 的建议解决方案,但未能成功将其应用于我的情况...我尝试在 ajax 函数中设置async:false...我还尝试调用 checkUsername(uname ) 从 checkForm 函数内部,但这也不起作用。有点帮助?​​

jQuery document.ready:

$(function(){
    $('#username').blur(function() {
        var uname = $.trim($(this).val());
        checkUsername(uname);
    }); //END BLUR username

    $('#register').click(function() {
        var uname = $.trim($( '#username').val());
        checkUsername(uname);
        checkForm();
    });
}); //END document.ready

AJAX 调用:

function checkUsername(uname) {
        if (uname != '') {
            $.ajax({
                type: "POST",
                url: 'ajax/ax_all_ajax_fns.php',
                data: 'request=does_this_username_already_exist&username=' + uname,
                async: false,
                success:function(data){
//alert('Returned AJAX data: '+data);
                    if (data != 0) {
                        var existing_user = data.split('|');
                        var fn = existing_user[0];
                        var ln = existing_user[1];
                        focus_control = 'username';
                        $( '#alert' ).html( 'That username is already in use by ' + fn +' '+ ln +'. Please choose another.' );
                        $( '#alert' ).dialog( 'open' );
                    } //EndIf data<>0
                } //End success
            }); //End $.ajax
        } //End If this.val <> ""
}

checkForm功能:

function checkForm() {
    var un = $.trim($( '#username').val());
    var fn = $( '#first_name').val();
    var ln = $( '#last_name').val()

    if (un=='' || fn=='' || ln=='') {
        $( '#alert' ).dialog({
            height: 200,
            width: 300,
        });
        $( '#alert' ).html( 'Fields marked with an asterisk are required.' );
        $( '#alert' ).dialog( 'open' );
    } else {
        $("#cns_form").submit();
    }
}

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    当回答自己的问题时,一个人既高兴又哭泣,但就是这样。解决方案是将 checkUsername() 函数作为输入参数发送到 checkForm() 函数,并使 checkUserName() 函数返回一个我们可以在 checkForm() 中检查的值。

    因此,我们必须修改$('#register').click函数:

    $('#register').click(function() {
        var uname = $.trim($( '#username').val());
        checkForm(checkUsername(uname)); //<===========================
    });
    

    那么 checkUsername() 函数,因此:

    function checkUsername(uname) {
            var returnVal = 0; //<=================================
            if (uname != '') {
                $.ajax({
                    type: "POST",
                    url: 'ajax/ax_all_ajax_fns.php',
                    data: 'request=does_this_username_already_exist&username=' + uname,
                    async: false,
                    success:function(data){
    //alert('Returned AJAX data: '+data);
                        if (data != 0) {
                            var existing_user = data.split('|');
                            var fn = existing_user[0];
                            var ln = existing_user[1];
                            focus_control = 'username';
                            $( '#alert' ).html( 'That username is already in use by ' + fn +' '+ ln +'. Please choose another.' );
                            $( '#alert' ).dialog( 'open' );
                            returnVal = 0; //<============================
                        } //EndIf data<>0
                    } //End success
                }); //End $.ajax
            } //End If this.val <> ""
        return returnVal; //<==============================
    }
    

    AND checkform() 函数如下:

    function checkForm(exists) { //<============================
    alert('sub checkForm(). value of exists: ' + exists);
        if (exists==9) { //<================================
            $( '#alert' ).html( 'That username is already in use' + existing +'. Please choose another.' );
            $( '#alert' ).dialog( 'open' );
        }else{ //<==========================================
            var un = $.trim($( '#username').val());
            var fn = $( '#first_name').val();
            var ln = $( '#last_name').val()
    
            if (un=='' || fn=='' || ln=='') {
                $( '#alert' ).dialog({
                    height: 200,
                    width: 300,
                });
                $( '#alert' ).html( 'Fields marked with an asterisk are required.' );
                $( '#alert' ).dialog( 'open' );
            } else {
                $("#cns_form").submit();
            }
        } //<===================================================
    }
    

    感谢 Felix Kling this helpful post

    【讨论】:

      【解决方案2】:

      可能会将return false 放在HTML 表单标记的函数调用中。

      <form>
          <bunchOfElements />
          <button onclick="checkUserName(); return false">Check Name </button>
      </form>
      

      此外,您可以使用将函数绑定到按钮的单击事件

      $(document).ready(function(){
          $("#buttonID").bind('click', function(){ 
              //do your thing
              checkForm();
          });
      });
      

      【讨论】:

        【解决方案3】:

        return false 放在#register 按钮单击函数的末尾,就在checkForm() 的正下方。该按钮继续触发表单提交。当你的 javascript 函数处理了它时。

        【讨论】:

        • 提交代码 $("#cns_form").submit(); 在 checkForm() 函数内(见上文)。我应该将return false 放在该函数中的什么位置?
        猜你喜欢
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        相关资源
        最近更新 更多