【问题标题】:Showing a div and keep it show() if i clicked on it如果我点击它,显示一个 div 并保持它 show()
【发布时间】:2017-12-12 03:36:15
【问题描述】:

$(document).ready(function() {
  $('#input').focusin(function() {
    if ($(this).val() != '') {
      $('#div').show();
    } else {
      $('#div').hide();
    }
    $('#input').keyup(function() {
      // If not empty value, show div
      if ($(this).val() != '') {
        $('#div').show();
      } else {
        $('#div').hide();
      }    
    });
  });
  $('#input').focusout(function() {
    $('#div').hide();

  });

});
#div {
  display: none;
  position: absolute;
  bottom: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='div'>
  <a href='website.com'>Link From AJAX<a>
  <a href='website.com'>Link From AJAX<a>
  <a href='website.com'>Link From AJAX<a>
</div>
<input id='input' type='text'>

在这个 jquery 代码中,#div 显示当我在#input 中输入内容时,但如果我尝试点击#div,它就会消失并且链接不起作用,

如果我只点击#div#input,我如何保持#div 显示,但外面的任何东西都会像往常一样隐藏它?

问题是由于CSS 中的position: absolute; bottom 20px 行引起的。

更新了代码,在.focusin function之后添加if语句后突然按预期工作,对于之前的错误解决方案,删除CSS中的position and bottom

【问题讨论】:

  • 在另一个事件处理程序中绑定一个事件处理程序几乎总是错误的。每次焦点进入输入时,您都会复制 keyup 处理程序。
  • @Barmar 我解决了我在更新中所说的问题,但是在添加AJAX 代码后我遇到了同样的问题,关于重复,我希望你能解释一下,因为有时如果我@ 987654337@input又返回了,div好像有新值或者刷新了自己,是这个意思吗?如果是的话,我也希望有办法解决这个问题。
  • 不要将解决方案放在问题中,将其作为答案发布。
  • @Barmar 这是已解决的问题的旧版本,我说吗?
  • 我不明白 AJAX 调用将如何阻止 $("#div").hide() 在输入失去焦点时发生。

标签: javascript jquery css ajax


【解决方案1】:

当你模糊输入时,检查当前活动元素是否是 DIV,如果不是则隐藏它。

另外,如果你要绝对定位一个元素,你需要给它一个 z-index 以便你可以点击它。否则,点击将发送到该位置的正常定位元素。

$(document).ready(function() {
  $('#input').focus(function() {
    if ($(this).val() != '') {
      $('#div').show();
    } else {
      $('#div').hide();
    }
  }).blur(function() {
    if (!$("#div").is(":focus,:active")) {
      $("#div").hide();
    }
  });
  $('#input').keyup(function() {
    // If not empty value, show div
    if ($(this).val() != '') {
      $('#div').show();
    } else {
      $('#div').hide();
    }
    var search = $('#input').val();
    $.post('search.php', {
      search: search
    }, function(data) {
      $('#div').html(data);
    });
  });
});
#div {
  display: none;
  position: absolute;
  bottom: 20px;
  z-index: 2;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='div'>
  <a href='www.someplace.com'>HellWorld</a>
</div>
<input id='input' type='text'>

【讨论】:

  • 是的,现在明白了,关于你谈到的两个主题。我已经更新了问题,问题似乎是CSS 中的position: absolute; bottom 20px;
【解决方案2】:

您可以通过使用标志来禁用focusout 处理程序的效果:

var noHide = false;
$(document).ready(function() {
  $('#input').keyup(function() {
    // If not empty value, show div
    if ($(this).val() != '') {
      $('#div').show();
    } else {
      $('#div').hide();
    }
  });
  $('#div a').hover(
    function() { noHide = true; },
    function() { noHide = false; $('#input').focus(); }
  );
  $('#input').focusout(function() {
    if(!noHide) {
      $('#div').hide();
    }
  });
});
#div {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='div'>
   <a href='#'>HellWorld</a>
</div>
<input id='input' type='text'>

【讨论】:

  • 您的回答对于第一个问题非常有效,但是正如我在更新中解释的那样,它与添加if 语句一起使用,但是现在出现了一个新问题,希望您检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2021-08-04
  • 2013-02-25
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多