8

我正在一个需要鼠标悬停菜单的网站上工作。从可访问性的角度来看,我不推荐鼠标悬停菜单,但使用 jQuery 很容易实现。

问题:我们还需要支持触摸屏设备(平板电脑)。在这样的设备上,您没有鼠标,因此 mouseover 事件不起作用。我希望 jQuery 有一个 longpress 事件,但它没有。我确实找到了一个使用 Google 的jQuery longclick 插件,但它适用于 jQuery 1.4,所以我不热衷于使用它。此外,jQuery 插件站点目前正在维护中,所以这不是很有帮助。

那么问题来了:jQuery 1.7 / 1.8 是否有一个优雅的插件来支持 longpress / longclick 事件?

4

3 回答 3

7

事实证明,您可以将现有的用于 jQuery 1.4 的longclick 插件与 jQuery 1.8 一起使用。

$("#area").mousedown(function(){
    $("#result").html("Waiting for it...");
});
$("#area").longclick(500, function(){
    $("#result").html("You longclicked. Nice!");
});
$("#area").click(function(){
    $("#result").html("You clicked. Bummer.");
});
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script src="http://rawgit.com/pisi/Longclick/master/jquery.longclick-min.js"></script>
    
<p id="area">Click me!</p>
<p id="result">You didn't click yet.</p>

于 2012-08-29T16:30:54.060 回答
5

您可以做的是setTimeout在各种鼠标事件期间使用延迟检查。结合 jQuery$.data()来存储跨事件(在每个元素上)的超时应该可以帮助您完成这一切。这是一个例子:

HTML:

<ul id="menu">
    <li><a href="#" onclick="return false;" class="test"></a></li>
    <li><a href="#" onclick="return false;" class="test"></a></li>
</ul>

JS:

var mousepress_time = 1000;  // Maybe hardcode this value in setTimeout
var orig_message = "Click Here";  // Remove this line
var held_message = "Down";  // Remove this line

$(document).ready(function () {
    $(".test")
        .html(orig_message)  // Remove this line
        .on("mousedown", function () {
            console.log("#########mousedown");  // Remove this line
            var $this = $(this);
            $(this).data("checkdown", setTimeout(function () {
                // Add your code to run
                $this.html(held_message);  // Remove this line
            }, mousepress_time));
        }).on("mouseup", function () {
            clearTimeout($(this).data("checkdown"));
            console.log("#######mouseup");  // Remove this line
            $(this).html(orig_message);  // Remove this line
        }).on("mouseout", function () {
            clearTimeout($(this).data("checkdown"));
            console.log("#######mouseout");  // Remove this line
            $(this).html(orig_message);  // Remove this line
        });
});

演示:http: //jsfiddle.net/7jKYa/10/

这还有很多事情要做,因为你也加入了悬停,但在大多数情况下,我认为这就是你想要的。

如有必要,它可以很容易地转换为插件,否则我认为它可以单独工作。我希望这会有所帮助!

于 2012-08-27T16:30:24.927 回答
1

你可以计时。

function onImageMouseDown(e){
    var d = new Date();
    md_time = d.getTime(); // Milliseconds since 1 Apr 1970
}

function onImageMouseUp(e){
    var d = new Date();
    var long_click = (d.getTime()-md_time)>1000;
    if (long_click){
        // Click lasted longer than 1s (1000ms)
    }else{
        // Click lasted less than 1s
    }
    md_time = 0;
}
于 2015-03-25T12:50:11.763 回答