当前位置:   article > 正文

H5之12__触摸与单击:基本的事件处理_h5 移动端点击事件

h5 移动端点击事件

 在HTML5中,  如果基于鼠标的界面互动是单击, 触摸界面的基本交互方式就是 轻触.

一.  轻触与单击有相似之处, 但是也有不同.

即使触摸设备(例如: 手机) 没有鼠标,它们的浏览器仍然会触发鼠标事件, click, mouseover,  mousedown 和 mouseup 都还会被触发。

二.  移动浏览器有四种类型的触摸事件

事件名称 描述包含touches 数组
touchstart触摸开始
touchmove接触点改变
touchend触摸结束
touchcancel触摸被取消

touches 数组 是一组触摸事件所产生的触摸对象,  触摸对象代表着触摸屏幕的手指。

三. 处理触摸事件

第一种方式,使用浏览器支持的标准触摸事件, 看一个示例 index.html :

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width">
  7. <title>Touch</title>
  8. <style type="text/css" media="screen">
  9. body {
  10. margin: 0;
  11. padding: 0;
  12. font-family: sans-serif;
  13. text-align: center;
  14. }
  15. .button {
  16. font-size: 16px;
  17. padding: 10px;
  18. font-weight: bold;
  19. border: 0;
  20. color: #fff;
  21. border-radius: 10px;
  22. box-shadow: inset 0px 1px 3px #fff, 0px 1px 2px #000;
  23. background: #ff3019;
  24. opacity: 1;
  25. }
  26. .active, .button:active {
  27. box-shadow: inset 0px 1px 3px #000, 0px 1px 2px #fff;
  28. }
  29. .hidden {
  30. display: none;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <div id="touchme">
  36. <button class="button" id="toggle">切换图片</button>
  37. <div class="hidden" style="display: none">
  38. <p>Goldfinch by ibm4381 on Flickr</p>
  39. <a href="http://www.flickr.com/photos/j_benson/3504443844/"
  40. title="Goldfinch by ibm4381, on Flickr">
  41. <img src="http://img1.2345.com/duoteimg/qqTxImg/2012/04/09/13339510584349.jpg"
  42. width="320" height="256" alt="Goldfinch">
  43. </a>
  44. </div>
  45. </div>
  46. </body>
  47. <script type="text/javascript" charset="utf-8">
  48. var node = document.getElementById('toggle');
  49. function togglePicture(){
  50. var h = document.querySelector(".hidden");
  51. if(h.style.display == "none") {
  52. h.style.display = "block";
  53. } else {
  54. h.style.display = "none";
  55. }
  56. }
  57. node.addEventListener('touchstart', function(e){
  58. alert("touchstart");
  59. //阻止事件的默认行为导致按钮不会出现活跃状态(active)
  60. // e.preventDefault();
  61. e.target.className = "active button";
  62. togglePicture();
  63. });
  64. node.addEventListener('touchend', function(e){
  65. //e.preventDefault();
  66. e.target.className = "button";
  67. });
  68. node.addEventListener("click", function(e){
  69. alert("click");
  70. });
  71. </script>
  72. </html>
http://img1.2345.com/duoteimg/qqTxImg/2012/04/09/13339510584349.jpg" width="320" height="256" alt="Goldfinch"> </a> </div> </div> </body> <script type="text/javascript" charset="utf-8"> var node = document.getElementById('toggle'); function togglePicture(){ var h = document.querySelector(".hidden"); if(h.style.display == "none") { h.style.display = "block"; } else { h.style.display = "none"; } } node.addEventListener('touchstart', function(e){ alert("touchstart"); //阻止事件的默认行为导致按钮不会出现活跃状态(active) // e.preventDefault(); e.target.className = "active button"; togglePicture(); }); node.addEventListener('touchend', function(e){ //e.preventDefault(); e.target.className = "button"; }); node.addEventListener("click", function(e){ alert("click"); }); </script> </html>


效果图如下所示,    注意: 在手机上 会响应触摸事件,不响应单击事件,    在PC 浏览器上 则相反

    

 第二种方式,  自定义事件

使用  addEventListener来  订阅事件.  使用它可以定义何时触发事件以及事件的行为.

还是 仿照上个示例, 作些修改, 步骤如下:

1. 使用 自定义事件

  1. node.addEventListener("tap", function(e){
  2. togglePictrue();
  3. });
  4. node.addEventListener("touchstart", function(e){
  5. var tap = document.createEvent("CustomEvent");
  6. tap.initCustomEvent("tap", true, true, null);
  7. node.dispatchEvent(tap);
  8. });

在这里 initCustomEvent  方法需要四个参数,

 该事件的名称

该事件是否冒泡

该事件是否可以取消

详细数据,  一个任意的数据,会在初始化事件时传递过去

2. 需要添加一个touchstart  监听器,并且 单击(click) 仍然不可用。 因此要检测是否支持触摸事件, 否则降为兼容到使用鼠标事件。

  1. function addTapListener(node, callback) {
  2. node.addEventListener('tap', callback);
  3. //一开始 定义为鼠标 按下,抬起事件,这是为PC浏览器考虑的
  4. var startEvent = 'mousedown', endEvent = 'mouseup';
  5. //if touch events are available use them instead
  6. if (typeof(window.ontouchstart) != 'undefined') {
  7. //如果判断为触摸设备,改变为触摸开始、触摸结束事件
  8. startEvent = 'touchstart';
  9. endEvent = 'touchend';
  10. }
  11. //开始事件
  12. node.addEventListener(startEvent, function(e) {
  13. var tap = document.createEvent('CustomEvent');
  14. tap.initCustomEvent('tap', true, true, null);
  15. node.dispatchEvent(tap);
  16. });
  17. //结束事件
  18. node.addEventListener(endEvent, function(e) {
  19. var tapend = document.createEvent('CustomEvent');
  20. tapend.initCustomEvent('tapend', true, true, null);
  21. node.dispatchEvent(tapend);
  22. });
  23. }

调用 上述方法的代码是这样的:

  1. addTapListener(node, function(e){
  2. e.preventDefault();
  3. e.target.className = 'active button';
  4. togglePicture();
  5. });

通过这两步,基本完成了需求。

完整代码如下, tap.html:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6. <meta name="viewport" content="width=device-width">
  7. <title>Touch</title>
  8. <style type="text/css" media="screen">
  9. body {
  10. margin: 0;
  11. padding: 0;
  12. font-family: sans-serif;
  13. text-align: center;
  14. }
  15. .button {
  16. font-size: 16px;
  17. padding: 10px;
  18. font-weight: bold;
  19. border: 0;
  20. color: #fff;
  21. border-radius: 10px;
  22. box-shadow: inset 0px 1px 3px #fff, 0px 1px 2px #000;
  23. background: #ff3019;
  24. opacity: 1;
  25. }
  26. .active, .button:active {
  27. box-shadow: inset 0px 1px 3px #000, 0px 1px 2px #fff;
  28. }
  29. .hidden {
  30. display: none;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <div id="touchme">
  36. <button class="button" id="toggle">切换图片</button>
  37. <div class="hidden" style="display: none">
  38. <p>Goldfinch by ibm4381 on Flickr</p>
  39. <a href="http://www.flickr.com/photos/j_benson/3504443844/" title="Goldfinch by ibm4381, on Flickr">
  40. <img src="http://pic116.nipic.com/file/20161118/11902156_130258137000_2.jpg"
  41. width="320" height="256" alt="Goldfinch">
  42. </a>
  43. </div>
  44. </div>
  45. </body>
  46. <script type="text/javascript" charset="utf-8">
  47. var node = document.getElementById('toggle');
  48. function togglePicture(){
  49. var h = document.querySelector(".hidden");
  50. if(h.style.display == "none") {
  51. h.style.display = "block";
  52. } else {
  53. h.style.display = "none";
  54. }
  55. }
  56. addTapListener(node, function(e){
  57. e.preventDefault();
  58. e.target.className = 'active button';
  59. togglePicture();
  60. });
  61. function addTapListener(node, callback) {
  62. node.addEventListener('tap', callback);
  63. //一开始 定义为鼠标 按下,抬起事件,这是为PC浏览器考虑的
  64. var startEvent = 'mousedown', endEvent = 'mouseup';
  65. //if touch events are available use them instead
  66. if (typeof(window.ontouchstart) != 'undefined') {
  67. //如果判断为触摸设备,改变为触摸开始、触摸结束事件
  68. startEvent = 'touchstart';
  69. endEvent = 'touchend';
  70. }
  71. //开始事件
  72. node.addEventListener(startEvent, function(e) {
  73. var tap = document.createEvent('CustomEvent');
  74. tap.initCustomEvent('tap', true, true, null);
  75. node.dispatchEvent(tap);
  76. });
  77. //结束事件
  78. node.addEventListener(endEvent, function(e) {
  79. var tapend = document.createEvent('CustomEvent');
  80. tapend.initCustomEvent('tapend', true, true, null);
  81. node.dispatchEvent(tapend);
  82. })
  83. }
  84. node.addEventListener('tapend', function(e){
  85. e.preventDefault();
  86. e.target.className = "button";
  87. });
  88. </script>
  89. </html>

效果图如下:

                                

可以看到 第二种方式:  自定义事件 不比第一种方式的代码少, 但它更清晰地介绍了发生了什么,  重要的是在桌面电脑上无需改动即可使用。

 


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/97273
推荐阅读