Подтвердить что ты не робот

Как прослушивать тройные клики в JavaScript?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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


Если вам нужна поддержка IE 8, лучшим способом является захват двойного щелчка, за которым следует тройной щелчок — что-то вроде этого, например:

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.

Ответ 2

Начиная с 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

Вот реальное событие Triple click, которое запускается только тогда, когда все три клика запускаются с равным интервалом.

// 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>

Ответ 4

псевдокод:

var clicks = 0

onclick:
clicks++;
setTimer(resetClicksToZero);
if clicks == 3: tripleclickdetected(); clicks = 0;

Ответ 5

это очень просто, если вы делаете это правильно, и вы можете даже поймать одиночные, двойные, тройные,... щелчки, как вам нравится. простой 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);
});

Ответ 6

Я работаю над редактором кода 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

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