代理click事件在Mobile上的问题

 

  当一个容器的子元素不确定,或者很多时。为了省去在子元素上一一绑定事件的麻烦会直接在容器上绑定。因为很多事件都是可以从子元素上冒泡到容器上的。但这种做法在移动设备上会让元素的默认样式有点问题,因为touch操作对有事件监听的元素会有样式变化。
  先来看下面的例子运行<ul>
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
</ul>
<script>
//$("ul").on("click","li",function(){
// console.log(this.innerHTML);
//});
document.querySelector("ul").onclick=function(e){
if(e.target.tagName!="LI")return;
console.log(e.target.innerHTML);
}
</script>
e25b8fd83fab577e6eb94d81eb44c87f.png
89ada2539bfb1305316ad04399384304.png
  以上是在QQ浏览器和UC浏览器下触碰时的效果。我们更希望LI元素的样式改变,而不是UL元素改变吧?但这是做不到的,这是click的默认样式。所以,如果想更好地在移动设备上展示效果应该用toucu系列事件来代替click事件。
运行<ul>
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
</ul>
<style>
li:active {outline:2px solid rgba(0,0,255,0.3);}
</style>
<script>
var ul=document.querySelector("ul");
ul.addEventListener("touchstart",function(e){
var target=e.target;
if(target.tagName!="LI")return;
var i=setTimeout(function(){
ul.removeEventListener("touchend",touchend);
},500);
ul.addEventListener("touchend",touchend);
function touchend(e){
clearTimeout(i);
ul.removeEventListener("touchend",touchend);
if(target==e.target)
alert(e.target.innerHTML);
};
});
</script>
  这个代码看似很繁琐,实际上touchstart和touchend这一套动作可以封装起来做成一个touchtap之类的方法来模拟click,这样就不会带来样式上的影响了。

转载于:https://my.oschina.net/ajunCode/blog/727636

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值