Hibop.github.io icon indicating copy to clipboard operation
Hibop.github.io copied to clipboard

关于浏览器鼠标mouse事件和键盘key事件

Open Hibop opened this issue 7 years ago • 0 comments

键盘事件

  • keydown:按下键盘键
  • keypress:紧接着keydown事件触发(只有按下字符键时触发)
  • keyup:释放键盘键 顺序为:keydown -> keypress ->keyup 如果用户按下了一个字符键不放,就会重复触发keydown和keypress事件,直到用户松开该键为止

注意点

  • 键盘中的键 分为字符键 (可打印) 和 功能键 (不可打印)
  • keyCode 键码
  • charCode 字符编码
  • 在keyup 事件中无法阻止浏览器默认事件,因为在keypress时,浏览器默认行为已经完成,即将文字输入文本框(尽管这时还没显示),这个时候不管是preventDefault还是returnValue = false,都不能阻止在文本框中输入文字的行为,如要阻止默认行为,必须在keydown或keypress时阻止 外链

鼠标事件

  • mouseenter: 鼠标指针穿过被选元素边界,后代元素不会触发,对应leave该方法不会冒泡

  • mouseleave: 鼠标移出某个元素时触发, 后代元素不会触发, 该方法不会冒泡

  • mouseover:当鼠标经过被选元素和被选元素的子元素时都会触发mouseover事件,对应mouseout事件

  • mouseout:鼠标移出目标的上方。

  • mousemove:鼠标在目标的上方移动, 移动一个像素点都会,一般要节流。

  • hover: Jquery中

mousedown => mouseup => click

hover: function( fnOver, fnOut ) {
   return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}

hover是指分别当鼠标指针进入和离开元素时被执行的事件相当于mouseenter+mouseleave。而mouseover鼠标进入某个元素或其子元素时触发。

鼠标位置相关

通过鼠标在网页上的点击,我们还可以获得许多有用的参数,如获得当前鼠标的坐标。根据其参照物的不同,分为以下几套坐标系。一套是以当前浏览器的可视区为参照物(clientX, clientY),另一套是以显示器的屏幕为参照物(screenX, screenY)。此外微软还有一套坐标系(x,y),它是相对于触发事件的对象的offsetParent的,火狐有另一套坐标系(pageX, pageY),它是相对于当前网页的。我们可以通过如下函数来获得鼠标在网页的坐标。

var getCoordInDocument = function(e) {
  e = e || window.event;
  var x = e.pageX || 
    (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
  var y= e.pageY || 
    (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
  return {'x':x,'y':y};
}

光标控制

获取和修改光标位置

  const getCursorPosition = function(input) {
    if (!input) return; // No (input) element found
    if ("selectionStart" in input) {
      // Standard-compliant browsers
      return input.selectionStart;
    } else if (document.selection) {
      // IE
      input.focus();
      var sel = document.selection.createRange();
      var selLen = document.selection.createRange().text.length;
      sel.moveStart("character", -input.value.length);
      return sel.text.length - selLen;
    }
  };

  const setCursorPosition = function(input, pos) {
    if(input.setSelectionRange) {
      input.focus();
      input.setSelectionRange(pos);
    } else if(input.createTextRange) {
      var range = input.createTextRange();
      range.collapse(true);
      range.moveStart('character', pos);
      range.moveEnd('character', pos);
      range.select();
    }
  }

光标样式修改

input {
    color: #333;
    caret-color: red;
}

input框中相关事件

mousedown,mouseup,click,input,change,focus,blur,keydowm,keydown事件绑定到了input上面 点击: 先是鼠标按下 => 然后是focus => 鼠标抬起 => click; 输入: keydown => keyup => input =>change(焦点离开是触发) => blur

拖动算法

Hibop avatar Apr 18 '18 02:04 Hibop