是否可以在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;
});
是否可以在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;
});
Answers:
没有“ 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;
});
clearTimeout(pressTimer)
的mousemove
,除非我失去了一些东西。诚然,这几乎是无与伦比的。
根据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; }
}
:hover
状态在触摸设备上很粘,也许在这里也适用。
touchend
应该触发IMO,当它是用于触摸设备的特殊代码时,没有理由让它发粘,也许我明天会尝试一些。
您可以使用jQuery mobile API的taphold事件。
jQuery("a").on("taphold", function( event ) { ... } )
我创建了长按事件 (0.5k纯JavaScript)来解决此问题,它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
一个在特定的元素:
// 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)
虽然看起来很简单,可以通过超时和几个鼠标事件处理程序自行实现,但是当您考虑单击-拖动-释放之类的情况时,它会变得稍微复杂一些,同时支持在同一元素上按下和长按,并与iPad等触控设备配合使用。我最终使用了longclick jQuery插件(Github),它为我处理了这些事情。如果您只需要支持触摸屏设备(例如手机),则还可以尝试jQuery Mobile taphold事件。
jQuery插件。刚放$(expression).longClick(function() { <your code here> });
。第二个参数是保持时间;默认超时为500毫秒。
(function($) {
$.fn.longClick = function(callback, timeout) {
var timer;
timeout = timeout || 500;
$(this).mousedown(function() {
timer = setTimeout(function() { callback(); }, timeout);
return false;
});
$(document).mouseup(function() {
clearTimeout(timer);
return false;
});
};
})(jQuery);
对于跨平台开发人员(请注意,到目前为止给出的所有答案均不适用于iOS):
Mouseup / down似乎在android上可以正常工作-但并非所有设备(例如,三星tab4)。在iOS上根本无法使用。
进一步的研究看来,这是由于元素具有选择性,并且自然放大率干扰了听众。
如果用户按住图片500毫秒,则此事件侦听器可以以自举模式打开缩略图。
它使用了响应式图像类,因此显示了较大版本的图像。此代码段已在(iPad / Tab4 / TabA / Galaxy4)上经过全面测试:
var pressTimer;
$(".thumbnail").on('touchend', function (e) {
clearTimeout(pressTimer);
}).on('touchstart', function (e) {
var target = $(e.currentTarget);
var imagePath = target.find('img').attr('src');
var title = target.find('.myCaption:visible').first().text();
$('#dds-modal-title').text(title);
$('#dds-modal-img').attr('src', imagePath);
// Set timeout
pressTimer = window.setTimeout(function () {
$('#dds-modal').modal('show');
}, 500)
});
$(document).ready(function () {
var longpress = false;
$("button").on('click', function () {
(longpress) ? alert("Long Press") : alert("Short Press");
});
var startTime, endTime;
$("button").on('mousedown', function () {
startTime = new Date().getTime();
});
$("button").on('mouseup', function () {
endTime = new Date().getTime();
longpress = (endTime - startTime < 500) ? false : true;
});
});
Diodeus的答案很棒,但是它阻止您添加onClick函数,如果您放置onclick,它将永远不会运行hold函数。Razzak的答案几乎是完美的,但是它仅在mouseup上运行保持功能,并且通常,即使用户保持保持状态,该功能也会运行。
因此,我同时加入了这两个团队,并做到了:
$(element).on('click', function () {
if(longpress) { // if detect hold, stop onclick function
return false;
};
});
$(element).on('mousedown', function () {
longpress = false; //longpress is false initially
pressTimer = window.setTimeout(function(){
// your code here
longpress = true; //if run hold function, longpress is true
},1000)
});
$(element).on('mouseup', function () {
clearTimeout(pressTimer); //clear time on mouseup
});
对于现代的移动浏览器:
document.addEventListener('contextmenu', callback);
https://developer.mozilla.org/zh-CN/docs/Web/Events/contextmenu
bind()
jQuery 1.7+ = on()
和unbind()
=off()
您可以在按下鼠标时设置该元素的超时,并在按下鼠标时清除它:
$("a").mousedown(function() {
// set timeout for this element
var timeout = window.setTimeout(function() { /* … */ }, 1234);
$(this).mouseup(function() {
// clear timeout for this element
window.clearTimeout(timeout);
// reset mouse up event handler
$(this).unbind("mouseup");
return false;
});
return false;
});
有了这个,每个元素都有自己的超时时间。
$(this).mouseup(function(){});
不删除事件处理程序,而是添加另一个事件处理程序。使用.unbind
代替。
off()
现在使用而不是取消绑定。
您可以使用jquery-mobile的Taphold。包括jquery-mobile.js,以下代码将正常工作
$(document).on("pagecreate","#pagename",function(){
$("p").on("taphold",function(){
$(this).hide(); //your code
});
});
最优雅,最简洁的是一个jQuery插件:https : //github.com/untill/jquery.longclick/,也可以作为packacke使用:https ://www.npmjs.com/package/jquery.longclick 。
简而言之,您可以这样使用它:
$( 'button').mayTriggerLongClicks().on( 'longClick', function() { your code here } );
与此处的其他一些答案相比,此插件的优点是单击事件仍然可能。还要注意的是,长按会发生,就像在设备上长按鼠标一样,然后单击鼠标。因此,这是一个功能。
对我来说,它可以使用该代码(使用jQuery):
var int = null,
fired = false;
var longclickFilm = function($t) {
$body.css('background', 'red');
},
clickFilm = function($t) {
$t = $t.clone(false, false);
var $to = $('footer > div:first');
$to.find('.empty').remove();
$t.appendTo($to);
},
touchStartFilm = function(event) {
event.preventDefault();
fired = false;
int = setTimeout(function($t) {
longclickFilm($t);
fired = true;
}, 2000, $(this)); // 2 sec for long click ?
return false;
},
touchEndFilm = function(event) {
event.preventDefault();
clearTimeout(int);
if (fired) return false;
else clickFilm($(this));
return false;
};
$('ul#thelist .thumbBox')
.live('mousedown touchstart', touchStartFilm)
.live('mouseup touchend touchcancel', touchEndFilm);
您可以检查时间来确定单击或长按[jQuery]
function AddButtonEventListener() {
try {
var mousedowntime;
var presstime;
$("button[id$='" + buttonID + "']").mousedown(function() {
var d = new Date();
mousedowntime = d.getTime();
});
$("button[id$='" + buttonID + "']").mouseup(function() {
var d = new Date();
presstime = d.getTime() - mousedowntime;
if (presstime > 999/*You can decide the time*/) {
//Do_Action_Long_Press_Event();
}
else {
//Do_Action_Click_Event();
}
});
}
catch (err) {
alert(err.message);
}
}
您可以使用jquery
触摸事件。(见这里)
let holdBtn = $('#holdBtn')
let holdDuration = 1000
let holdTimer
holdBtn.on('touchend', function () {
// finish hold
});
holdBtn.on('touchstart', function () {
// start hold
holdTimer = setTimeout(function() {
//action after certain time of hold
}, holdDuration );
});
我需要一些用于长按键盘事件的东西,所以我写了这个。
var longpressKeys = [13];
var longpressTimeout = 1500;
var longpressActive = false;
var longpressFunc = null;
document.addEventListener('keydown', function(e) {
if (longpressFunc == null && longpressKeys.indexOf(e.keyCode) > -1) {
longpressFunc = setTimeout(function() {
console.log('longpress triggered');
longpressActive = true;
}, longpressTimeout);
// any key not defined as a longpress
} else if (longpressKeys.indexOf(e.keyCode) == -1) {
console.log('shortpress triggered');
}
});
document.addEventListener('keyup', function(e) {
clearTimeout(longpressFunc);
longpressFunc = null;
// longpress key triggered as a shortpress
if (!longpressActive && longpressKeys.indexOf(e.keyCode) > -1) {
console.log('shortpress triggered');
}
longpressActive = false;
});
我认为这可以帮助您:
var image_save_msg = 'You Can Not Save images!';
var no_menu_msg = 'Context Menu disabled!';
var smessage = "Content is protected !!";
function disableEnterKey(e) {
if (e.ctrlKey) {
var key;
if (window.event)
key = window.event.keyCode; //IE
else
key = e.which; //firefox (97)
//if (key != 17) alert(key);
if (key == 97 || key == 65 || key == 67 || key == 99 || key == 88 || key == 120 || key == 26 || key == 85 || key == 86 || key == 83 || key == 43) {
show_wpcp_message('You are not allowed to copy content or view source');
return false;
} else
return true;
}
}
function disable_copy(e) {
var elemtype = e.target.nodeName;
var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
elemtype = elemtype.toUpperCase();
var checker_IMG = '';
if (elemtype == "IMG" && checker_IMG == 'checked' && e.detail >= 2) {
show_wpcp_message(alertMsg_IMG);
return false;
}
if (elemtype != "TEXT" && elemtype != "TEXTAREA" && elemtype != "INPUT" && elemtype != "PASSWORD" && elemtype != "SELECT" && elemtype != "OPTION" && elemtype != "EMBED") {
if (smessage !== "" && e.detail == 2)
show_wpcp_message(smessage);
if (isSafari)
return true;
else
return false;
}
}
function disable_copy_ie() {
var elemtype = window.event.srcElement.nodeName;
elemtype = elemtype.toUpperCase();
if (elemtype == "IMG") {
show_wpcp_message(alertMsg_IMG);
return false;
}
if (elemtype != "TEXT" && elemtype != "TEXTAREA" && elemtype != "INPUT" && elemtype != "PASSWORD" && elemtype != "SELECT" && elemtype != "OPTION" && elemtype != "EMBED") {
//alert(navigator.userAgent.indexOf('MSIE'));
//if (smessage !== "") show_wpcp_message(smessage);
return false;
}
}
function reEnable() {
return true;
}
document.onkeydown = disableEnterKey;
document.onselectstart = disable_copy_ie;
if (navigator.userAgent.indexOf('MSIE') == -1) {
document.onmousedown = disable_copy;
document.onclick = reEnable;
}
function disableSelection(target) {
//For IE This code will work
if (typeof target.onselectstart != "undefined")
target.onselectstart = disable_copy_ie;
//For Firefox This code will work
else if (typeof target.style.MozUserSelect != "undefined") {
target.style.MozUserSelect = "none";
}
//All other (ie: Opera) This code will work
else
target.onmousedown = function() {
return false
}
target.style.cursor = "default";
}
// on_body_load
window.onload = function() {
disableSelection(document.body);
};
// disable_Right_Click
document.ondragstart = function() {
return false;
}
function nocontext(e) {
return false;
}
document.oncontextmenu = nocontext;
jQuery(...).longclick(function() { ... });