监听键盘鼠标事件

监听某个按键事件

当键盘上的某个键被按下时,会依次触发一次下面的事件:

  • onkeydown: 键盘按下这个动作(按下键盘)
  • onkeypress: 键盘被按住(一直按着键盘不动)
  • onkeyup: 键盘被弹起(松开键盘)

通过监听keydown事件既可以知道键盘被按下:

  1. document.onkeydown = function(event) {
  2. // 键盘按下时触发
  3. console.log('key down');
  4. };
  5. document.onkeypress = function(event) {
  6. // 键盘按住时触发
  7. console.log('key press');
  8. };
  9. document.onkeyup = function (event) {
  10. // 键盘弹起时触发
  11. console.log('key up');
  12. };
  13. // 控制台数据的顺序为:key down -> key press -> key up

注意到键盘按下的event参数,该参数为KeyboardEvent事件对象,其中包含按键相关的一些属性。其中:

  • type: 事件类型,如'keydown'或者'keyup'
  • key: 表示按下的键盘内容是什么即键值,按下字母'p'时,值为'p'
  • code: 表示键盘代码,按下字母'p'时,值为'KeyP'
  • keyCode(过时): 整数,表示键码,每个键都有唯一的键码,字母'p'的键码为80
  • altKey: 布尔值,表示此时的alt键是否也按下
  • ctrKey: 布尔值,表示此时的alt键是否也按下
  • shiftKey: 布尔值,表示此时的shift键是否也按下
  • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下
  • repeat: 布尔值,如果一个键一直被按着,则其值为true,表示重复

可以通过检查这些属性来判断用户按下的是什么键,以及是否ctrl和alt等键是否同时按下。

  1. document.onkeydown = function(event) {
  2. // 键盘按下是触发
  3. console.log('key down: ' + event.key);
  4. if (event.altKey) {
  5. console.log('alt is active');
  6. }
  7. if (event.shiftKey) {
  8. console.log('shift is active');
  9. }
  10. };

监听鼠标事件

相应的也可以监听鼠标相关的事件,触发时的参数eventMouseEvent对象类型:

  • onclick: 鼠标点击事件
  • ondblclick: 鼠标双击事件
  • onmousedown: 鼠标上的按钮被按下了
  • onmouseup: 鼠标按下后松开时触发的事件
  • onmousemove: 鼠标移动时触发的事件
  • onmouseout: 鼠标离开监听该事件的元素或子元素时触发的事件
  • onmouseover: 鼠标移动到监听该事件的元素或子元素时触发的事件
  • onmousewheel: 鼠标滚轮事件,一般使用onscroll事件

MouseEvent对象中包含下面比较有用的属性:

  • type: 事件类型,如'mosemove'或者'mousedown'
  • button: 整型,触发鼠标事件时按下的按钮编号
  • buttons: 整型,触发鼠标事件时弹起来的按钮编号
  • clientX: 鼠标指针在DOM内容区的X坐标
  • clientY:鼠标指针在DOM内容区的Y坐标
  • offsetX: 鼠标指针相对父节点填充边缘的X坐标
  • offsetY: 鼠标指针相对父节点填充边缘的Y坐标
  • screenX: 鼠标指针在全局屏幕的X坐标
  • screenY: 鼠标指针在全局屏幕的Y坐标
  • pageX: 鼠标指针在整个DOM内容(包括分页)的X坐标
  • pageY: 鼠标指针在整个DOM内容(包括分页)的Y坐标
  • altKey: 布尔值,表示此时的alt键是否也按下
  • ctrKey: 布尔值,表示此时的alt键是否也按下
  • shiftKey: 布尔值,表示此时的shift键是否也按下
  • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下

通过鼠标事件的event属性,可以获取鼠标点击的位置,这里有对各种坐标的相关介绍,鼠标点击时是否按住ctrl等。

监听连续的按键事件实现秘笈开启

在很多游戏中,都有隐藏的秘笈,比如上上下下左左右右BABA这样的秘笈,那么怎么在网页监听事件,能够知道用户是按下了这个秘笈呢?(才不是要在隐藏什么奇怪的东西才用这个的>_<)演示地址(输入秘笈真的有惊喜!):http://asset.uusama.com/example/keycode.html

实现的方法就是用一个数组来记录连续按键的状态,每次按键正确则匹配下一个,直到所有匹配成功,看下面代码:

  1. // 上上下下左左右右BABA的键值
  2. const secretKey = ['up', 'up', 'down', 'down', 'left', 'left', 'right', 'right', 'b', 'a', 'b', 'a'];
  3. // 秘笈的键码
  4. const secretKeyCode = [38, 38, 40, 40, 37, 37, 39, 39, 66, 65, 66, 65];
  5. // 当前按键匹配的状态
  6. let secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0);
  7. // 当前正确秘笈按键的索引
  8. // let correctCodeIndex = 0;
  9. const CORRECT_STATUS = 1; // 表示正确匹配按键的状态
  10. document.onkeydown = function(event) {
  11. // 查找第一个0的位置,即当前按键应该匹配的位置
  12. let correctCodeIndex = secretKeyCodeStatus.lastIndexOf(CORRECT_STATUS);
  13. correctCodeIndex = correctCodeIndex === -1 ? 0 : correctCodeIndex + 1;
  14. // 如果所有的按键都正确,则返回
  15. if (correctCodeIndex > secretKeyCode.length) {
  16. alert('你成功打开了秘笈!通往哲♂学♂之路啊,我命令你开启吧!');
  17. return true;
  18. }
  19. // 如果本次按键正确,则记录
  20. if (event.keyCode === secretKeyCode[correctCodeIndex]) {
  21. console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' --correct,index:' + correctCodeIndex);
  22. // 所有按键都正确则成功
  23. if (correctCodeIndex + 1 === secretKeyCodeStatus.length) {
  24. alert('你成功打开了秘笈!通往哲♂学♂之路啊,我命令你开启吧!');
  25. // 重置状态
  26. secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0);
  27. return true;
  28. } else {
  29. // 否则记录当前按键成功
  30. secretKeyCodeStatus[correctCodeIndex] = CORRECT_STATUS;
  31. }
  32. } else {
  33. console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' --reset');
  34. // 按键错误则重置
  35. secretKeyCodeStatus = new Array(secretKeyCode.length).fill(0);
  36. }
  37. };

模拟键盘和鼠标事件

上面我们说明了如何监听页面的按键和键盘事件,但是有的时候我们需要使用代码模拟按钮操作。

比如看到很多图片的时候,我们需要批量下载,这个时候可以打开控制台,写一段JS代码批量模拟下载步骤即可,而不用一个一个的手动点击,非常方便。

模拟鼠标点击

最简单的就是模拟点击了,我们只需要选中一个元素,然后执行click函数即可。

下面的代码实现在一个表格中,点击每一个图片。

  1. const images = document.getElementById('content').getElementsByTagName('img');
  2. for (let image of images) {
  3. images.click();
  4. }

如果要模拟鼠标双击,或者鼠标移动,则没有简单的函数可以调用。这个时候我们需要新建一个MouseEvent对象,并手动触发即可。

创建MouseEvent对象的语法为:const event = new MouseEvent(typeArg, mouseEventInit);

  • typeArg为鼠标事件类型,即上面的监听鼠标事件去掉on后的字符串,

    • click: 鼠标点击事件
    • dblclick: 鼠标双击事件
    • mousedown: 鼠标上的按钮被按下了
    • mouseup: 鼠标按下后松开时触发的事件
    • mousemove: 鼠标移动时触发的事件
    • mouseout: 鼠标离开监听该事件的元素或子元素时触发的事件
    • mouseover: 鼠标移动到监听该事件的元素或子元素时触发的事件
  • mouseEventInitMouseEvent初始化的选项,指定鼠标事件的各种属性,可选值如下:
    • button: 整型,触发鼠标事件时按下的按钮编号
    • buttons: 整型,触发鼠标事件时弹起来的按钮编号
    • clientX: 鼠标指针在DOM内容区的X坐标
    • clientY:鼠标指针在DOM内容区的Y坐标
    • offsetX: 鼠标指针相对父节点填充边缘的X坐标
    • offsetY: 鼠标指针相对父节点填充边缘的Y坐标
    • screenX: 鼠标指针在全局屏幕的X坐标
    • screenY: 鼠标指针在全局屏幕的Y坐标
    • pageX: 鼠标指针在整个DOM内容(包括分页)的X坐标
    • pageY: 鼠标指针在整个DOM内容(包括分页)的Y坐标
    • altKey: 布尔值,表示此时的alt键是否也按下
    • ctrKey: 布尔值,表示此时的alt键是否也按下
    • shiftKey: 布尔值,表示此时的shift键是否也按下
    • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下

比如下面的示例在坐标200,200处触发一个鼠标双击事件:

  1. // 创建一个event对象
  2. const createEvent = new MouseEvent('dblclick', {
  3. clientX: 300,
  4. clientY: 300,
  5. });
  6. // 触发该事件
  7. document.dispatchEvent(createEvent);

可以使用任意的Document对象的dispatchEvent方法触发一个事件,这些触发的事件和实际发生的事件一模一样。

模拟键盘输入事件

和模拟鼠标事件一样,不过这儿我们要创建一个KeyboardEvent事件对象。

创建KeyboardEvent对象的语法类似为:const event = new KeyboardEvent(typeArg, KeyboardEventInit);

  • typeArg为键盘输入事件类型,即上面的监听键盘输入事件去掉on后的字符串,

    • keydown: 键盘按下这个动作
    • keypress: 键盘被按住
    • keyup: 键盘被弹起
  • KeyboardEventInitKeyboardEvent初始化的选项,指定键盘输入事件的各种属性,可选值如下:
    • type: 事件类型,如'keydown'或者'keyup'
    • key: 表示按下的键盘内容是什么即键值,按下字母'p'时,值为'p'
    • code: 表示键盘代码,按下字母'p'时,值为'KeyP'
    • keyCode(过时): 整数,表示键码,每个键都有唯一的键码,字母'p'的键码为80
    • altKey: 布尔值,表示此时的alt键是否也按下
    • ctrKey: 布尔值,表示此时的alt键是否也按下
    • shiftKey: 布尔值,表示此时的shift键是否也按下
    • metaKey: 布尔值,windows平台表示Window键是否同时按下,mac表示Command键是否同时按下
    • repeat: 布尔值,如果一个键一直被按着,则其值为true,表示重复

比如实现在按下字母'a'键时,自动按下'alt+ctrl+a'可以像下面实现。

  1. // 监听按键事件
  2. document.onkeydown = function(event) {
  3. console.log('keyCode: ' + event.keyCode + ' code: ' + event.code + ' alt:' + event.altKey);
  4. if (event.keyCode === 65 || event.code === 'KeyA') {
  5. // 如果按下的是a键,则新建一个a键按下的事件并触发
  6. const createEvent = new KeyboardEvent('keydown', {
  7. altKey: true,
  8. shiftKey: true,
  9. keyCode: 65,
  10. code: 'KeyA'
  11. });
  12. document.dispatchEvent(createEvent);
  13. }
  14. };

然后你就会发现上面的函数疯狂的输出A键被按下,哈哈哈!知道内存达到限制!

附录

最后附上键值和键码的对应关系对象,可以直接拷贝使用:

  1. const keyCodes = {
  2. 0: 'That key has no keycode',
  3. 3: 'break',
  4. 8: 'backspace / delete',
  5. 9: 'tab',
  6. 12: 'clear',
  7. 13: 'enter',
  8. 16: 'shift',
  9. 17: 'ctrl',
  10. 18: 'alt',
  11. 19: 'pause/break',
  12. 20: 'caps lock',
  13. 21: 'hangul',
  14. 25: 'hanja',
  15. 27: 'escape',
  16. 28: 'conversion',
  17. 29: 'non-conversion',
  18. 32: 'spacebar',
  19. 33: 'page up',
  20. 34: 'page down',
  21. 35: 'end',
  22. 36: 'home',
  23. 37: 'left arrow',
  24. 38: 'up arrow',
  25. 39: 'right arrow',
  26. 40: 'down arrow',
  27. 41: 'select',
  28. 42: 'print',
  29. 43: 'execute',
  30. 44: 'Print Screen',
  31. 45: 'insert',
  32. 46: 'delete',
  33. 47: 'help',
  34. 48: '0',
  35. 49: '1',
  36. 50: '2',
  37. 51: '3',
  38. 52: '4',
  39. 53: '5',
  40. 54: '6',
  41. 55: '7',
  42. 56: '8',
  43. 57: '9',
  44. 58: ':',
  45. 59: 'semicolon (firefox), equals',
  46. 60: '<',
  47. 61: 'equals (firefox)',
  48. 63: 'ß',
  49. 64: '@ (firefox)',
  50. 65: 'a',
  51. 66: 'b',
  52. 67: 'c',
  53. 68: 'd',
  54. 69: 'e',
  55. 70: 'f',
  56. 71: 'g',
  57. 72: 'h',
  58. 73: 'i',
  59. 74: 'j',
  60. 75: 'k',
  61. 76: 'l',
  62. 77: 'm',
  63. 78: 'n',
  64. 79: 'o',
  65. 80: 'p',
  66. 81: 'q',
  67. 82: 'r',
  68. 83: 's',
  69. 84: 't',
  70. 85: 'u',
  71. 86: 'v',
  72. 87: 'w',
  73. 88: 'x',
  74. 89: 'y',
  75. 90: 'z',
  76. 91: 'Windows Key / Left ⌘ / Chromebook Search key',
  77. 92: 'right window key',
  78. 93: 'Windows Menu / Right ⌘',
  79. 95: 'sleep',
  80. 96: 'numpad 0',
  81. 97: 'numpad 1',
  82. 98: 'numpad 2',
  83. 99: 'numpad 3',
  84. 100: 'numpad 4',
  85. 101: 'numpad 5',
  86. 102: 'numpad 6',
  87. 103: 'numpad 7',
  88. 104: 'numpad 8',
  89. 105: 'numpad 9',
  90. 106: 'multiply',
  91. 107: 'add',
  92. 108: 'numpad period (firefox)',
  93. 109: 'subtract',
  94. 110: 'decimal point',
  95. 111: 'divide',
  96. 112: 'f1',
  97. 113: 'f2',
  98. 114: 'f3',
  99. 115: 'f4',
  100. 116: 'f5',
  101. 117: 'f6',
  102. 118: 'f7',
  103. 119: 'f8',
  104. 120: 'f9',
  105. 121: 'f10',
  106. 122: 'f11',
  107. 123: 'f12',
  108. 124: 'f13',
  109. 125: 'f14',
  110. 126: 'f15',
  111. 127: 'f16',
  112. 128: 'f17',
  113. 129: 'f18',
  114. 130: 'f19',
  115. 131: 'f20',
  116. 132: 'f21',
  117. 133: 'f22',
  118. 134: 'f23',
  119. 135: 'f24',
  120. 144: 'num lock',
  121. 145: 'scroll lock',
  122. 160: '^',
  123. 161: '!',
  124. 162: '؛ (arabic semicolon)',
  125. 163: '#',
  126. 164: '$',
  127. 165: 'ù',
  128. 166: 'page backward',
  129. 167: 'page forward',
  130. 168: 'refresh',
  131. 169: 'closing paren (AZERTY)',
  132. 170: '*',
  133. 171: '~ + * key',
  134. 172: 'home key',
  135. 173: 'minus (firefox), mute/unmute',
  136. 174: 'decrease volume level',
  137. 175: 'increase volume level',
  138. 176: 'next',
  139. 177: 'previous',
  140. 178: 'stop',
  141. 179: 'play/pause',
  142. 180: 'e-mail',
  143. 181: 'mute/unmute (firefox)',
  144. 182: 'decrease volume level (firefox)',
  145. 183: 'increase volume level (firefox)',
  146. 186: 'semi-colon / ñ',
  147. 187: 'equal sign',
  148. 188: 'comma',
  149. 189: 'dash',
  150. 190: 'period',
  151. 191: 'forward slash / ç',
  152. 192: 'grave accent / ñ / æ / ö',
  153. 193: '?, / or °',
  154. 194: 'numpad period (chrome)',
  155. 219: 'open bracket',
  156. 220: 'back slash',
  157. 221: 'close bracket / å',
  158. 222: 'single quote / ø / ä',
  159. 223: '`',
  160. 224: 'left or right ⌘ key (firefox)',
  161. 225: 'altgr',
  162. 226: '< /git >, left back slash',
  163. 230: 'GNOME Compose Key',
  164. 231: 'ç',
  165. 233: 'XF86Forward',
  166. 234: 'XF86Back',
  167. 235: 'non-conversion',
  168. 240: 'alphanumeric',
  169. 242: 'hiragana/katakana',
  170. 243: 'half-width/full-width',
  171. 244: 'kanji',
  172. 251: "unlock trackpad (Chrome/Edge)",
  173. 255: 'toggle touchpad',
  174. };
  175. // 压缩之后的
  176. const keyCodesMin={0:"That key has no keycode",3:"break",8:"backspace / delete",9:"tab",12:"clear",13:"enter",16:"shift",17:"ctrl",18:"alt",19:"pause/break",20:"caps lock",21:"hangul",25:"hanja",27:"escape",28:"conversion",29:"non-conversion",32:"spacebar",33:"page up",34:"page down",35:"end",36:"home",37:"left arrow",38:"up arrow",39:"right arrow",40:"down arrow",41:"select",42:"print",43:"execute",44:"Print Screen",45:"insert",46:"delete",47:"help",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",58:":",59:"semicolon (firefox), equals",60:"<",61:"equals (firefox)",63:"ß",64:"@ (firefox)",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",91:"Windows Key / Left ⌘ / Chromebook Search key",92:"right window key",93:"Windows Menu / Right ⌘",95:"sleep",96:"numpad 0",97:"numpad 1",98:"numpad 2",99:"numpad 3",100:"numpad 4",101:"numpad 5",102:"numpad 6",103:"numpad 7",104:"numpad 8",105:"numpad 9",106:"multiply",107:"add",108:"numpad period (firefox)",109:"subtract",110:"decimal point",111:"divide",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",124:"f13",125:"f14",126:"f15",127:"f16",128:"f17",129:"f18",130:"f19",131:"f20",132:"f21",133:"f22",134:"f23",135:"f24",144:"num lock",145:"scroll lock",160:"^",161:"!",162:"؛ (arabic semicolon)",163:"#",164:"$",165:"ù",166:"page backward",167:"page forward",168:"refresh",169:"closing paren (AZERTY)",170:"*",171:"~ + * key",172:"home key",173:"minus (firefox), mute/unmute",174:"decrease volume level",175:"increase volume level",176:"next",177:"previous",178:"stop",179:"play/pause",180:"e-mail",181:"mute/unmute (firefox)",182:"decrease volume level (firefox)",183:"increase volume level (firefox)",186:"semi-colon / ñ",187:"equal sign",188:"comma",189:"dash",190:"period",191:"forward slash / ç",192:"grave accent / ñ / æ / ö",193:"?, / or °",194:"numpad period (chrome)",219:"open bracket",220:"back slash",221:"close bracket / å",222:"single quote / ø / ä",223:"`",224:"left or right ⌘ key (firefox)",225:"altgr",226:"< /git >, left back slash",230:"GNOME Compose Key",231:"ç",233:"XF86Forward",234:"XF86Back",235:"non-conversion",240:"alphanumeric",242:"hiragana/katakana",243:"half-width/full-width",244:"kanji",251:"unlock trackpad (Chrome/Edge)",255:"toggle touchpad",};

JavaScript键盘鼠标事件处理的更多相关文章

  1. 20个优秀的 JavaScript 键盘事件处理库

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  2. Qt Quick鼠标事件处理、键盘、计时器

    在<Qt Quick 事件处理之信号与槽>中介绍了 QML 中怎样使用内建类型的信号以及怎样自己定义信号,这次我们来看看怎样处理鼠标.键盘.定时器等事件.这些时间在处理时,一般是通过信号来 ...

  3. 20个优秀的JavaScript 键盘事件处理库

    键盘事件是 Web 开发中最常用的事件之一,通过对键盘事件的捕获和处理可以提高网站的易用性和交互体验.下面,我们向大家介绍收集的20款优秀的 JavaScript 键盘事件处理库,帮助开发人员轻松处理 ...

  4. 【repost】JavaScript 事件模型 事件处理机制

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  5. [转]理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  6. 理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  7. 理解JavaScript中的事件处理 阻止冒泡event.stopPropagation();

    原文地址:http://www.cnblogs.com/binyong/articles/1750263.html 这篇文章对于了解Javascript的事件处理机制非常好,将它全文转载于此,以备不时 ...

  8. JavaScript 事件模型 事件处理机制

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  9. 详解JavaScript中的事件处理

    在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后 ...

随机推荐

  1. Maven的安装步骤

    1.确保jdk安装成功,注意在系统环境下,必须添加jdk的路径.2.将maven的路径配置在系统环境变量中.3.修改maven的默认路径,即:将config下的settings.xml文件中的目录节点 ...

  2. 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总

    偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...

  3. Java8新特性之二:方法引用

    上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...

  4. ElasticSearch入门 附.Net Core例子

    1.什么是ElasticSearch? Elasticsearch是基于Lucene的搜索引擎.它提供了一个分布式,支持多租户的全文搜索引擎,它具有HTTP Web界面和无模式JSON文档. Elas ...

  5. 《阿里巴巴 Java开发手册》读后感

    前言 只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦). 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了.回到家才发现当时618 ...

  6. 前端ArcGIS学习之路-引言

    本系列主要关注ArcGIS Server以及ArcGIS API for Javascript,由于我本人是从前端方面向GIS方面学习,希望能够给更多需要了解GIS的程序员同学更多的参考.另外本系列会 ...

  7. Snapde一个全新的CSV超大文件编辑软件

    今天介绍如果数据量超过104万行Excel无法打开了,用什么软件可以打开呢?Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它在C++语言开发的Snapman多人协作电子 ...

  8. mt8665芯片怎么样?联发科mt8665芯片参数介绍

    MediaTek的MT8665是一款高度集成的LTE片上系统(SoC),它包含了先进的功能,例如LTE cat.4.Octa HMP核心在1.5GHz下工作.3D图形(OpenGLES 3.0).13 ...

  9. VMWare安装Mac系统后无法全屏显示的问题

    系统: VMTOOLs下载: 链接:https://pan.baidu.com/s/1KIzVWtPrb2vSrtokONToBw 提取码:zea3 1.虚拟机设置--显示器--监视器--指定监视器设 ...

  10. 我的Windows日常——鼠标无法进行拖拽的解决方法

    方法1: 鼠标右键单击任务栏 选择属性,进入任务栏和开始菜单属性 点击「开始」菜单  进入分页,单击自定义 找到并勾选启用上下文菜单和拖放 一路确定.... --------------------- ...