您如何检测“搜索”HTML5 输入的清除?

IT技术 javascript jquery html events dom-events
2021-03-15 09:51:33

在 HTML5 中,search输入类型会在右侧显示一个小 X 以清除文本框(至少在 Chrome 中,也许其他人中如此)。有没有办法检测何时在 Javascript 或 jQuery 中单击此 X,而不是检测何时单击框或进行某种位置单击检测(x 位置/y 位置)?

6个回答

实际上,每当用户搜索或用户单击“x”时都会触发“搜索”事件。这特别有用,因为它理解“增量”属性。

现在,话虽如此,我不确定您是否能分辨出单击“x”和搜索之间的区别,除非您使用“onclick”技巧。无论哪种方式,希望这会有所帮助。

Dottoro 网站参考

“搜索”事件是非标准的。看到这个我不建议在没有 poly-fill 的情况下使用它。
2021-04-25 09:51:33
谢谢,search除了单击“x”之外,无法确定事件何时发生。它似乎没有触发keyupblur或者在提交它所在的表单时。但这值得被标记为答案。
2021-04-30 09:51:33
search事件应该在用户按下 时触发Enter如果搜索框具有该incremental属性,它也会在用户停止输入一秒钟时触发。
2021-04-30 09:51:33
仅供参考:在撰写此评论时,这仅适用于 Chrome。
2021-05-02 09:51:33
IE11 触发input事件但不触发search事件。
2021-05-10 09:51:33

绑定-search事件搜索框,如下所示-

$('input[type=search]').on('search', function () {
    // search logic here
    // this function will be executed on click of X (clear button)
});
这是不确定的人的正确答案
2021-04-28 09:51:33
很高兴知道 Chrome 支持搜索事件,但 IE 或 FF 不支持,根据 MDN,它是一个非标准功能,不在标准轨道上。developer.mozilla.org/en-US/docs/Web/Events/search
2021-05-13 09:51:33

我想添加一个“迟到”的答案,因为我挣扎changekeyupsearch今天,也许是我最后发现可能对他人有用的。基本上,我有一个搜索类型面板,我只是想对小 X 的按下做出正确的react(在 Chrome 和 Opera 下,FF 没有实现它),并因此清除内容窗格。

我有这个代码:

 $(some-input).keyup(function() { 
    // update panel
 });

 $(some-input).change(function() { 
    // update panel
 });

 $(some-input).on("search", function() { 
    // update panel
 });

(它们是分开的,因为我想检查每个调用的时间和情况)。

事实证明,Chrome 和 Firefox 的react不同。特别是,Firefox 将其change视为“对输入的每次更改”,而 Chrome 将其视为“当焦点丢失且内容更改时”。因此,在 Chrome 上,“更新面板”功能被调用一次,每次击键时在 FF 上调用两次(一个 in keyup,一个 in change

此外,使用小 X 清除字段(FF 下不存在)会search在 Chrome下触发事件: no keyup, no change

结论?使用input来代替:

 $(some-input).on("input", function() { 
    // update panel
 }

它在我测试过的所有浏览器下以相同的行为工作,对输入内容的每次更改做出react(使用鼠标复制粘贴、自动完成和“X”)。

从那以后,Firefox 似乎改变了它的行为?我使用 Firefox 42.0 进行了测试,它change像 Chrome 一样处理事件,仅在 Enter 或焦点丢失时触发。
2021-05-02 09:51:33
我喜欢输入选项...很好!
2021-05-04 09:51:33
厉害,简直厉害。非常感谢节省了我尝试解决这个问题的时间。
2021-05-07 09:51:33
谢谢洛伦佐……这很有帮助。
2021-05-11 09:51:33

使用 Pauan 的回应,这几乎是可能的。前任。

<head>
    <script type="text/javascript">
        function OnSearch(input) {
            if(input.value == "") {
                alert("You either clicked the X or you searched for nothing.");
            }
            else {
                alert("You searched for " + input.value);
            }
        }
    </script>
</head>
<body>
    Please specify the text you want to find and press ENTER!
    <input type="search" name="search" onsearch="OnSearch(this)"/>
</body>
对我来说,该change事件直到blur基本上不会触发只需单击(x)Chrome 搜索字段内的 ,似乎不会为我触发任何事件。经过进一步调查(并阅读下面的评论)后,我开始click为我工作。所以$("input[type='search']").bind('click', function(e) { if ( this.value=="") {//this just cleared!} });对我有用
2021-04-19 09:51:33
$("input[type='search']").bind('click', function(e) { if ( this.value=="") {//this just cleared!} });也会在用户点击输入字段时触发。
2021-05-13 09:51:33

简单易读且简短的解决方案

哇,对于一个非常简单的问题,这里有一些非常复杂的答案。

只需'input'在您的搜索输入上添加一个侦听器,当用户在输入中键入内容单击清除图标时,它将捕获该侦听器

document.getElementById('searchInput').addEventListener('input', (e) => {
  console.log(`Input value: "${e.currentTarget.value}"`);
})
<input id="searchInput" type="search" placeholder="Search" />

如果您不能使用 ES6+,那么这里是为您转换的代码:

document.getElementById('searchInput').addEventListener('input', function(e) { 
  // Yay! You make it in here when a user types or clicks the clear icon
})` 
@Jason 确实如此。当有人单击 X 时,该值为空,因此只需检查长度。document.getElementById('searchInput').addEventListener('input', function (e) { let length = $(this).val().length; });
2021-05-10 09:51:33
谢谢你,但它实际上并没有回答这个问题!是的,您可以使用您的方法来确定后面的值input是否为空字符串,但您不一定确定有人单击了 X。如果您想在用户单击 X 时专门做某事,您的答案并不能解决它:)
2021-05-16 09:51:33