【问题标题】:Clicking submit while dropdown menu is shown does not submit form in chrome, but does in IE在显示下拉菜单时单击提交不会在 chrome 中提交表单,但在 IE 中会提交
【发布时间】:2018-02-21 11:24:19
【问题描述】:

我有一个简单的日期范围搜索表单,其中包含使用引导程序的“高级选项”下拉菜单。我的问题是,当用户在显示高级下拉列表时按下提交按钮时,它在不同浏览器中具有不同的行为。 在 IE 中,下拉菜单关闭,表单将被提交。在 Chrome 中,下拉菜单关闭,但我必须再次单击提交按钮才能提交表单。

如果我拦截按钮单击事件并手动提交,那么我可以在 Chrome 中单击一次,但随后表单在 IE 中提交两次。

有什么方法可以在两个浏览器中获得一致的行为?

https://jsfiddle.net/joeykruger75/bv8dshu8/

$('#date-range-box').daterangepicker({

  "startDate": "07/14/2017",
  "endDate": "07/20/2017"
});


$('.dropdown-menu').click(function(e) {
  e.stopPropagation(); //This will prevent the event from bubbling up and close the dropdown when you type/click on text boxes.
});

$('#search-form').submit(function(ev) {
  ev.preventDefault();
  showMsg('submitted');
});

function showMsg(msg) {
  var options = {
    day: "2-digit",
    hour: "2-digit",
    minute: "2-digit",
    second: "2-digit",
    year: "numeric",
    month: "2-digit",
    useGrouping: "false"
  };
  var dateS = new Date().toLocaleString('en-GB', options);
  toastr.options.positionClass = "toast-bottom-right";
  toastr.info(msg + ' - ' + dateS, {
    "positionClass": "toast-bottom-right",
  });

}
body {
  padding-top: 50px;
}

.dropdown.dropdown-lg .dropdown-menu {
  margin-top: -1px;
  padding: 6px 20px;
}

.input-group-btn .btn-group {
  display: flex !important;
}

.btn-group .btn {
  border-radius: 0;
  margin-left: -1px;
}

.btn-group .btn:last-child {
  border-top-right-radius: 4px;
  border-bottom-right-radius: 4px;
}

.btn-group .form-horizontal .btn[type="submit"] {
  border-top-left-radius: 4px;
  border-bottom-left-radius: 4px;
}

.form-horizontal .form-group {
  margin-left: 0;
  margin-right: 0;
}

.form-group .form-control:last-child {
  border-top-left-radius: 4px;
  border-bottom-left-radius: 4px;
}

@media screen and (min-width: 768px) {
  #adv-search {
    width: 400px;
    margin: 0 auto;
  }
  .dropdown.dropdown-lg {
    position: static !important;
  }
  .dropdown.dropdown-lg .dropdown-menu {
    min-width: 400px;
  }
}
<script src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<link href="https://cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/js/toastr.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/bootstrap.daterangepicker/2/daterangepicker.js"></script>


<form name="myform" id="search-form" class="form-horizontal" role="form">
  <div class="container">
    <div class="row">
      <div class="col-md-12">
        <div class="input-group" id="adv-search">
          <input type="text" class="form-control" placeholder="Search for snippets" id="date-range-box" />
          <div class="input-group-btn">
            <div class="btn-group" role="group">
              <div class="dropdown dropdown-lg">
                <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">Advanced <span class="caret"></span></button>
                <div class="dropdown-menu dropdown-menu-right" role="menu">

                  <div class="form-group">
                    <label for="filter">Location</label>
                    <select class="form-control">
                                            <option value="0" selected>All Locations</option>
                                            <option value="1">Location #1</option>
                                            <option value="2">Location #2</option>
                                            <option value="3">Location #3</option>
                                            <option value="4">Location #4</option>
                                        </select>
                  </div>
                  <div class="form-group">
                    <label for="filter">Product</label>
                    <select class="form-control">
                                            <option value="0" selected>All Products</option>
                                            <option value="1">Product #1</option>
                                            <option value="2">Product #2</option>
                                            <option value="3">Product #3</option>
                                            <option value="4">Product #4</option>
                                            <option value="4">Product #5</option>
                                        </select>
                  </div>
                  <div class="form-group">
                    <label for="contain">Customer Ref</label>
                    <input class="form-control" type="text" />
                  </div>
                </div>
              </div>
              <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-search" aria-hidden="true"></span></button>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</form>

【问题讨论】:

  • 我发现当下拉菜单显示为“dropdown-backdrop”类且z-index为990时,有一个隐藏的div会显示在chrome中。奇怪的是,这个div无处可去在 IE 中可以看到,但这意味着搜索按钮实际上并没有被点击。如果我添加以下 CSS,那么问题就解决了。目前还没有发现任何副作用:.dropdown-backdrop { display: none; }

标签: javascript twitter-bootstrap forms cross-browser


【解决方案1】:

尝试使用return false 选项而不是ev.preventDefault()

https://subinsb.com/jquery-return-false-vs-preventdefault/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多