在 JavaScript 中长按?

IT技术 javascript jquery jquery-ui jquery-mobile jquery-events
2021-02-07 03:14:19

是否可以在 JavaScript(或 jQuery)中实现“长按”?如何?

替代文字
(来源:androinica.com

HTML

<a href="" title="">Long press</a>

JavaScript

$("a").mouseup(function(){
  // Clear timeout
  return false;
}).mousedown(function(){
  // Set timeout
  return false; 
});
6个回答

没有“jQuery”魔法,只有 JavaScript 计时器。

var pressTimer;

$("a").mouseup(function(){
  clearTimeout(pressTimer);
  // Clear timeout
  return false;
}).mousedown(function(){
  // Set timeout
  pressTimer = window.setTimeout(function() { ... Your Code ...},1000);
  return false; 
});
请记住,如果您希望这在手机上运行,​​它们通常有自己的默认长按行为(例如,android 上的 chrome 会在您长按链接时显示带有各种选项的模式菜单)。我没有太多运气来阻止这一点,老实说,干扰浏览器默认行为无论如何都是隐藏的。
2021-03-17 03:14:19
@Gallal据推测这将是通过打电话给于相当简单clearTimeout(pressTimer)mousemove,除非我失去了一些东西。诚然,这几乎是前所未有的。
2021-03-28 03:14:19
这也不会在阻力上着火吗?
2021-04-02 03:14:19
虽然这是选定的答案,但它并没有真正回答问题。它过于简单化和天真。任何长按事件都必须解决此答案忽略的多个问题。1) 区分长按与多点触控手势拖动(即捏放大或缩小) 2) 如果移动到元素或浏览器区域之外则取消 3) 解决大量平台和设备上文本选择的默认行为 4) 允许一个可配置的灵敏度阈值,不依赖于幻数。对于可访问性问题特别有帮助,但不限于此。
2021-04-02 03:14:19
@DavidJohnWelsh 就像我一直在看的,你不只是想要鼠标移动 - 让你的手指保持稳定而不移动 1px 是非常困难的!你需要应用一个阈值(如果鼠标没有移动 10px)等等。很快就会变得复杂!
2021-04-05 03:14:19

根据 Maycow Moura 的回答,我写了这个。它还确保用户没有执行右键单击,这会触发长按并在移动设备上工作。演示

var node = document.getElementsByTagName("p")[0];
var longpress = false;
var presstimer = null;
var longtarget = null;

var cancel = function(e) {
    if (presstimer !== null) {
        clearTimeout(presstimer);
        presstimer = null;
    }

    this.classList.remove("longpress");
};

var click = function(e) {
    if (presstimer !== null) {
        clearTimeout(presstimer);
        presstimer = null;
    }

    this.classList.remove("longpress");

    if (longpress) {
        return false;
    }

    alert("press");
};

var start = function(e) {
    console.log(e);

    if (e.type === "click" && e.button !== 0) {
        return;
    }

    longpress = false;

    this.classList.add("longpress");

    if (presstimer === null) {
        presstimer = setTimeout(function() {
            alert("long click");
            longpress = true;
        }, 1000);
    }

    return false;
};

node.addEventListener("mousedown", start);
node.addEventListener("touchstart", start);
node.addEventListener("click", click);
node.addEventListener("mouseout", cancel);
node.addEventListener("touchend", cancel);
node.addEventListener("touchleave", cancel);
node.addEventListener("touchcancel", cancel);

您还应该使用 CSS 动画包含一些指标:

p {
    background: red;
    padding: 100px;
}

.longpress {
    -webkit-animation: 1s longpress;
            animation: 1s longpress;
}

@-webkit-keyframes longpress {
    0%, 20% { background: red; }
    100% { background: yellow; }
}

@keyframes longpress {
    0%, 20% { background: red; }
    100% { background: yellow; }
}
@Xander:实际上,touchend应该解雇 IMO,当它是用于触摸设备的特殊代码时,没有理由让它粘住,也许我明天会尝试一些东西。
2021-03-25 03:14:19
@Xander:也许是因为:hover状态在触摸设备上是粘性的,也许这也适用于这里。
2021-03-27 03:14:19
Dang,我想知道是否有任何方法可以让 -/+ 数字递增按钮在支持长按的移动网站上工作。我发现的每种方法都只支持必须重复单击,这对于大量数字来说是一种痛苦。不过还是谢谢!
2021-03-30 03:14:19
我制作了这个修改过的版本,在按住按钮的同时不断地做一些事情jsfiddle但出于某种原因在 Android 上它甚至在你停止触摸 + 按钮后运行......
2021-03-31 03:14:19
找出Android上的问题。按下会同时触发 mousedown 和 touchstart,因此它有 2 个计时器正在运行,但只有 1 个通过抬起您的手指被取消。用 if (presstimer === null) 包裹 presstimer 以确保计时器尚未激活。
2021-03-31 03:14:19

您可以使用jQuery 移动 API 的taphold事件。

jQuery("a").on("taphold", function( event ) { ... } )
请注意:jquery mobile 与 jquery ui 冲突。另见stackoverflow.com/questions/24379514/...
2021-03-21 03:14:19

我创建了long-press-event (0.5k pure JS)来解决这个问题,它long-press向 DOM添加了一个事件。

侦听long-press的任何元素:

// the event bubbles, so you can listen at the root level
document.addEventListener('long-press', function(e) {
  console.log(e.target);
});

侦听特定元素long-press上的 a

// get the element
var el = document.getElementById('idOfElement');

// add a long-press event listener
el.addEventListener('long-press', function(e) {

    // stop the event from bubbling up
    e.preventDefault()

    console.log(e.target);
});

适用于 IE9+、Chrome、Firefox、Safari 和混合移动应用程序(iOS/Android 上的 Cordova 和 Ionic)

演示

这个解决方案猴子以一种有点随意、不完整和非标准的方式修补 window.CustomEvent 对象。它没有正确地将只读属性创建为只读而是读写。它特别缺少 returnValue、type、timeStamp 和 isTrusted。它没有解决拖拽、手势、双指放大或缩小或长按的多点触控失火问题,也没有解决大量设备和/或平台的问题,这些设备和/或平台即使在 500 毫秒时也默认长按选择文本。该库缺少这些条件的任何和所有测试用例。
2021-03-21 03:14:19
它是开源的,随时为该项目做出贡献:)
2021-03-23 03:14:19
只要在“long-press-delay”计时器启动之前释放长按,您仍然应该获得“onclick”事件
2021-03-27 03:14:19
@JohnDoherty 很棒!但是我们仍然可以使用具有相同元素的“onClick”吗?
2021-04-01 03:14:19
太棒了,伙计!!
2021-04-04 03:14:19

虽然它看起来很简单,可以通过超时和几个鼠标事件处理程序自行实现,但当您考虑单击-拖动-释放等情况时,它会变得有点复杂,在同一元素上同时支持按下和长按,并使用 iPad 等触控设备。我最终使用了longclick jQuery 插件( Github ),它为我处理这些事情。如果你只需要支持手机等触屏设备,你也可以试试jQuery Mobile的taphold事件

Github 链接有效,但该项目自 2010 年以来没有更新,并且不适用于当前的 jquery 版本。但是,在源代码中用 dispatch.apply 替换 handle.apply 修复了它。
2021-03-24 03:14:19