Как прослушать тройные клики в JavaScript? - PullRequest
42 голосов
/ 25 июня 2011

Если это для двойного щелчка:

window.addEventListener("dblclick", function(event) { }, false);

Как я могу получить тройной щелчок?Это для закрепленной вкладки в Google Chrome.

Ответы [ 6 ]

58 голосов
/ 25 июня 2011

Вам нужно написать собственную реализацию с тройным щелчком, потому что не существует собственного события, которое бы захватывало 3 щелчка подряд. К счастью, современные браузеры имеют event.detail, который документация MDN описывает как :

Количество последовательных кликов, произошедших за короткий промежуток времени, увеличенное на единицу.

Это означает, что вы можете просто проверить значение этого свойства и посмотреть, является ли оно 3:

window.addEventListener('click', function (evt) {
    if (evt.detail === 3) {
        alert('triple click!');
    }
});

Рабочая демоверсия: http://jsfiddle.net/L6d0p4jo/


Если вам нужна поддержка IE 8, лучший способ - захватить двойной щелчок, а затем тройной щелчок & mdash; как то так, например:

var timer,          // timer required to reset
    timeout = 200;  // timer reset in ms

window.addEventListener("dblclick", function (evt) {
    timer = setTimeout(function () {
        timer = null;
    }, timeout);
});
window.addEventListener("click", function (evt) {
    if (timer) {
        clearTimeout(timer);
        timer = null;
        executeTripleClickFunction();
    }
});

Рабочая демоверсия: http://jsfiddle.net/YDFLV/

Причина этого в том, что старые браузеры IE не запускают два последовательных события щелчка для двойного щелчка. Не забудьте использовать attachEvent вместо addEventListener для IE 8.

16 голосов
/ 09 июля 2012

Начиная с DOM Level 2, вы можете использовать обработчик щелчка мыши и проверить параметр detail события, который следует интерпретировать как:

Атрибут detail, унаследованный от UIEvent, указывает, сколько раз была нажата и отпущена кнопка мыши в одном и том же месте экрана во время действия пользователя. Значение атрибута равно 1, когда пользователь начинает это действие, и увеличивается на 1 для каждой полной последовательности нажатия и отпускания. Если пользователь перемещает мышь между mousedown и mouseup, значение будет установлено равным 0, что указывает на отсутствие щелчка.

Таким образом, значение detail === 3 даст вам событие тройного щелчка.

Больше информации в спецификации на http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-MouseEvent.

Благодаря @Nayuki https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail - расширению DOM3, которое является WIP https://w3c.github.io/uievents/

3 голосов
/ 21 декабря 2014

Вот реальное событие тройного щелчка, которое срабатывает только тогда, когда все три щелчка срабатывают с равным интервалом.

// Default settings
var minClickInterval = 100,
    maxClickInterval = 500,
    minPercentThird = 85.0,
    maxPercentThird = 130.0;

// Runtime
var hasOne = false,
    hasTwo = false,
    time = [0, 0, 0],
    diff = [0, 0];

$('#btn').on('click', function() {
    var now = Date.now();
    
    // Clear runtime after timeout fot the 2nd click
    if (time[1] && now - time[1] >= maxClickInterval) {
        clearRuntime();
    }
    // Clear runtime after timeout fot the 3rd click
    if (time[0] && time[1] && now - time[0] >= maxClickInterval) {
        clearRuntime();
    }
    
    // Catch the third click
    if (hasTwo) {
        time[2] = Date.now();
        diff[1] = time[2] - time[1];
        
        var deltaPercent = 100.0 * (diff[1] / diff[0]);
        
        if (deltaPercent >= minPercentThird && deltaPercent <= maxPercentThird) {
            alert("Triple Click!");
        }
        clearRuntime();
    }
    
    // Catch the first click
    else if (!hasOne) {
        hasOne = true;
        time[0] = Date.now();
    }
    
    // Catch the second click
    else if (hasOne) {
        time[1] = Date.now();
        diff[0] = time[1] - time[0];
        
        (diff[0] >= minClickInterval && diff[0] <= maxClickInterval) ?
            hasTwo = true : clearRuntime();
    }  
});

var clearRuntime = function() {
    hasOne = false;
    hasTwo = false;
    time[0] = 0;
    time[1] = 0;
    time[2] = 0;
    diff[0] = 0;
    diff[1] = 0;
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Click button three times with equal interval
<button id="btn">Click me</button>

Также я написал плагин jquery TrplClick , который включает событие trplclick

1 голос
/ 18 мая 2018

это очень просто, если вы все сделаете правильно, и вы даже можете поймать одиночные, двойные, тройные, ... щелчки, как вам нравится. обычный javascript, настраиваемая задержка клика (тайм-аут):

var clicks = 0;
var timer, timeout = 350; // time between each click

var doubleClick = function(e) {
  console.log('doubleClick');
}

var tripleClick = function(e) {
  console.log('tripleClick');
}

// click timer
yourcontainer.addEventListener('click', function(e) {
  clearTimeout(timer);
  clicks++;
  var evt = e;
  timer = setTimeout(function() {
    if(clicks==2) doubleClick(evt);
    if(clicks==3) tripleClick(evt);
    clicks = 0;
  }, timeout);
});
1 голос
/ 25 июня 2011

псевдокод:

var clicks = 0

onclick:
clicks++;
setTimer(resetClicksToZero);
if clicks == 3: tripleclickdetected(); clicks = 0;
0 голосов
/ 25 мая 2012

Я работаю над редактором кода JavaScript, и мне пришлось прослушивать тройной щелчок, и вот решение, которое будет работать для большинства браузеров:

// Function to get mouse position
var getMousePosition = function (mouseEvent) {
    var currentObject = container;
    var currentLeft = 0;
    var currentTop = 0;
    do {
        currentLeft += currentObject.offsetLeft;
        currentTop += currentObject.offsetTop;
        currentObject = currentObject.offsetParent;
    } while (currentObject != document.body);
    return {
        x: mouseEvent.pageX - currentLeft,
        y: mouseEvent.pageY - currentTop
    }
}

// We will need a counter, the old position and a timer
var clickCounter = 0;
var clickPosition = {
    x: null,
    y: null
};
var clickTimer;

// The listener (container may be any HTML element)
container.addEventListener('click', function (event) {

    // Get the current mouse position
    var mousePosition = getMousePosition(event);

    // Function to reset the data
    var resetClick = function () {
        clickCounter = 0;
        var clickPosition = {
            x: null,
            y: null
        };
    }

    // Function to wait for the next click
    var conserveClick = function () {
        clickPosition = mousePosition;
        clearTimeout(clickTimer);
        clickTimer = setTimeout(resetClick, 250);
    }

    // If position has not changed
    if (clickCounter && clickPosition.x == mousePosition.x && clickPosition.y == mousePosition.y) {
        clickCounter++;
        if (clickCounter == 2) {
            // Do something on double click
        } else {
            // Do something on triple click
            resetClick();
        }
        conserveClick();
    } else {
        // Do something on single click
        conserveClick();
    }
});

Протестировано на Firefox 12, Google Chrome 19, Opera 11.64, Internet Explorer 9

Этот подход проверяет, не изменил ли пользователь положение курсора, вы все равно можете что-то сделать, когда у вас один щелчок или двойной щелчок. Надеюсь, что это решение поможет всем, кому потребуется реализовать прослушиватель событий тройного щелчка:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...