我们有一个jquery js函数,可以根据鼠标移开和鼠标移开来打开和关闭叠加层。但这不适用于触摸屏笔记本电脑或平板电脑。我正在阅读有关touchstart和touchmove功能的内容,并实现了如下所示的新功能。但它不能像鼠标一样过度或不合适。什么是我能实现这一目标的最佳方式。
$("#someDiv").hoverIntent({
sensitivity: 2,
interval: 200,
timeout: 500,
over: function(){
//opens the overlay
$(this).someFunc();
},
out: function(){
$(this).someFunc1();//closes the overlay
}
})
新功能:
$('#someDiv').on('touchstart',function (event) {
setTimeout(function() {
$(this).someFunc();//open overlay
}, 500);
});
// touchend不工作 - 看起来类似于mouseout
$('#someDiv').on('touchend',function () {
$(this).someFunc1();//close overlay
});
//关闭它
$('body').on('touchstart', function(e){
$(this).someFunc1();//close overlay
});
P.S - 我只需要使用jquery来实现它。
非常感谢。
答案 0 :(得分:1)
找到了这个:jQuery taphold Event
以下是该页面的代码。
以下是taphold
上文档的链接
$(document).on("pagecreate","#pageone",function(){
$("p").on("taphold",function(){
$(this).hide();
});
});
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css">
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"></script>
<div data-role="page" id="pageone">
<div data-role="header">
<h1>The taphold Event</h1>
</div>
<div data-role="main" class="ui-content">
<p>If you tap and hold me for one second, I will disappear.</p>
<p>Tap and hold me!</p>
<p>Tap and hold me too!</p>
</div>
<div data-role="footer">
<h1>Footer Text</h1>
</div>
</div>
使用此示例:richadams/jquery-taphold。我在这里转换了他的test.html页面以供在代码片段中使用,并将他的脚本放在脚本标记中。这只使用jQuery而不是jQuery UI或jQuery mobile。如果您不想使用他的代码,您可以检查他是如何做到的,并根据您的需要进行调整。
$(function()
{
$("#one").bind("taphold", function() { console.log("\ntap and hold on ONE"); });
$("#two").on("taphold", function() { console.log("\ntap and hold on TWO"); });
$("#three").on("taphold",
{clickHandler: function() { console.log("\nclick on THREE"); }},
function() { console.log("\ntap and hold on THREE"); });
$("#four").on("taphold", function() { console.log("\ntap and hold on FOUR"); })
.on("click", function() { console.log("\nclick on FOUR"); });
$("#seven").on("taphold", {duration: 5000}, function() { console.log("\ntap and hold on SEVEN"); });
});
.events div {
width: 100px;
height: 100px;
margin: 20px;
float: left;
padding: 10px;
font-weight: bold;
}
.events #one {
background: #f00;
}
.events #two {
background: #0f0;
}
.events #three {
background: #000;
color: #fff;
}
.events #four {
background: #fff;
color: #000;
border: 1px solid #000;
}
.events #five {
background: #dcda07;
color: #000;
}
.events #six {
background: #f10fff;
color: #000;
}
.events #seven {
background: #3cc9f4;
color: #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
// @author Rich Adams <rich@richadams.me>
// Implements a tap and hold functionality. If you click/tap and release, it will trigger a normal
// click event. But if you click/tap and hold for 1s (default), it will trigger a taphold event instead.
;(function($)
{
// Default options
var defaults = {
duration: 1000, // ms
clickHandler: null
}
// When start of a taphold event is triggered.
function startHandler(event)
{
var $elem = jQuery(this);
// Merge the defaults and any user defined settings.
settings = jQuery.extend({}, defaults, event.data);
// If object also has click handler, store it and unbind. Taphold will trigger the
// click itself, rather than normal propagation.
if (typeof $elem.data("events") != "undefined"
&& typeof $elem.data("events").click != "undefined")
{
// Find the one without a namespace defined.
for (var c in $elem.data("events").click)
{
if ($elem.data("events").click[c].namespace == "")
{
var handler = $elem.data("events").click[c].handler
$elem.data("taphold_click_handler", handler);
$elem.unbind("click", handler);
break;
}
}
}
// Otherwise, if a custom click handler was explicitly defined, then store it instead.
else if (typeof settings.clickHandler == "function")
{
$elem.data("taphold_click_handler", settings.clickHandler);
}
// Reset the flags
$elem.data("taphold_triggered", false); // If a hold was triggered
$elem.data("taphold_clicked", false); // If a click was triggered
$elem.data("taphold_cancelled", false); // If event has been cancelled.
// Set the timer for the hold event.
$elem.data("taphold_timer",
setTimeout(function()
{
// If event hasn't been cancelled/clicked already, then go ahead and trigger the hold.
if (!$elem.data("taphold_cancelled")
&& !$elem.data("taphold_clicked"))
{
// Trigger the hold event, and set the flag to say it's been triggered.
$elem.trigger(jQuery.extend(event, jQuery.Event("taphold")));
$elem.data("taphold_triggered", true);
}
}, settings.duration));
}
// When user ends a tap or click, decide what we should do.
function stopHandler(event)
{
var $elem = jQuery(this);
// If taphold has been cancelled, then we're done.
if ($elem.data("taphold_cancelled")) { return; }
// Clear the hold timer. If it hasn't already triggered, then it's too late anyway.
clearTimeout($elem.data("taphold_timer"));
// If hold wasn't triggered and not already clicked, then was a click event.
if (!$elem.data("taphold_triggered")
&& !$elem.data("taphold_clicked"))
{
// If click handler, trigger it.
if (typeof $elem.data("taphold_click_handler") == "function")
{
$elem.data("taphold_click_handler")(jQuery.extend(event, jQuery.Event("click")));
}
// Set flag to say we've triggered the click event.
$elem.data("taphold_clicked", true);
}
}
// If a user prematurely leaves the boundary of the object we're working on.
function leaveHandler(event)
{
// Cancel the event.
$(this).data("taphold_cancelled", true);
}
// Determine if touch events are supported.
var touchSupported = ("ontouchstart" in window) // Most browsers
|| ("onmsgesturechange" in window); // Microsoft
var taphold = $.event.special.taphold =
{
setup: function(data)
{
$(this).bind((touchSupported ? "touchstart" : "mousedown"), data, startHandler)
.bind((touchSupported ? "touchend" : "mouseup"), stopHandler)
.bind((touchSupported ? "touchmove touchcancel" : "mouseleave"), leaveHandler);
},
teardown: function(namespaces)
{
$(this).unbind((touchSupported ? "touchstart" : "mousedown"), startHandler)
.unbind((touchSupported ? "touchend" : "mouseup"), stopHandler)
.unbind((touchSupported ? "touchmove touchcancel" : "mouseleave"), leaveHandler);
}
};
})(jQuery);
</script>
<div class="events">
<div id="one">ONE<br/><br/>tap-hold</div>
<div id="two">TWO<br/><br/>tap-hold (alt)</div>
<div id="three">THREE<br/><br/>tap-hold<br/>click</div>
<div id="four">FOUR<br/><br/>tap-hold<br/>click (alt)</div>
<div id="seven">SEVEN<br/><br/>5s<br/>tap-hold</div>
</div>