Benutzer:Schnark/js/gestures.js/jquery.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
(function ($) {
"use strict";
/*
This script implements a jQuery plugin for mouse gestures

Author: Schnark ([https://de.wikipedia.org/wiki/Benutzer:Schnark])
Version: 2.5
License: choose any of GFDL, CC-by-sa, GPL, MIT
Documentation: [[Benutzer:Schnark/js/gestures/jquery]]

Example:

$('#p-logo').gestures().on('gesture', function (e, shape, raw) {
	console.log(shape + ' (' + (raw ? 'numeric' : 'symbol') + ')');
});

$('#p-logo').gestures().on('gesture-A', function () {
	console.log('That was an "A"!');
});

$('body').gestures({d: 80}).on('gesture', function (e, shape, raw) {
	console.log(shape + ' (' + (raw ? 'numeric' : 'symbol') + ')');
});

*/
//<nowiki>

var gestures = {
	'1': '↙',
	'2': ['I', '↓'],
	'3': '↘',
	'4': ['-', '←'],
	'6': ['-', '→'],
	'7': '↖',
	'8': ['I', '↑'],
	'9': '↗',
	'46': ['↔', '⇆'],
	'64': ['↔', '⇄'],
	'28': ['↕', '⇵'],
	'82': ['↕', '⇅'],
	'84': '↰',
	'86': ['F', '↱'],
	'24': ['↲', '↵'],
	'26': ['L', '↳'],
	'62': ['T', '↴'],

	'12369874': ['O', '↺'],
	'123698741': ['O', '↺'],
	'23698741': ['O', '↺'],
	'236987412': ['O', '↺'],
	'36987412': ['O', '↺'],
	'369874123': ['O', '↺'],
	'69874123': ['O', '↺'],
	'698741236': ['O', '↺'],
	'98741236': ['O', '↺'],
	'987412369': ['O', '↺'],
	'87412369': ['O', '↺'],
	'874123698': ['O', '↺'],
	'74123698': ['O', '↺'],
	'741236987': ['O', '↺'],
	'41236987': ['O', '↺'],
	'412369874': ['O', '↺'],

	'47896321': ['O', '↻'],
	'147896321': ['O', '↻'],
	'14789632': ['O', '↻'],
	'214789632': ['O', '↻'],
	'21478963': ['O', '↻'],
	'321478963': ['O', '↻'],
	'32147896': ['O', '↻'],
	'632147896': ['O', '↻'],
	'63214789': ['O', '↻'],
	'963214789': ['O', '↻'],
	'96321478': ['O', '↻'],
	'896321478': ['O', '↻'],
	'89632147': ['O', '↻'],
	'789632147': ['O', '↻'],
	'78963214': ['O', '↻'],
	'478963214': ['O', '↻'],

	'93': 'A',
	'983': 'A',
	'923': 'A',
	'963': 'A',
	'832143214': 'B',
	'89632143214': 'B',
	'41236': 'C',
	'274': 'D',
	'2369874': 'D',
	'412361236': 'E',
	'896': 'F',
	'4123684': 'G',
	'4123694': 'G',
	'41236984': 'G',
	'29632': 'H',
	'2147': 'J',
	'21478': 'J',
	'29': 'K',
	'236': 'L',
	'8392': 'M',
	'838': 'N',
	'83214': 'P',
	'8963214': 'P',
	'874123693': 'Q',
	'832143': 'R',
	'89632143': 'R',
	'41214': 'S',
	'632': 'T',
	'23698': 'U',
	'39': 'V',
	'369': 'V',
	'2938': 'W',
	'3939': 'W',
	'369369': 'W',
	'2369823698': 'W',
	'349': 'X',
	'236982': 'Y',
	'616': 'Z',

	'92': '1',
	'963216': '2',
	'632143214': '3',
	'16': '4',
	'263214': '5',
	'1236987': '6',
	'61': '7',
	'412147874': '8',
	'41236982': '9',

	'63126': '?',
	'63236': '?',
	'13': '<',
	'31': '>',
	'969': '~'
},

modifiers = {
	16: 'shift',
	17: 'ctrl',
	18: 'meta'
};

function getDir (dx, dy) {
	var a = Math.atan2(dx, dy) / Math.PI;
	a = Math.floor(a * 4 + 11.5);
	return [7, 4, 1, 2, 3, 6, 9, 8][a % 8];
}

function action ($el, dirs, gestures) {
	if (dirs.length === 0) {
		return;
	}
	var gesture = dirs.join(''), i;
	$el.trigger('gesture#' + gesture);
	$el.trigger('gesture', [gesture, true]);
	gesture = gesture
		.replace(/4?(14)+1/g, '1').replace(/2?(12)+1/g, '1')
		.replace(/2?(32)+3/g, '3').replace(/6?(36)+3/g, '3')
		.replace(/4?(74)+7/g, '7').replace(/8?(78)+7/g, '7')
		.replace(/8?(98)+9/g, '9').replace(/6?(96)+9/g, '9')
		.replace(/212/g, '2').replace(/232/g, '2')
		.replace(/414/g, '4').replace(/474/g, '4')
		.replace(/636/g, '6').replace(/696/g, '6')
		.replace(/878/g, '8').replace(/898/g, '8')
		.replace(/([698])[42]1/g, '$11')
		.replace(/([987])[13]2/g, '$12')
		.replace(/([874])[26]3/g, '$13')
		.replace(/([741])[39]6/g, '$16')
		.replace(/([412])[68]9/g, '$19')
		.replace(/([123])[97]8/g, '$18')
		.replace(/([236])[84]7/g, '$17')
		.replace(/([369])[71]4/g, '$14');
	gesture = gestures[gesture];
	if (gesture) {
		if (Array.isArray(gesture)) {
			for (i = 0; i < gesture.length; i++) {
				$el.trigger('gesture-' + gesture[i]);
				$el.trigger('gesture', [gesture[i]]);
			}
		} else {
			$el.trigger('gesture-' + gesture);
			$el.trigger('gesture', [gesture]);
		}
	}
}

function makeHandler ($el, dSqr, mod, gestures) {
	var dirs, xOld, yOld, active = false;
	return function (e) {
		var x = e.pageX, y = e.pageY, dx, dy, dir;
		if (active) {
			if (e[mod]) {
				dx = x - xOld;
				dy = y - yOld;
				if (dx * dx + dy * dy > dSqr) {
					dir = getDir(dx, dy);
					if (dirs.length === 0 || dirs[dirs.length - 1] !== dir) {
						dirs.push(dir);
					}
					xOld = x;
					yOld = y;
				}
			} else { //!e[mod]
				active = false;
				action($el, dirs, gestures);
			}
		} else { //!active
			if (e[mod]) {
				dirs = [];
				active = true;
				xOld = x;
				yOld = y;
			}
		}
	};
}

$.fn.gestures = function (options) {
	var opt = $.extend({
			modifier: 'ctrl',
			d: 10,
			gestures: gestures
		}, options),
		handler = makeHandler(this, opt.d * opt.d, opt.modifier + 'Key', opt.gestures);
	$('body').on('keyup', function (e) {
		if (modifiers[e.which] === opt.modifier) {
			handler({});
		}
	});
	return this.on('mousemove', handler);
};

})(jQuery);
//</nowiki>