【问题标题】:jQuery: performing some action before form is submittedjQuery:在提交表单之前执行一些操作
【发布时间】:2011-05-29 10:43:41
【问题描述】:

我有一个页面,上面有一个表单。该表单包含一个文本框和一个提交按钮。

提交表单后,通过单击按钮或在文本框中按 Enter 键,我想进行查找(在本例中,使用 Bing 地图对邮政编码进行地理编码),然后将表单提交到服务器,像往常一样。

我目前的方法是将提交事件的处理程序添加到唯一表单,然后在我完成后调用 submit(),但我无法让它工作,也没有能够调试问题:

$(document).ready(function () {
    $("form").submit(function (event) {
        var postcode = $.trim($("#Postcode").val());
        if (postcode.length === 0) {
            return false;
        }

        var baseUrl = "http://dev.virtualearth.net/REST/v1/Locations/UK/";
        var apiKey = "myKey";
        var url = baseUrl + postcode + "?key=" + apiKey + "&jsonp=?";
        $.getJSON(url, function (result) {
            if (result.resourceSets[0].estimatedTotal > 0) {
                var location = result.resourceSets[0].resources[0].point.coordinates;
                $("#latitude").val(location[0]);
                $("#longitude").val(location[1]);
                $("form").submit();
            }
        });
    });
});

【问题讨论】:

    标签: javascript jquery ajax maps geocode


    【解决方案1】:

    event.preventDefault() 是你的朋友。您基本上遇到了与here 相同的问题。表单在实际 ajax 请求完成之前提交。您需要停止表单提交,然后执行 ajax,然后执行表单提交。如果您不在那里设置一些站点,它只会运行它,它唯一有时间做的就是提交表单。

     $(document).ready(function () {
            $("form").submit(function (event) {
    
    // prevent default form submit
        event.preventDefault();
                var postcode = $.trim($("#Postcode").val());
                if (postcode.length === 0) {
                    return false;
                }
    
    
                var baseUrl = "http://dev.virtualearth.net/REST/v1/Locations/UK/";
                var apiKey = "myKey";
                var url = baseUrl + postcode + "?key=" + apiKey + "&jsonp=?";
                $.getJSON(url, function (result) {
                    if (result.resourceSets[0].estimatedTotal > 0) {
                        var location = result.resourceSets[0].resources[0].point.coordinates;
                        $("#latitude").val(location[0]);
                        $("#longitude").val(location[1]);
                        $("form").submit();
                    }
                });
            });
        });
    

    但是,当您将preventDefault 放在那里时,您将无法继续使用$('form').submit(); 提交表单。您需要将其作为 ajax 请求发送,或者为preventDefault 定义一个条件。

    可能是这样的:

    $(document).ready(function () {
    
        var submitForReal = false;
            $("form").submit(function (event) {
    
                var postcode = $.trim($("#Postcode").val());
                if (postcode.length === 0) {
                    return false;
                }
        // prevent default form submit
        if(!submitForReal){
        event.preventDefault();
        }else{
    
    
    
                var baseUrl = "http://dev.virtualearth.net/REST/v1/Locations/UK/";
                var apiKey = "myKey";
                var url = baseUrl + postcode + "?key=" + apiKey + "&jsonp=?";
                $.getJSON(url, function (result) {
                    if (result.resourceSets[0].estimatedTotal > 0) {
                        var location = result.resourceSets[0].resources[0].point.coordinates;
                        $("#latitude").val(location[0]);
                        $("#longitude").val(location[1]);
                        submitForReal = true;
                        $("form").submit();
                    }
                });
              }
            });
        });
    

    【讨论】:

    • 您还需要排除任何您只想在第一次运行时运行的代码,因为您可能想再次运行$.getJSON(...)
    • 很对,修改了其余的只在else条件下运行。虽然,它不应该在表单提交上运行 ajax,但现在至少它甚至不会尝试这样做。
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2020-03-13
    相关资源
    最近更新 更多