javascript - IE 中隐藏元素导致表单提交

标签 javascript jquery internet-explorer

我在 IE 中遇到了一些奇怪的行为,我希望有人能够解释一下。我有一个带有地址查找输入的简单表单

<form action="http://localhost:8000/processForm" method="post">
    <label for="input_1" class="form-control-label col-xs-12">
        Postcode
    </label>

    <div class="col-xs-12">
        <div class="input-group">
            <input type="text" name="questions[1]" autocomplete="off" id="input_1" class="form-control address" value="" >

            <a class="btn btn-xs input-group-addon address-button" id="input_address_addon" role="button" tabindex="0">
                <img src="http://localhost:8000/images/glyphicons-243-map-marker.png">
                Search
            </a>
        </div>
        <div class="col-xs-12 col-sm-8 col-sm-offset-4 col-md-7">
            <select class="form-control selectpicker addSelect" id="input_address_select" style="display: none;">
                <option value="">Enter above</option>
            </select>
        </div>
    </div>
    <button type="submit" class="btn submit btn-navigation">
        Continue
    </button>
</form>

在输入框中输入地址,然后单击搜索按钮。这会调用 API 以返回地址并用它们填充选择输入。这在所有浏览器中都工作正常,但注意到 IE 有点奇怪。这是处理 API 调用和填充选择的 Javascript。

!function ($, window) {

    $(function () {
        init();
    });

    var getAddresses = function (postcode, callback) {
        var $xhr = $.getJSON('/lookupPostcode/' + postcode);
        $xhr.done(function (data) {
            callback(data);
        });
        $xhr.error(function () {
            callback([]);
        })
    };

    var init = function () {
        $("input.address").each(function () {
            var $input = $(this);
            var $icon = $input.next('.address-button');
            var $select = $input.parents('.row').eq(0).find("select");

            $select.css("display", "none");

            var onKeyUp = function (e) {
                if (e.keyCode === 13) {
                    e.preventDefault();
                    e.stopPropagation();
                    $icon.trigger("click");
                }
            };
            var onKeyDown = function(e) {
                if (e.keyCode === 13) {
                    e.preventDefault();
                    e.stopPropagation();
                }
            };

            $input.on("keyup", onKeyUp);
            $input.on("keydown", onKeyDown);
            $icon.on("keyup", onKeyUp);
            $icon.on("keydown", onKeyDown);
            $select.on("keyup", onKeyUp);

            $icon.on("click", function () {
                getAddresses($input.val(), function (addresses) {
                    //populate select options with addresses
                });
            });

            $select.on('change', function (event) {

                var ua = window.navigator.userAgent;
                var is_ie = /MSIE|Trident/.test(ua);

                if ( !is_ie ) {
                    $select.css("display", "none");
                }
                /*$select.css("display", "none");*/
            });
        });
    };

}(jQuery, window);

因此,当从选择输入中选择地址时,我会隐藏选择输入。在 IE 上,隐藏此元素似乎会使表单提交。您可以在上面看到我添加了一些代码来检查它是否不是 IE,并且仅隐藏在这些设备上,并且在 IE 上保持选择正常工作。另外,如果我在更改事件的顶部放置一个警报,这似乎也会停止在 IE 中提交表单。

所以我想知道如果我隐藏选择,可能会导致在 IE 中提交?我读到 IE 不喜欢将按钮用作表单提交,但不确定这是否是问题所在?

有什么方法可以让选择隐藏在 IE 中吗?

谢谢

最佳答案

So I was wondering what may be causing this to submit in IE if I hide the select? I have read that IE does not like buttons to be used as form submits, but not sure if this is the issue?

我无法重现您的问题,我这边一切正常(IE 11.1.17340.0 版本)。

请尝试使用以下代码:(根据您的代码,请注意代码中带注释的部分)

<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript">
        !function ($, window) {

            $(function () {
                init();
            });

            var getAddresses = function (postcode, callback) {
                //var $xhr = $.getJSON('/lookupPostcode/' + postcode);

                //$xhr.done(function (data) {
                //    callback(data);
                //});
                //$xhr.error(function () {
                //    callback([]);
                //})
                //using the following array to populate the select.
                var datalist = [{ "ID": "1", "ParentID": "0", "Name": "Parent1" }, { "ID": "2", "ParentID": "0", "Name": "Parent2" },
                { "ID": "3", "ParentID": "1", "Name": "Child 1.1" }, { "ID": "4", "ParentID": "1", "Name": "Child 1.2" },
                { "ID": "5", "ParentID": "3", "Name": "SubChild 1.1.1" }, { "ID": "6", "ParentID": "2", "Name": "Child 2.1" }];

                callback(datalist);
            };

            var init = function () {
                $("input.address").each(function () {
                    var $input = $(this);
                    var $icon = $input.next('.address-button');
                    //you are using the .row class to find the select control, but from your form, I can't find this class.
                    var $select = $input.parents('.row').eq(0).find("select");
                    //debugger;
                    $select.css("display", "none");

                    var onKeyUp = function (e) {
                        if (e.keyCode === 13) {
                            e.preventDefault();
                            e.stopPropagation();
                            $icon.trigger("click");
                        }
                    };
                    var onKeyDown = function (e) {
                        if (e.keyCode === 13) {
                            e.preventDefault();
                            e.stopPropagation();
                        }
                    };

                    $input.on("keyup", onKeyUp);
                    $input.on("keydown", onKeyDown);
                    $icon.on("keyup", onKeyUp);
                    $icon.on("keydown", onKeyDown);
                    $select.on("keyup", onKeyUp);

                    $icon.on("click", function () {
                        $select.empty();
                        $select.append("<option value=''>Enter above</option>");
                        getAddresses($input.val(), function (addresses) {
                            //populate select options with addresses                           
                            $.each(addresses, function (index, item) {
                                //debugger;
                                $select.append("<option value='" + item.ID + "'>" + item.Name + "</option>");
                            });

                            $select.css("display", "block");
                        });
                    });

                    $select.on('change', function (event) {

                        var ua = window.navigator.userAgent;
                        var is_ie = /MSIE|Trident/.test(ua);
                        //get the selected text and populate the input text.
                        $input.val($(this).find("option:selected").text());

                        //hide the select control
                        if (!is_ie) {
                            $select.css("display", "none");
                        }
                        $select.css("display", "none");

                    });
                });
            };

        }(jQuery, window);
    </script>
</head>
<body>
    <form action="http://localhost:8000/processForm" method="post">
        <label for="input_1" class="form-control-label col-xs-12">
            Postcode
        </label>

        <div class="col-xs-12 row">
            <div class="input-group">
                <input type="text" name="questions[1]" autocomplete="off" id="input_1" class="form-control address" value="" />

                <a class="btn btn-xs input-group-addon address-button" id="input_address_addon" role="button" tabindex="0">
                    <img src="http://i.imgur.com/H9FIags.jpg" style="height:10px;width:10px" />
                    Search
                </a>
            </div>
            <div class="col-xs-12 col-sm-8 col-sm-offset-4 col-md-7">
                <select class="form-control selectpicker addSelect" id="input_address_select" >
                    <option value="">Enter above</option>
                </select>
            </div>
        </div>
        <button type="submit" class="btn submit btn-navigation">
            Continue
        </button>
    </form>
</body>

输出如下:

enter image description here

关于javascript - IE 中隐藏元素导致表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53087838/

相关文章:

javascript - jQuery 对象字面量函数声明错误

javascript - 如何一次选择数组中的所有元素,并为它们添加类

javascript - 如何在 Rails Turbolink 中正确使用 jQuery $().load(url)?

CSS 显示 : -webkit-box not working in Internet Explorer 11

javascript - 为什么以下 javascript 在 Internet Explorer 和 Mozilla 中不起作用,但在 google chrome 中工作正常?

javascript - jQuery JsonP 呈现错误 Uncaught ReferenceError : jQuery19107590448246337473_1375193471216 is not defined

javascript - 如何在 Javascript 中从数组创建树(父子)对象

javascript - 如何更改 Bootstrap 本地化?

javascript - 如何使用 jQuery 消除旧内容而不使用 Empty() 函数?

javascript - window.history.back() 显示 "Document Expired"页面,有什么办法吗?