在 iphone safari webapp 中隐藏键盘

Posted

技术标签:

【中文标题】在 iphone safari webapp 中隐藏键盘【英文标题】:hide keyboard in iphone safari webapp 【发布时间】:2011-02-22 19:55:09 【问题描述】:

我正在为 iPhone 创建一个基于 html/CSS/JS 的 webapp。我正在使用表单来接收输入并将数据传递给脚本,但我遇到的一个问题是键盘不会消失。用户将输入信息,点击提交,由于它是 javascript,页面不会重新加载。键盘保持在原位,这很麻烦,并且为用户增加了另一个步骤(必须关闭它)。

有什么方法可以强制 Safari 中的键盘消失?本质上,我觉得这个问题相当于问我如何强制输入框失去焦点或模糊。在网上看,我找到很多例子来检测模糊事件,但没有一个可以强制这个事件发生。

【问题讨论】:

我喜欢你在六年后重新访问这个以偷走我的​​ 15 分。 :-p 【参考方案1】:

对于在 AngularJs 中使用 Husky 代码的任何人,这里是重写:

function isTextInput(node) 
    return ['INPUT', 'TEXTAREA'].indexOf(node.nodeName) !== -1;


angular.element($document[0]).on('touchstart', function(e) 
  var activeElement = angular.element($document[0].activeElement)[0];
  if(!isTextInput(e.target) && isTextInput(activeElement)) 
    activeElement.blur();
  
);

【讨论】:

【参考方案2】:

我遇到了这个问题,并花了一些时间才得到满意的解决方案。我的问题与原始问题略有不同,因为我想在点击外部输入元素区域时关闭输入事件。

上述有目的的答案有效,但我认为它们并不完整,所以这是我的尝试,以防你登陆此页面寻找与我相同的东西:

jQuery 解决方案

我们将touchstart 事件侦听器附加到整个文档。当屏幕被触摸时(无论是点击、按住还是滚动)都会触发处理程序,然后我们将检查:

    触摸的区域是否代表输入? 输入是否集中?

鉴于这两个条件,我们然后触发blur() 事件以从输入中移除焦点。

ps:我有点懒所以只是从上面的响应中复制了这一行,但是如果你想保持代码的一致性,你可以使用 jQuery 选择器来获取文档

$(document).on('touchstart', function (e) 
  if (!$(e.target).is('.my-input') && $('.my-input').is(':focus')) 
    document.activeElement.blur();
  
);

Hammer.JS 解决方案

您也可以使用Hammer.JS 来处理您的触摸手势。假设您想在 tap 事件上关闭它,但如果用户只是滚动页面,则键盘应该在那里(或者说,按住文本选择,以便他可以复制并粘贴到您的输入区域)

在这种情况下,解决方案是:

var hammer = new Hammer(document.body);
hammer.on('tap', function(e) 
  if (!$(e.target).is('.search-input') && $('.search-input').is(':focus')) 
    document.activeElement.blur();
  
);

希望对你有帮助!

【讨论】:

【参考方案3】:

请务必在 CSS 中设置:

body 
  cursor: pointer;

否则,您调用document.activeElement.blur() 的事件处理程序将永远不会被触发。欲了解更多信息,请参阅:http://www.shdon.com/blog/2013/06/07/why-your-click-events-don-t-work-on-mobile-safari

【讨论】:

【参考方案4】:

要检测何时按下返回按钮,请使用:

$('input').bind('keypress', function(e) if(e.which === 13) document.activeElement.blur(); );

【讨论】:

【参考方案5】:
document.activeElement.blur();

【讨论】:

【参考方案6】:
$('input:focus').blur();

对焦点元素使用 CSS 属性,这会模糊当前具有焦点的任何输入,移除键盘。

【讨论】:

这是一个很好的答案,不幸的是其他两个使用纯JS的答案效率更高。 @Metagrapher 当然!我也确实犯了用 JQuery 回答非 jquery 问题的菜鸟错误;)【参考方案7】:

这是一个小代码 sn-p,只要焦点位于输入或文本区域字段中并且用户在该元素之外点击(桌面浏览器中的正常行为),它总是隐藏键盘。

function isTextInput(node) 
    return ['INPUT', 'TEXTAREA'].indexOf(node.nodeName) !== -1;


document.addEventListener('touchstart', function(e) 
    if (!isTextInput(e.target) && isTextInput(document.activeElement)) 
        document.activeElement.blur();
    
, false);

【讨论】:

太棒了,我可以想象这段奇妙的代码受到 web 应用程序和 phonegap 开发人员的极大追捧 这应该是答案。【参考方案8】:

更简单的是,您可以在当前聚焦的元素上调用 blur()。 $("#inputWithFocus").blur()

【讨论】:

最优雅!在 jQuery 中:$(this).blur()【参考方案9】:

您可以在非文本元素上尝试focus()ing,例如提交按钮。

【讨论】:

谢谢!像魅力一样工作(在 mootools 中,只需 $('id-of-submit-button').focus()) blur()、tap()、click()、focus() 在 ios 8+ 上无法解决这个问题 哦等等。我的问题不同。使用angularjs,页面过渡完成,并显示了一个新的框架。在新页面上,该命令无效,当返回原来导致 vkeyboard 的第 3 方 iframe 时,尽管没有调用文本输入,但键盘再次弹出。奇怪。 你是怎么解决这个@mojjj的? @Metagrapher 该问题是由客户的登录 iframe 引起的,在文本输入软键盘回车后没有散焦。 hacky 解决方案是:创建一个隐藏的(例如屏幕外)文本输入元素,在屏幕过渡到下一个屏幕之前对其进行聚焦和模糊。

以上是关于在 iphone safari webapp 中隐藏键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何在 safari 浏览器中直接打开 webapp?

iPhone Web App Div 标签在 Safari 中重新加载

添加到主屏幕时 iPhone webapp 中断

Chrome真机调试webapp

Chrome真机调试webapp

iPhone WebApp 添加到主屏幕后无法正常工作