要理解事件双重触发先要明白什么是事件穿透,所谓事件穿透就是利用click事件在移动设备上触发有300ms左右延迟的特性,我们可以在touchstart事件中快速移除当前层元素,让事件短时间内穿透到下层从而触发下层的click动画,请参考下图示意。
<!-- 事件穿透 --> <svg style="height:0;"> <rect> <animate attributeName="opacity" to="0" begin="click" dur="1s"> </animate> </rect> </svg> <svg> <rect> <animate attributeName="visibility" to="hidden" begin="touchstart" dur="0.001ms"> </animate> </rect> </svg>
<svg> <!-- 伸长动画 --> <animate attributeName="width" values="100%;100%;200%" begin="touchstart" fill="freeze" dur="0.75s" ></animate> <!-- 返回动画 --> <animate attributeName="width" values="200%;100%;100%" begin="click" fill="freeze" dur="0.75s" ></animate> </svg>当我们将这2段开关动画写在一起时,我们会发现系统只选择touchstart事件动画执行而选择性忽略了click事件动画,这是因为touchstart没有click事件的延迟,这就好比2个人前后脚到蛋糕店买蛋糕,而这时蛋糕店只剩下一块蛋糕,老板自然是会给先到店的那个人。