表单在json值填充的字段之前提交

时间:2011-10-19 20:44:02

标签: jquery jsonp

我正在使用JSONP检索登录表单的值,然后让表单自我提交。但是,表单在填充字段之前提交,从而生成验证标记。

该函数确实返回正确的值,但全局范围的变量unscrambleText返回undefined。我知道async:false是返回同步calss所必需的,但在这种情况下似乎忽略了。我让这个在另一个页面上使用基本的AJAX调用。这个具体的例子我错过了什么?

$(document).ready(function () {
            if ((getQueryVariable("a") != 0) && (getQueryVariable("b") != 0)) {
                $("#UsernameTextBox").val(decryptEm(getQueryVariable("a")));
                $("#PasswordTextBox").val(decryptEm(getQueryVariable("b"));
                //This action is being triggered before the above two fields are populated
                $("#ctl00_ContentPlaceHolder1_SubmitButton").trigger("click");
            }

            function getQueryVariable(variable) {
                var query = window.location.search.substring(1);
                var vars = query.split("&");
                for (var i = 0; i < vars.length; i++) {
                    var pair = vars[i].split("=");
                    if (pair[0] == variable) {
                        return unescape(pair[1]);
                    }
                }
                return 0;
            }

            function decryptEm(thevar) {
                var unscrambleText;

                $.ajax({
                    url: 'http://foo.bar/decrypt.php',
                    async: false,
                    dataType: 'jsonp',
                    data: 'text=' + thevar,
                    success: function (data) {
                        unscrambleText = data["theval"].replace(/^\s+|\s+$/g, "");
                    }
                });
                return unscrambleText;
            }

        });

3 个答案:

答案 0 :(得分:0)

你可以在触发点击之前尝试使用setInterval,也许2秒的延迟就足够了。

交替更改您的代码以执行decryptEms,这将执行所有字段并返回两者,然后才执行触发表单提交

答案 1 :(得分:0)

它返回undefined,因为它在函数返回时没有值。 decryptEm与服务器响应您的请求之间存在延迟。这种延迟可能是任何因素,因为它取决于服务器的响应时间。

答案 2 :(得分:0)

将它放在一个函数中,如下所示:

function loadValues(){
    $("#UsernameTextBox").val(decryptEm(getQueryVariable("a")));
    $("#PasswordTextBox").val(decryptEm(getQueryVariable("b"));
    return true;
}
if(loadValues==true){
    $("#ctl00_ContentPlaceHolder1_SubmitButton").trigger("click");
}

通过这种方式,您可以确保在提交被触发之前其他内容已经完成。