make click work better on touch devices (closes foodcoops#104)

This commit is contained in:
wvengen 2014-01-25 15:19:50 +01:00
parent 23ee2ef0fb
commit 7ebb2459e0
7 changed files with 84 additions and 11 deletions

View file

@ -19,6 +19,7 @@
//= require_self //= require_self
//= require ordering //= require ordering
//= require stupidtable //= require stupidtable
//= require touchclick
// Load following statements, when DOM is ready // Load following statements, when DOM is ready
$(function() { $(function() {

View file

@ -164,20 +164,20 @@ function updateBalance() {
} }
$(function() { $(function() {
$('input[data-increase_quantity]').click(function() { $('input[data-increase_quantity]').on('touchclick', function() {
increaseQuantity($(this).data('increase_quantity')); increaseQuantity($(this).data('increase_quantity'));
}); });
$('input[data-decrease_quantity]').click(function() { $('input[data-decrease_quantity]').on('touchclick', function() {
decreaseQuantity($(this).data('decrease_quantity')); decreaseQuantity($(this).data('decrease_quantity'));
}); });
$('input[data-increase_tolerance]').click(function() { $('input[data-increase_tolerance]').on('touchclick', function() {
increaseTolerance($(this).data('increase_tolerance')); increaseTolerance($(this).data('increase_tolerance'));
}); });
$('input[data-decrease_tolerance]').click(function() { $('input[data-decrease_tolerance]').on('touchclick', function() {
decreaseTolerance($(this).data('decrease_tolerance')); decreaseTolerance($(this).data('decrease_tolerance'));
}); });
$('a[data-confirm_switch_order]').click(function() { $('a[data-confirm_switch_order]').on('touchclick', function() {
return (!modified || confirm(I18n.t('js.ordering.confirm_change'))); return (!modified || confirm(I18n.t('js.ordering.confirm_change')));
}); });
}); });

View file

@ -1,7 +1,7 @@
- content_for :javascript do - content_for :javascript do
:javascript :javascript
$(function() { $(function() {
$('#stock_changes').on('click', '.destroy_stock_change', function() { $('#stock_changes').on('touchclick', '.destroy_stock_change', function() {
$(this).prev('input').val('1'); // check for destruction $(this).prev('input').val('1'); // check for destruction
var stock_change = $(this).closest('tr'); var stock_change = $(this).closest('tr');
@ -11,7 +11,7 @@
return false; return false;
}); });
$('#stock_changes').on('click', '.remove_new_stock_change', function() { $('#stock_changes').on('touchclick', '.remove_new_stock_change', function() {
var stock_change = $(this).closest('tr'); var stock_change = $(this).closest('tr');
stock_change.remove(); stock_change.remove();
mark_article_for_delivery( stock_change.data('id') ); mark_article_for_delivery( stock_change.data('id') );

View file

@ -5,12 +5,12 @@
var ordergroup = "#{escape_javascript(render('ordergroup'))}" var ordergroup = "#{escape_javascript(render('ordergroup'))}"
$(function() { $(function() {
$(document).on('click', 'a[data-remove-transaction]', function() { $(document).on('touchclick', 'a[data-remove-transaction]', function() {
$(this).parents('tr').remove(); $(this).parents('tr').remove();
return false; return false;
}); });
$(document).on('click', 'a[data-add-transaction]', function() { $(document).on('touchclick', 'a[data-add-transaction]', function() {
$('#ordergroups').append(ordergroup); $('#ordergroups').append(ordergroup);
return false; return false;
}); });

View file

@ -10,7 +10,7 @@
theme: 'facebook' theme: 'facebook'
}); });
$('#message_sent_to_all').click(function() { $('#message_sent_to_all').on('touchclick', function() {
if ($(this).is(':checked')) { if ($(this).is(':checked')) {
$('#recipients').slideUp(); $('#recipients').slideUp();
} else { } else {

View file

@ -36,7 +36,7 @@
update_delta(this); update_delta(this);
}); });
$(document).on('click', '#order_articles .unlocker', unlock_receive_input_field); $(document).on('touchclick', '#order_articles .unlocker', unlock_receive_input_field);
$(function() { $(function() {
$('input[data-units-expected]').each(function() { $('input[data-units-expected]').each(function() {

View file

@ -0,0 +1,72 @@
###!
Copyright (c) 2013 Derek Petersen https://github.com/tuxracer/touchclick MIT License
https://raw2.github.com/tuxracer/touchclick/3.0.1/src/touchclick.coffee
###
$ = if typeof jQuery is 'function' then jQuery else require 'jquery'
activeClass = 'touchactive'
preventDefaultClick = false
# Store a timestamp of when the last touch event occurred
lastTouched = 0
# Support devices with both touch and mouse (e.g. Windows 8, Chromebook Pixel)
ignoreEvent = (e) ->
currentTimestamp = Math.round (new Date()).getTime() / 1000
secondsSinceTouch = currentTimestamp - lastTouched
if e.type.match 'touchstart|touchmove|touchend'
lastTouched = currentTimestamp
secondsSinceTouch < 3 and e.type.match 'mouse'
getTouchclickEl = (target) ->
$targetEl = $ target
# For delegated events you can optionally provide an element
# that will have the active style added when touch is active
# by adding data-touchclick="true"
$touchclickEl = $targetEl.closest '*[data-touchclick="true"]'
if $touchclickEl.length
$touchclickEl
else
$targetEl
touchstart = (e) ->
getTouchclickEl(e.target).addClass(activeClass) unless ignoreEvent e
touchmove = (e) ->
getTouchclickEl(e.target).removeClass(activeClass)
touchend = (e) ->
$touchclickEl = getTouchclickEl e.target
if $touchclickEl.hasClass(activeClass) and not ignoreEvent e
e.type = 'touchclick'
$touchclickEl
.trigger(e)
.removeClass(activeClass)
events = (type) ->
$el = $ this
if preventDefaultClick
$el[type] 'click', (e) ->
e.preventDefault()
if window.navigator.msPointerEnabled
$el[type] 'MSPointerDown', touchstart
$el[type] 'MSPointerUp', touchend
else
$el[type] 'touchstart mousedown', touchstart
$el[type] 'touchmove mouseout', touchmove
$el[type] 'touchend mouseup', touchend
$.event.special.touchclick =
setup: ->
events.call this, 'on'
teardown: ->
events.call this, 'off'