角度-iPhone/iPad上的ng模糊问题
Angular - issue with ng-blur on iPhone/iPad
我使用AngularJS 1.4.7
我有可编辑的输入。如果我们专注于输入,并且在该输入字段之外单击后,脚本将在ng-blur
中执行函数"save()"
。一切正常,但在iPhone 5/6
和iPad
上不工作(在ng-blur
中不执行任何内容)。我不知道为什么,但我推断问题出在focus/touch
的作用中。有人知道问题出在哪里?
在iOS中修复了ng blur不适用于空白空间和大多数元素的问题
目标
在我的应用程序中,我们希望在远离时隐藏打开的菜单或搜索结果菜单或搜索框。
问题
iOS Safari在单击离开当前元素时不会正确模糊。
注意
你不需要特别的指示。问题不在于ng模糊,它运行良好。问题是,无论你使用的是ng blur还是原生DOM blur事件,由于苹果在iOS上的不同寻常的设计,模糊事件永远不会发生。
问题原因
苹果公司设计了移动Safari,以不同于桌面浏览器的方式执行事件冒泡。根据苹果公司的官方文档,如果被点击的元素没有附加点击侦听器,那么就不会触发点击事件。如果没有单击事件,焦点不会改变,也不会发生模糊事件,因此即使用户确实单击了页面上的其他地方,当前元素也不会失去焦点。
只有当用户使用click事件监听器单击某个元素时,才会发生模糊。一些元素,如超链接和输入,具有用于单击的"内置"事件侦听器,因此将始终注册单击,从而导致模糊工作。
通常在桌面浏览器中,无论元素的DOM层次结构中是否存在注册的侦听器,都会盲目地触发单击事件。这就是为什么ng blur在桌面浏览器中可以像预期的那样工作,即使是在"空白空间"上。
苹果公司表示,对于iOS Safari,他们只有在找到注册监听元素的情况下才会发送事件。
苹果文档-转至图6-4
苹果的文档听起来像是在寻找一个注册的事件侦听器,并在目标元素上进行处理,但事实并非如此。我在下面的文章中找到了答案,更重要的是,其中一条评论
Quirksmode关于iOS事件委托的文章
首先,请注意,如果目标元素没有单击事件侦听器和处理程序,则在文档或正文上放置侦听器不会导致在iOS Safari上调度单击事件。它适用于大多数浏览器,但不适用于iOS。
在调度单击事件之前,Apple似乎正在检查DOM层次结构直到<body>
标记,但没有检查<body>
标记或更高标记。因此,您需要一个点击事件侦听器,该侦听器连接到<body>
下方的某个元素。
解决方案/解决方案
因此,解决方案非常简单。您所需要做的就是将所有页面内容包装在<body>
元素下方的"master"容器元素中,并将侦听器放在那里,而不是放在正文或文档上。它甚至可以是一个空的处理程序函数。苹果只是在检查一个是否注册。包装所有内容的原因是,无论用户单击页面的哪个位置,弹出过程最终都会到达主容器。
如果你这样做,那么ng-flur将在iOS中正常工作,因为当它找到父容器的点击事件监听器时,空空间上的点击事件(一个没有点击事件监听器的元素)将通过iOS检查,点击事件将像在任何其他浏览器中一样正常调度。
注意
该解决方案有效地使iOS Safari在每个DOM元素的层次结构上都看到一个点击事件侦听器,使其像普通浏览器一样在每个元素上调度点击事件。我不知道苹果是否有性能原因,他们在iOS中避免这样做,或者这只是一种美学/开发者类型的偏好(见示例)。您将使用此解决方法更改应用程序中的默认iOS行为。
例如,iOS用户可能会意外地在你的页面上选择他们并非有意的文本,如果没有点击并保持手势,通常不会发生这种情况。
我不知道为什么会出现这个问题。但要做一件事。创建一个小指令"伪模糊"。然后调用该指令中的方法
App.directive('fakeBlur', function(){
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.blur(function(){
// call you function ex:
scope.save();
})
}
}
});
<input type="text" fake-blur/>
- 模糊事件的Javascript测试
- ng映射方向备选方案
- AngularJS UI路由器不能像ng路由器那样工作
- 角度:在ng重复上切换图像
- 正在使用$location.path(.)路由ng视图
- AngularJS:ng之后,重复$scope值未按预期更新
- ng打开空字符串
- 我应该使用Ng提交还是点击表格
- ng init中的表达式无法使用ng repeat
- ng更改事件不适用于Dropdown
- 将事件聚焦/模糊在可编辑内容的元素上
- 当表单字段为空时,angularjs ng模糊
- 当我失去焦点时,不会触发ng模糊
- 在 ng 重复中进行内联编辑时,输入字段会模糊
- 在 ng 模糊上应用延迟
- 角度-iPhone/iPad上的ng模糊问题
- 使用手势服务时,角度指令未触发ng模糊
- ng模糊don't在firefox上用输入数字触发事件
- AngularJS:为ng重复中的最后一个元素添加ng模糊事件
- 使用ng模糊的输入验证(如果输入错误,请更改背景颜色)