在使用事件委托的方法时,我们将事件处理程序设置在更高级别的元素(父或祖父)上,但这在 iPad 的 Safari 上存在问题:如果父元素有点击处理程序,当用户触摸该元素内的任何内容时,整个区域将变灰(在 iOS 5.1 上)或闪烁(在 iOS 6 上)。
因此,如果父级或祖父级是 300 x 300 像素,而链接只是一个单词,比如 60 x 20 像素,那么当用户触摸父级内部的任何位置(链接除外)时,整个 300 x 300 区域将灰色或闪烁,具体取决于 iOS 版本。
这是一个示例: http: //jsfiddle.net/2K3TB/30/ ,它可以在物理设备或 iOS 模拟器上的带有 iOS 5.1 或 6 的 iPad Safari 上运行。
并且我尝试了Apple 文档中列出的所有事件,并且touchstart
可以监听,并且事件处理程序可以执行,preventDefault()
因此不会出现灰显或闪烁。示例: http: //jsfiddle.net/2K3TB/31/ 但是现在,将在文档顶部添加“ha”的链接不起作用。为了使它工作,我必须在链接上设置一个touchstart
处理程序以使链接工作:http: //jsfiddle.net/2K3TB/33/
这是解决灰显或闪烁问题的正确方法吗?还有其他方法吗?此方法存在问题,在此区域内,可能存在动态内容,例如链接、按钮、复选框、单选、选择或任何其他可能<div>
具有事件处理程序的内容,因此我无法设置touchstart
处理程序每个不可预知的元素。我也许可以使用类似的东西:
$("#container").on("touchstart", function(ev) {
if (ev.target.tagName.toLowerCase() !== "a") {
ev.preventDefault();
}
});
就像在http://jsfiddle.net/2K3TB/35/ 但是我必须检查所有<a>
, <input>
, <button>
, <select>
, 或任何可能绑定了事件处理程序的元素。所以这可能不是一个好的解决方案。有没有解决这个灰色或闪烁问题的好方法?
更新:查理在下面的回答效果很好,但也有一个问题:一旦我们设置了容器的 css 样式,<a>
或者任何其他可点击元素也从该样式继承,并且也变得透明。所以我不得不做类似的事情:
var tapHighlightColorStyle = $("#the-container").css("-webkit-tap-highlight-color");
$("#the-container").css("-webkit-tap-highlight-color", "transparent");
$("#the-container a").css("-webkit-tap-highlight-color", tapHighlightColorStyle);
也就是说,我必须先保存点击突出显示颜色,然后将容器设置为透明,然后将<a>
下面设置回使用该颜色。它适用于<a>
,我想知道其他元素怎么样,以及我是否应该使用它$("#the-container *")
来恢复它们,这可能效率低下。或者如果有更好的方法来处理这个问题。
顺便说一句,这是webkit CSS 样式的文档。我试图寻找一种不会被后代继承但似乎没有的类似风格。
更新2:似乎如果我们只是将孩子们设置回那种风格,那么就可以了,因为我们只向下一层,让后代从他们那里继承:
var tapHighlightColorStyle = $("#the-container").css("-webkit-tap-highlight-color");
$("#the-container").css("-webkit-tap-highlight-color", "transparent");
$("#the-container").children().css("-webkit-tap-highlight-color", tapHighlightColorStyle);