ここで、タッチ デバイスの JavaScript タップ イベントのコードをいくつかピックアップしました: GitHub ページ。このコードはJørn Kinderåsの功績によるものです。
私の問題は、次のようなことをした場合です: $('.support input').tap(function () { $(this).click(); });
this
が参照しているため、機能しませんDOMWindow
( console.log(this)
.
私が見つけた回避策は、タップ イベント コードの数行を変更することです。私は以下を変更しました:
elem.on('touchend', _bind(function (e) {
endTime = new Date().getTime();
if (!didMove && ((endTime - startTime) < tapCancelTime)) {
callback(e);
}
}, this));
これに:
elem.on('touchend', _bind(function (e) {
endTime = new Date().getTime();
if (!didMove && ((endTime - startTime) < tapCancelTime)) {
elem.onTap = callback;
elem.onTap(e);
}
}, this));
全体elem.onTap = callback;
が汚いと感じるので、おそらくこれを行うためのより良い方法があると思います。
GitHub のソース コードは次のとおりです。
(function ($) {
"use strict"
$.fn.tap = function (callback) {
var version, didMove, tapCancelTime, startTime, endTime, _bind;
version = "1.0.1";
tapCancelTime = 2 * 1000;
_bind = function (fn, me) { return function () { return fn.apply(me, arguments); }; };
return this.each(
function (index, element) {
var elem = $(element);
elem.on('click', function (e) {
e.preventDefault();
});
elem.on('touchstart', _bind(function (e) {
didMove = false;
startTime = new Date().getTime();
}, this));
elem.on('touchmove', _bind(function (e) {
didMove = true;
}, this));
elem.on('touchend', _bind(function (e) {
endTime = new Date().getTime();
if (!didMove && ((endTime - startTime) < tapCancelTime)) {
callback(e);
}
}, this));
elem.on('touchcancel', _bind(function (e) {
callback(e);
}, this));
}
);
};
})(jQuery);