this
イベントハンドリング関数でイベントを受け取る要素に変更されるという値を持つことは非常に便利であることを知っています。ただし、要素コンテキストではなく、常にアプリケーション コンテキストで関数が呼び出されるようにしたいと考えています。setTimeout
このようにして、それらをイベント ハンドラーとして使用したり、呼び出しなどの他の方法で使用したりできます。
したがって、次のようなコード:
window.app = (function () {
var that = {
millerTime: function () {},
changeEl: function (el) {
el = el || this;
// rest of code...
that.millerTime();
}
};
return that;
}());
次のようになります。
window.app = (function () {
return {
millerTime: function () {},
changeEl: function (el) {
// rest of code...
this.millerTime();
}
};
}());
最初の方法は、私には混乱しているように見えます。イベントを受け取る要素を最初の引数 (できれば jQuery でラップされた要素) としてイベント処理関数に渡し、コンテキスト内で呼び出す簡単な方法はありますapp
か? jQuery を使用して一連のイベント ハンドラーをバインドするとします。匿名関数を常に含める必要はありません。
$('body').on('click', function (event) {
app.changeEl.call(app, $(this), event); // would be nice to get event too
});
これをすべて処理してくれる単一の関数が必要です。この時点で、匿名関数を渡すことはできないように感じますが、誰かが解決策を持っているかどうかを知りたいだけです。
私の試み:
function overrideContext (event, fn) {
if (!(this instanceof HTMLElement) ||
typeof event === 'undefined'
) {
return overrideContext;
}
// at this point we know jQuery called this function // ??
var el = $(this);
fn.call(app, el, event);
}
$('body').on('click', overrideContext(undefined, app.changeEl));
編集:(Function.prototype.bind
私は初めてです)を
使用しても、まだ要素を取得できません:
window.app = (function () {
return {
millerTime: function () {},
changeEl: function (el) {
// rest of code...
console.log(this); // app
this.millerTime();
}
};
}());
function overrideContext (evt, fn) {
var el = $(this); // $(Window)
console.log(arguments); // [undefined, app.changeEl, p.Event]
fn.call(app, el, event);
}
$('body').on('click', overrideContext.bind(null, undefined, app.changeEl));
$('body').on('click', overrideContext.bind(app.changeEl));
代わりに使用すると、関数をthis
指し、引数の長さは 1 で、 のみが含まれます。どちらのインスタンスでもまだ要素を取得できません。app.changeEl
p.Event