单击输入可关闭列表,但不应

时间:2018-07-31 06:43:42

标签: javascript jquery html twitter-bootstrap

我有一个带有过滤器的以下列表。除一件烦人的事情外,其他所有东西都工作正常-不幸的是,当我单击输入字段时,它会关闭整个列表,并且不幸的是,由于我的JavaScript知识很差,我不知道如何解决此问题。

如何做到这一点,以便保留所有功能,但是单击时输入字段未关闭列表?

$('.md-select').on('click', function() {
  $(this).toggleClass('active')
})

$('.md-select ul li').on('click', function() {
  var v = $(this).text();
  $('.md-select ul li').not($(this)).removeClass('active');
  $(this).addClass('active');
  $('.md-select label button').text(v)
})

$(document).mouseup(function(e) {
  var container = $(".md-select");

  // if the target of the click isn't the container nor a descendant of the container
  if (!container.is(e.target) && container.has(e.target).length === 0) {
    container.removeClass('active');
  }
});

var filter = document.getElementById('filter');
var list = document.getElementById('ul-id');
var listItems = list.querySelectorAll('li');

//filter.focus();

filter.addEventListener('keyup', function(e) {
  var val = new RegExp(e.target.value, 'gi');
  for (var i = 0; i < listItems.length; i++) {
    if (e.target.value.length > 0) {
      var text = listItems[i].innerHTML;

      if (!text.match(val)) {
        listItems[i].classList.add('is-hidden');
      } else {
        listItems[i].classList.remove('is-hidden');
      }
    } else {
      listItems[i].classList.remove('is-hidden');
    }

  }
});
.md-select ul::-webkit-scrollbar {
  width: 12px;
}

.md-select ul::-webkit-scrollbar-track {
  -webkit-box-shadow: none !important;
  -webkit-border-radius: 0 !important;
  border-radius: 0 !important;
  background: #fff;
}

.md-select ul::-webkit-scrollbar-thumb {
  -webkit-border-radius: 0 !important;
  border-radius: 0 !important;
  background: rgb(242, 124, 37) !important;
  height: 30px;
}

.md-select {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  display: block;
  margin: 10px 0 8px 0;
  padding-bottom: 2px;
  max-width: 400px;
  width: 100%;
  z-index: 999;
}

.md-select *,
.md-select :after,
.md-select :before {
  box-sizing: border-box;
}

.md-select [type=button] {
  background: #333;
  color: #fff;
  cursor: default;
  display: block;
  line-height: 48px;
  padding: 2px 0 1px 16px;
  position: relative;
  text-align: left;
  text-shadow: none;
  width: 100%;
  z-index: 1;
  outline: none;
  overflow: hidden;
  border: none;
  border-bottom: 3px solid #000;
}

.md-select.overview [type=button] {
  color: #000;
  border-bottom: 3px solid #f27c25;
}

.md-select.overview ul[role=listbox] {
  border: none;
}

.md-select.overview.active ul {
  border: 2px solid #f27c25;
}

.md-select [type=button]:focus,
.md-select [type=button]:hover {
  background: rgba(0, 0, 0, 0.1);
}

.md-select [type=button]:after {
  content: '\25be';
  float: right;
  padding-right: 16px;
  color: #000;
}

.md-select ul[role=listbox] {
  cursor: default;
  list-style: none;
  line-height: 26px;
  overflow: hidden;
  margin: 0;
  max-height: 0;
  position: absolute;
  padding: 0;
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
  transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);
  width: 100%;
  border: 2px solid #f27c25;
  box-shadow: none !important;
  padding: 0 !important;
}

.md-select ul[role=listbox] li {
  height: 48px;
  margin: 0;
  padding: 10px 16px;
  outline: none;
  overflow: hidden;
  border-bottom: 2px solid #f27c25 !important;
  border-right: 2px solid #f27c25;
  background: #fff;
  z-index: 999;
  position: relative;
  color: #000;
}

.md-select ul[role=listbox] li:nth-last-of-type(1) {
  border-bottom: 0;
}

.md-select ul[role=listbox] li:focus,
.md-select ul[role=listbox] li:hover,
.md-select ul[role=listbox] li.active {
  background: #fff;
}

.md-select.active ul {
  max-height: 240px;
  overflow: auto;
  padding: 8px 0 16px 0px;
  z-index: 2;
  transition: all 0.2s ease;
}

.searchFilter {
  height: 48px;
  margin: 0;
  padding: 10px 16px;
  outline: none;
  overflow: hidden;
  border: 2px solid #f27c25 !important;
  background: #fff;
  z-index: 999;
  position: relative;
  color: #000;
  width: 100%;
  border-left: 0 !important;
}

ul#ul-id li.is-hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="md-select">
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>

  <label for="ul-id"><button type="button" class="ng-binding">Choose your country</button></label>
  <ul role="listbox" id="ul-id" class="md-whiteframe-z1" aria-activedescendant="state2_AK" name="ul-id">
    <input type="text" id="filter" class="searchFilter" placeholder="Type to filter" />
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Afghanistan</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Albania</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Algeria</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Andorra</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Angola</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Antigua & Deps</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Argentina</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Armenia</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Australia</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Austria</li>
    </a>
    <a href="h#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Azerbaijan</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bahamas</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bahrain</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bangladesh</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Barbados</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Belarus</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Belgium</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Belize</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Benin</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bhutan</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bolivia</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bosnia Herzegovina</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Botswana</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Brazil</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Brunei</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Bulgaria</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Burkina</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Burundi</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Cambodia</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Cameroon</li>
    </a>
    <a href="#">
      <li role="option" id="" class="ng-binding ng-scope" tabindex="-1" aria-selected="false">Canada</li>
    </a>
  </ul>

</div>

1 个答案:

答案 0 :(得分:3)

您的问题之所以发生,是因为click$('.md-select ul li')字段的父级,而.md-select ul li的{​​{1}}也影响了输入字段。

  

通过使用input,我们可以防止发生   父元素来影响子元素event.stopPropagation();

这将为您工作:

input
$('#filter').on('click', function(event) {
  event.stopPropagation();
});
$('.md-select').on('click', function() {
  $(this).toggleClass('active')
});

$('.md-select ul li').on('click', function(event) {
  var v = $(this).text();
  $('.md-select ul li').not($(this)).removeClass('active');
  $(this).addClass('active');
  $('.md-select label button').text(v)
})

$(document).mouseup(function(e) {
  var container = $(".md-select");

  // if the target of the click isn't the container nor a descendant of the container
  if (!container.is(e.target) && container.has(e.target).length === 0) {
    container.removeClass('active');
  }
});

var filter = document.getElementById('filter');
var list = document.getElementById('ul-id');
var listItems = list.querySelectorAll('li');

//filter.focus();

filter.addEventListener('keyup', function(e) {
  var val = new RegExp(e.target.value, 'gi');
  for (var i = 0; i < listItems.length; i++) {
    if (e.target.value.length > 0) {
      var text = listItems[i].innerHTML;

      if (!text.match(val)) {
        listItems[i].classList.add('is-hidden');
      } else {
        listItems[i].classList.remove('is-hidden');
      }
    } else {
      listItems[i].classList.remove('is-hidden');
    }

  }
});
.md-select ul::-webkit-scrollbar {
  width: 12px;
}

.md-select ul::-webkit-scrollbar-track {
  -webkit-box-shadow: none !important;
  -webkit-border-radius: 0 !important;
  border-radius: 0 !important;
  background: #fff;
}

.md-select ul::-webkit-scrollbar-thumb {
  -webkit-border-radius: 0 !important;
  border-radius: 0 !important;
  background: rgb(242, 124, 37) !important;
  height: 30px;
}

.md-select {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  display: block;
  margin: 10px 0 8px 0;
  padding-bottom: 2px;
  max-width: 400px;
  width: 100%;
  z-index: 999;
}

.md-select *,
.md-select :after,
.md-select :before {
  box-sizing: border-box;
}

.md-select [type=button] {
  background: #333;
  color: #fff;
  cursor: default;
  display: block;
  line-height: 48px;
  padding: 2px 0 1px 16px;
  position: relative;
  text-align: left;
  text-shadow: none;
  width: 100%;
  z-index: 1;
  outline: none;
  overflow: hidden;
  border: none;
  border-bottom: 3px solid #000;
}

.md-select.overview [type=button] {
  color: #000;
  border-bottom: 3px solid #f27c25;
}

.md-select.overview ul[role=listbox] {
  border: none;
}

.md-select.overview.active ul {
  border: 2px solid #f27c25;
}

.md-select [type=button]:focus,
.md-select [type=button]:hover {
  background: rgba(0, 0, 0, 0.1);
}

.md-select [type=button]:after {
  content: '\25be';
  float: right;
  padding-right: 16px;
  color: #000;
}

.md-select ul[role=listbox] {
  cursor: default;
  list-style: none;
  line-height: 26px;
  overflow: hidden;
  margin: 0;
  max-height: 0;
  position: absolute;
  padding: 0;
  -webkit-transform: translateY(-50%);
  transform: translateY(-50%);
  transition: all 0.15s cubic-bezier(0.35, 0, 0.25, 1);
  width: 100%;
  border: 2px solid #f27c25;
  box-shadow: none !important;
  padding: 0 !important;
}

.md-select ul[role=listbox] li {
  height: 48px;
  margin: 0;
  padding: 10px 16px;
  outline: none;
  overflow: hidden;
  border-bottom: 2px solid #f27c25 !important;
  border-right: 2px solid #f27c25;
  background: #fff;
  z-index: 999;
  position: relative;
  color: #000;
}

.md-select ul[role=listbox] li:nth-last-of-type(1) {
  border-bottom: 0;
}

.md-select ul[role=listbox] li:focus,
.md-select ul[role=listbox] li:hover,
.md-select ul[role=listbox] li.active {
  background: #fff;
}

.md-select.active ul {
  max-height: 240px;
  overflow: auto;
  padding: 8px 0 16px 0px;
  z-index: 2;
  transition: all 0.2s ease;
}

.searchFilter {
  height: 48px;
  margin: 0;
  padding: 10px 16px;
  outline: none;
  overflow: hidden;
  border: 2px solid #f27c25 !important;
  background: #fff;
  z-index: 999;
  position: relative;
  color: #000;
  width: 100%;
  border-left: 0 !important;
}

ul#ul-id li.is-hidden {
  display: none;
}