Arrêter les évènements touchstart exécution trop rapide lors du défilement

Je suis à essayer de comprendre comment résoudre le taraudé classe attribuées aux éléments pendant le défilement, mais c'est prenant effet trop rapide dont j'ai besoin pour le retarder un peu quand il est réellement touché au lieu de touché pendant le défilement, c'est mon code de comment cela fonctionne:

$('div, a, span').filter('[tappable][data-tappable-role]').bind('touchstart', function()
{
    var self = $(this);

    self.addClass(self.data('tappable-role'));
}).bind('touchend', function()
{
    var self = $(this);
    self.removeClass(self.data('tappable-role'));
}).bind('click', function()
{
    var self = $(this),
        goTo = self.data('goto');

    if(typeof goTo !== 'undefined')
    {
        window.location = goTo;
    }
});

Lors du défilement, il va céder à la classe de l'élément lorsque je l'ai à peine touché, je veux empêcher que cela se passe sauf s'il est correctement touché (pas cliqué). Bien que j'ai essayé d'expérimenter avec le setTimeout, mais cela ne fonctionne pas, bien que des retards, mais il sera toujours assigner la classe plus tard.

C'est la façon dont je l'ai fait avec le setTimeout:

var currentTapped;
$('div, a, span').filter('[tappable][data-tappable-role]').bind('touchstart', function()
{
    clearTimeout(currentTapped);

    var self = $(this);

    var currentTapped = setTimeout(function()
    {
        self.addClass(self.data('tappable-role'));
    }, 60);
}).bind('touchend', function()
{
    clearTimeout(currentTapped);

    var self = $(this);
    self.removeClass(self.data('tappable-role'));
}).bind('click', function()
{
    clearTimeout(currentTapped);

    var self = $(this),
        goTo = self.data('goto');

    if(typeof goTo !== 'undefined')
    {
        window.location = goTo;
    }
});

Comment puis-je faire cela de la manière efficace?

Vous devez afficher sur votre iPhone/iPod/iPad ou un émulateur pour tester le violon.

Mise à JOUR:

function nextEvent() 
{
    $(this).on('touchend', function(e)
    {
        var self = $(this);

        self.addClass(self.data('tappable-role')).off('touchend');
    })
    .on('touchmove', function(e)
    {
        var self = $(this);

        self.removeClass(self.data('tappable-role')).off('touchend');
    })
    .click(function()
    {
        var self = $(this),
            goTo = self.data('goto');

        if(typeof goTo !== 'undefined')
        {
            window.location = goTo;
        }
    });
}

$('div, a, span').filter('[tappable][data-tappable-role]').on('touchstart', this, nextEvent);

OriginalL'auteur MacMac | 2012-03-23