加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

fastclick 源码注解及一些基础知识点

发布时间:2016-11-02 06:12:26 所属栏目:教程 来源:站长网
导读:副标题#e# 在移动端,网页上的点击穿透问题导致了非常糟糕的用户体验。那么该如何解决这个问题呢? 问题产生的原因 移动端浏览器的点击事件存在300ms的延迟执行,这个延迟是由于移动端需要通过在这个时间段用户是否两次触摸屏幕而触发放大屏幕的功能。那么

不做任何处理的执行及效果:

document.querySelector('.div-inside').addEventListener('click',function(e){
  console.log("inside first print");
},!1);
document.querySelector('.div-inside').addEventListener('click',function(e){
  console.log("inside second print");
},!1);
document.querySelector('.div-outside').addEventListener('click',function(e){
  console.log("outside");
},!1);
document.body.addEventListener('click',function(e){
  console.log("body");
},!1);

// 输出
/* 
 * inside first print
 * inside second print
 * outside 
 * body
*/

Event.stopPropagation执行及效果:

document.querySelector('.div-inside').addEventListener('click',function(e){
  e.stopPropagation();
  console.log("inside first print");
},!1);
document.querySelector('.div-inside').addEventListener('click',function(e){
  console.log("inside second print");
},!1);
document.querySelector('.div-outside').addEventListener('click',function(e){
  console.log("outside");
},!1);
document.body.addEventListener('click',function(e){
  console.log("body");
},!1);

// 输出
/* 
 * inside first print
 * inside second print
*/

Event.stopImmediatePropagation执行及效果:

document.querySelector('.div-inside').addEventListener('click',function(e){
  e.stopImmediatePropagation();
  console.log("inside first print");
},!1);
document.querySelector('.div-inside').addEventListener('click',function(e){
  console.log("inside second print");
},!1);
document.querySelector('.div-outside').addEventListener('click',function(e){
  console.log("outside");
},!1);
document.body.addEventListener('click',function(e){
  console.log("body");
},!1);

// 输出
/* 
 * inside first print
*/

参考文档:

MDN Event.stopPropagation

MDN Event.stopImmediatePropagation

Window.getSelection()

该方法返回一系列选择文本的参数,如选择范围,字符当前索引等

html:

<div class="text first-text">hello world!</div>
<div class="text second-text">hello world!</div>

js:

var elems = document.querySelectorAll('.text');
var len = elems.length;
while(len){
  elems[len-1].addEventListener('mouseup',function(){
    console.log(window.getSelection());
  },!1);
  len--;
}

效果:

fastclick 源码注解及一些基础知识点

如上图所示,参数有:

    · anchorNode:选择范围开始的node

    · anchorOffset:anchorNode中的起始索引

    · focusNode:选择范围结束的node

    · focusOffset:focusNode中的结束索引

    · isCollapsed:起始和结束是否在一个点,返回true/false

    · rangeCount:选择段的段数,貌似一直为1段,尝试按住shift选择多段,然而并不行

    · type:操作类型,如:选择:Range,插入符:Caret(input中) 等情况...

    · 其他暂时不去深究,嘿嘿!!!

 参考文档:

 MDN Window.getSelection()

 事件操作 --- 创建 -> 配置 -> 派遣

 如needsClick里的代码,创建一次不带任何handle的click事件,然后将该事件在指定元素上触发,以触发该元素上的同类型事件。

 html:

<div id="click-one">click-one</div>
<div id="click-two">click-two</div>

比如,点击click-one,给click-two创建个click事件并执行,用以触发click-two上我们写的点击事件。

··· 方式一(MDN并不推荐,标明被移出web标准):

        Document.creatEvent();

        MouseEvent.initMouseEvent();

        EventTarget.dispatchEvent();

js:

document.getElementById('click-one').addEventListener('click',function(e){
  console.log("click-one");
  var evt = document.createEvent('MouseEvents');
  evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
  document.getElementById('click-two').dispatchEvent(evt);
},!1);
document.getElementById('click-two').addEventListener('click',function(e){
  console.log("click-two");
},!1);

/*
语法.参数,值得注意的是最后一个参数,相关标签,mouseover和mouseout使用,其他情况传null
event.initMouseEvent(type, canBubble, cancelable, view,
                     detail, screenX, screenY, clientX, clientY,
                     ctrlKey, altKey, shiftKey, metaKey,
                     button, relatedTarget);
*/

···方式二(MDN推荐,但貌似兼容性暂时捉急):

    new Event();

    EventTarget.dispatchEvent(); 

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读