javascript-如何绑定Mousedown和Touchstart,但不同时响应两者? Android,JQuery

在还可以在移动设备上查看并且需要在touchstart和mousedown上绑定动作的网站上工作。

看起来像这样

$("#roll").bind("mousedown touchstart", function(event){

someAction();

它可以在Iphone上正常工作,但在Android上可以响应两次。

event.stopPropagation();

event.preventDefault();

添加此代码后,Android Chrome浏览器无法修复此问题,Android默认浏览器无法修复此问题。 任何其他技巧可以解决所有android的问题?

9个解决方案

28 votes

我一直在使用此功能:

//touch click helper

(function ($) {

$.fn.tclick = function (onclick) {

this.bind("touchstart", function (e) {

onclick.call(this, e);

e.stopPropagation();

e.preventDefault();

});

this.bind("click", function (e) {

onclick.call(this, e); //substitute mousedown event for exact same result as touchstart

});

return this;

};

})(jQuery);

更新:修改后的答案可同时支持鼠标和触摸事件。

Joshua answered 2020-07-20T14:44:02Z

28 votes

element.on('touchstart mousedown', function(e) {

e.preventDefault();

someAction();

});

stopPropagation根据规范取消了该事件

您将获得touchstart,但是一旦您取消它,就不再会发生鼠标按下的情况。 与已接受的答案相反,除非需要,否则您无需致电stopPropagation。 即使取消,事件也将正常传播。 浏览器将忽略它,但是您的钩子仍将起作用。

Mozilla在这一点上同意我的观点:

在touchstart或系列的第一个touchmove事件上调用preventDefault()会阻止触发相应的鼠标事件

编辑:我只是再次阅读了该问题,并且您说您已经做到了,并且不能修复Android默认浏览器。 不确定接受的答案如何帮助,因为它基本上以相同的方式执行操作,只是以更复杂的方式并带有事件传播错误(touchstart不会传播,而click会传播)

Radu C answered 2020-07-20T14:44:40Z

3 votes

考虑到gregers对win8和chrome / firefox的评论,skyisred的评论毕竟看起来并不愚蠢(:P @ all haters)尽管我宁愿使用黑名单,也不愿使用他建议的白名单,但只能将Android从触摸绑定中排除:

var ua = navigator.userAgent.toLowerCase(),

isAndroid = ua.indexOf("android") != -1,

supportsPointer = !!window.navigator.msPointerEnabled,

ev_pointer = function(e) { ... }, // function to handle IE10's pointer events

ev_touch = function(e) { ... }, // function to handle touch events

ev_mouse = function(e) { ... }; // function to handle mouse events

if (supportsPointer) { // IE10 / Pointer Events

// reset binds

$("yourSelectorHere").on('MSPointerDown MSPointerMove MSPointerUp', ev_pointer);

} else {

$("yourSelectorHere").on('touchstart touchmove touchend', ev_touch); // touch events

if(!isAndroid) {

// in androids native browser mouse events are sometimes triggered directly w/o a preceding touchevent (most likely a bug)

// bug confirmed in android 4.0.3 and 4.1.2

$("yourSelectorHere").on('mousedown mousemove mouseup mouseleave', ev_mouse); // mouse events

}

}

顺便说一句:我发现鼠标事件并非总是触发的(如果使用了stopPropagation和preventDefault),特别是我只在touchend事件之前注意到了一个额外的mousemove ...确实很奇怪的错误,但是上面的代码为我解决了所有问题( 分别通过本机浏览器,Chrome,Firefox,IE,Safari和Opera(如果有)平台测试了OSX,Win,iOS 5 + 6,Android 2 + 4。

Jörn Berkefeld answered 2020-07-20T14:45:05Z

1 votes

使用此代码修复

var mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);

var start = mobile ? "touchstart" : "mousedown";

$("#roll").bind(start, function(event){

skyisred answered 2020-07-20T14:45:25Z

1 votes

我认为最好的方法是:

var hasTouchStartEvent = 'ontouchstart' in document.createElement( 'div' );

document.addEventListener( hasTouchStartEvent ? 'touchstart' : 'mousedown', function( e ) {

console.log( e.touches ? 'TouchEvent' : 'MouseEvent' );

}, false );

LCB answered 2020-07-20T14:45:45Z

1 votes

哇,在这个问题和相关问题中有这么多答案,但没有一个对我有用(Chrome,移动响应,mousedown + touchstart)。 但是这个:

(e) => {

if(typeof(window.ontouchstart) != 'undefined' && e.type == 'mousedown') return;

// do anything...

}

Andreas Richter answered 2020-07-20T14:46:05Z

0 votes

我建议您尝试使用jquery-fast-click。 我在这个问题和其他问题上尝试了另一种方法。 每个问题解决了一个问题,并介绍了另一个问题。 快速点击首次在Android,ios,桌面和桌面触摸浏览器上运行()吟)。

Adam Rabung answered 2020-07-20T14:46:26Z

0 votes

编写此代码并添加j查询打孔触摸js。它将通过触摸事件模拟鼠标事件

function touchHandler(event)

{

var touches = event.changedTouches,

first = touches[0],

type = "";

switch(event.type)

{

case "touchstart": type = "mousedown"; break;

case "touchmove": type="mousemove"; break;

case "touchend": type="mouseup"; break;

default: return;

}

var simulatedEvent = document.createEvent("MouseEvent");

simulatedEvent.initMouseEvent(type, true, true, window, 1,

first.screenX, first.screenY,

first.clientX, first.clientY, false,

false, false, false, 0/*left*/, null);

first.target.dispatchEvent(simulatedEvent);

event.preventDefault();

}

function init()

{

document.addEventListener("touchstart", touchHandler, true);

document.addEventListener("touchmove", touchHandler, true);

document.addEventListener("touchend", touchHandler, true);

document.addEventListener("touchcancel", touchHandler, true);

}

Mohsin Kureshi answered 2020-07-20T14:46:46Z

0 votes

这个本机解决方案最适合我:

将if (touch && e.type === 'mousedown') return;事件添加到文档设置全局touch = true。

在mousedown / touchstart处理程序中,防止在检测到触摸屏时发生所有mousedown事件:if (touch && e.type === 'mousedown') return;

Raine Revere answered 2020-07-20T14:47:14Z

android调用js的touch事件吗,javascript-如何绑定Mousedown和Touchstart,但不同时响应两者? Android,JQuery...相关推荐

  1. Android开发-WebView中实现Android调用JS JS调用Android 【三】

    老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面,注册 ...

  2. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  3. android调用js函数方法,Android和JavaScript相互调用的方法

    本文实例讲述了Android和JavaScript相互调用的方法.分享给大家供大家参考,具体如下: Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件 ...

  4. android调用js接口,Android代码和JavaScript互相调用

    WebView加载一个使用JavaScript的网页,并且要实现相互之间的调用,需要启用WebView对JavaScript的支持,一旦启用之后你就可以通过接口来实现本地代码和JavaScript代码 ...

  5. zepto.js 处理Touch事件

    处理Touch事件能让你了解到用户的每一根手指的位置,在touch事件触发的时候产生,可以通过touch event handler的event对象取到,如果基于zepto.js开发,一般是通过eve ...

  6. JS的Touch事件们

    iphone.ipod Touch.ipad触屏时的js事件 1.Touch事件简介 pc上的web页面鼠标会产生onmousedown.onmouseup.onmouseout.onmouseove ...

  7. android控件的touch事件_Android touch 事件分发时序

    点击上方"蓝字"关注我们 1,touch 事件是如何从驱动层传递给 Framework 层的 InputManagerService: 2,WMS 是如何通过 ViewRooImp ...

  8. Chrome无法调用preventDefault阻止touch事件解决办法

    坑爹的开始- Chorme56+开始为了让页面滚动变得更为流畅,在 window.document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 pa ...

  9. Android 模拟滑动 MotionEvent touch事件

    模拟android里touch事件的滑动,适用于recyclerview等. 通过发送MotionEvent来模拟touch事件,配合ValueAnimator控制滑动的时间,也可以加入差值器等,之所 ...

最新文章

  1. python坐标点怎么输入_python导入坐标点的具体操作
  2. .NET Standard 2.1 公布
  3. opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
  4. c语言内置画直线函数库,C语言不调用库函数画直线
  5. Java语言实现hello world代码
  6. 列表生成式的复习以及生成器的练习, 杨辉三角实例(非常巧妙)
  7. linux-redis
  8. 内存、cache和寄存器之间的关系及区别
  9. [luoguP1373] 小a和uim之大逃离(DP)
  10. 图书馆占座系统(二)
  11. Oracle Primavera P6EPPM Mobile/App 安卓移动端分享(长期更新)
  12. wireshark绿色便携版 v3.4.2.0
  13. U盘安装Linux系统
  14. 排列组合cn和an公式
  15. 0x和\u区别,unicode编码
  16. 计算机中时序信号的作用是什么,时序信号
  17. 更新 TKK 失败,请检查网络连接 报错处理
  18. 如何用python画流程图_Markdown笔记:如何画流程图
  19. SOA Presentation - SOA概念介绍
  20. 中国企业密钥管理(EKM)市场趋势报告、技术动态创新及市场预测

热门文章

  1. 问题 | iview Row Col 修改样式
  2. Flutter Dart 正则RegExp [.....]和[^.....](一)
  3. JeeSite新建报表
  4. ubuntu安装远程桌面
  5. Appium1.4 的简介、安装及其使用真机测试(iOS版)
  6. EUI组件之DataGroup
  7. git revert 怎么使用
  8. ZUCC_软件工程_大作业
  9. pyqt5中控件缩放功能_PyQt5中布局内的控件如何充满布局?
  10. 深度强化学习算法调参