【问题标题】:Jquery on click not working when focus is in a text box当焦点在文本框中时,Jquery on click 不起作用
【发布时间】:2016-03-03 04:01:28
【问题描述】:

我正在搜索框下方创建一个建议框。我想要它,以便当用户在搜索框中获得焦点,然后单击其中一个建议时,它会触发一个动作。我试过使用 jquery 的on:

$(".searchbox + div").on("click", "a", function() {
  $(".searchbox").val($(this).html());
});

我的 HTML 结构是这样的:

<input type="search" placeholder="Search" class="searchbox">
<div></div>

链接动态插入到输入后面的div 中。 链接没有href 值,所以它们不是真正的链接,我只是希望它们像链接一样。

当我单击其中一个链接时,搜索框失去焦点,并且由于我拥有的 css,链接得到visibility:hidden。我认为搜索框在触发链接操作之前失去焦点,所以它永远不会被触发。我该如何解决这个问题?

你可以看到here

澄清:我认为正在发生的事情:

  1. 用户点击链接

  2. 计算机认为,用户刚刚在搜索框外点击

  3. 搜索框变得模糊

  4. CSS 看到搜索框模糊,样式说现在提出建议visibility:hidden

  5. 现在链接不再可点击,因此永远不会触发事件。

【问题讨论】:

  • 当我搜索一个词并点击建议时,结果如预期般出现。我不确定那个页面有什么问题?
  • 尝试点击与当前查询不同的建议之一
  • 对我来说工作得很好 - 先到这里 calebeby.github.io/WordFinder/#google ,然后在侧边栏和底部分别选择一个......所有工作都按我的预期工作
  • 我说的是搜索框中的建议,如果您开始输入,而不是页面的其余部分。

标签: javascript jquery html css


【解决方案1】:

在您的代码中的某处,您有一个点击处理程序,它将搜索栏带到顶部,并将 UI 的其余部分显示在视图中。它在用户单击搜索栏以外的任何位置时执行。您应该在建议框中添加一条语句来检查单击的元素是否为&lt;a&gt; 元素。

所以如果这是点击处理程序。此外,我认为是时候在您的建议 div 中添加 id 了。

$(document).click(function(e){
    var $clicked = $(e.target);
    if($clicked.tagName == 'A' && $clicked.closest('#suggestionDivId').length>0)
        $(".searchbox").val($(this).html());
    else if(click was outside searchbar)
        //move searchbar up and show UI
    else
        //click happened inside searchbar, do nothing.
})

我不确定为什么没有人理解您的问题,或者为什么这个问题被否决。这是一个完全有效的问题。

编辑:

我建议用另一个 div 包装输入和建议 div。给这个包装器一个属性tabindex="-1",这样它就可以接收模糊/焦点事件。

<div id="wrapper">
<input type="search" placeholder="Search" class="searchbox">
<div></div>
</div>

然后将您的$(".searchbox").on("blur") 更改为$("#wrapper").on("blur")

这样您就可以点击建议框中的任意位置而不会触发模糊。

或者,mousedown 事件在 blur 事件之前触发。所以不妨试试这个

$(".searchbox + div").on("mousedown", "a", function() {
  $(".searchbox").val($(this).html());
});

【讨论】:

  • 我有 $(".searchbox").on("blur") 的内容。不过,消失的建议都是通过 css 触发的。即使首先模糊搜索框,我如何触发链接?
  • 我选择了mousedown,它成功了。非常感谢!
【解决方案2】:

您可以为此使用一些插件。它太容易了。例如,如果您使用任何前端框架(如 bootstrap),则可以使用 typeahead.js 插件

【讨论】:

  • 有没有办法在没有插件的情况下做到这一点?
  • 是的。您可以在没有插件的情况下使用。但是你必须使用ajax。仅 jquery 不足以自动完成搜索栏。
  • 我认为你没有理解我的问题。我已经提出了建议,但是当我单击它们时不起作用。 demo
猜你喜欢
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多