【问题标题】:onblur on input field makes popup unclickable输入字段上的 onblur 使弹出窗口不可点击
【发布时间】:2022-01-25 01:35:45
【问题描述】:

    function showSuggestions(){
        let searchableModulesDiv = document.getElementById('searchableModules');
        searchableModulesDiv.classList.remove('d-none');
    }

    function hideSuggestions(){
        let searchableModulesDiv = document.getElementById('searchableModules');
        searchableModulesDiv.classList.add('d-none');
    }
    
    function filterSuggestions() {
        
    }
.prj-searchable-modules{
    position:fixed;
    margin-top: 70px;
    z-index: 2;
    width:100%;
}

.d-none {
    display: none;
}
<form id="searchBar" class="w-100 d-inline-flex">
    <!-- ... icons, labels, etc -->
    <input type="text" class="form-control" id="searchInput" placeholder="Module search..."
           onfocus="showSuggestions();" onblur="hideSuggestions();" onkeyup="filterSuggestions();">
</form>

<div id="searchableModules" class="card shadow-sm border-secondary rounded-3 prj-searchable-modules d-none">
  <ul class="nav flex-column">
    <li class="nav-item text-start">
      <a class="nav-link" href="calendar.html">
        <i class="fas fa-calendar-alt fa-fw"></i><span class="ps-3">Calendar</span></a>
    </li>
    <!-- ... more li items -->
  </ul>
</div>

我的网站上有一个快速搜索栏,点击后会显示一个可链接的列表。

我面临的问题是点击链接什么也没做,那是因为我认为一旦我点击链接搜索栏就会失去焦点,所以实际的“点击”发生在链接已经消失之后。

欢迎提出任何建议,即使是不同的方法(可能不使用外部插件)。

我目前正在使用 Bootstrap 5 和纯 JS。

【问题讨论】:

    标签: javascript html css input onblur


    【解决方案1】:

    您可以使用setTimeout 推迟点击事件后的隐藏。此外,如果您不想在单击某个项目时隐藏列表,那么您可以简单地为模糊添加一个条件。

    function showSuggestions(){
            let searchableModulesDiv = document.getElementById('searchableModules');
            searchableModulesDiv.classList.remove('d-none');
        }
    
        function hideSuggestions(){
            setTimeout(() => {
                let searchableModulesDiv = document.getElementById('searchableModules');
                searchableModulesDiv.classList.add('d-none');
            }, 100);
        }
        
        function filterSuggestions() {
            
        }
    .prj-searchable-modules{
        position:fixed;
        margin-top: 70px;
        z-index: 2;
        width:100%;
    }
    
    div.d-none > #searchableModules {
        display: none;
    }
    <form id="searchBar" class="w-100 d-inline-flex">
        <!-- ... icons, labels, etc -->
        <input type="text" class="form-control" id="searchInput" placeholder="Module search..."
               onfocus="showSuggestions();" onblur="hideSuggestions();" onkeyup="filterSuggestions();">
    </form>
    
    <div id="searchableModules" class="card shadow-sm border-secondary rounded-3 prj-searchable-modules" onclick="console.log('clicked'); hideSuggestions();">
      <ul class="nav flex-column">
        <li class="nav-item text-start">
          <a class="nav-link" href="#">
            <i class="fas fa-calendar-alt fa-fw"></i><span class="ps-3">Calendar</span></a>
        </li>
        <!-- ... more li items -->
      </ul>
    </div>

    【讨论】:

    • 谢谢,我可以立即实施非常简单的解决方案。我已经尝试了 100 的超时,但它仍然什么都不做,但是将它增加到 500 使它工作。这可能会产生问题吗?
    • @GiLA3 我们永远不能排除将来遇到问题的可能性。我们需要应用的想法是在每个主流浏览器中测试所有可能的东西,试图打破它。如果你不设法打破它,那么它就起作用了。当列表消失时,您还可以有一个 CSS 动画。如果您遇到问题,那么您将不得不切换到替代方案或调整。幸运的是,您可能会发现任何问题都可以进行调整,但如果您确实需要切换到其他解决方案,那么还有其他选择。
    【解决方案2】:

    如果您将搜索栏和搜索模块放在同一个父元素中,则可以只使用 CSS。

    .search-ctr:focus-within #searchableModules {
        display:block;
    }
    
    #searchableModules {
        display: none;
    }
    
    <div class='search-ctr'>
        <form id="searchBar" class="w-100 d-inline-flex">
        <!-- ... icons, labels, etc -->
        <input type="text" class="form-control" id="searchInput"        placeholder="Module search..."
               onfocus="showSuggestions();" onblur="hideSuggestions();" onkeyup="filterSuggestions();">
    </form>
    
    <div id="searchableModules" class="card shadow-sm border-secondary rounded-3 prj-searchable-modules d-none">
      <ul class="nav flex-column">
        <li class="nav-item text-start">
          <a class="nav-link" href="calendar.html">
            <i class="fas fa-calendar-alt fa-fw"></i><span class="ps-3">Calendar</span></a>
        </li>
        <!-- ... more li items -->
      </ul>
    </div>
    

    【讨论】:

    • 感谢您的宝贵时间,我在研究中的某个地方看到了该解决方案,但由于某种原因它不适用于我的案例。我有一个
      已经包装了这两个元素,但添加你的 search-ctr 类并没有产生预期的行为
    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多