gpt4 book ai didi

javascript - 从外部函数绑定(bind)事件监听器

转载 作者:行者123 更新时间:2023-11-28 18:46:27 25 4
gpt4 key购买 nike

如何从 init 函数外部触发 init 内的重置函数。

我希望我的重置函数能够重置从绑定(bind)了 3 次的图像集合(本例中为 3 个)中设置的所有变量。我知道我这里的例子不起作用。

这是我的代码:

    document.getElementsByClassName('zoomer-start')[0].addEventListener('click', init);

document.getElementsByClassName('zoomer-reset')[0].addEventListener('click', reset);

function init() {
var images = document.querySelectorAll('.zoomer-img');

for (var i = 0; i < images.length; i++) {
(function() {
var image = images[i];

var zoomer = new Hammer(image);

zoomer.get('pinch').set({enable: false});
zoomer.get('pan').set({enable: false});

var clicked = false;

var adjustScale = 1;
var adjustDeltaX = 0;
var adjustDeltaY = 0;

var currentScale = null;
var currentDeltaX = null;
var currentDeltaY = null;

zoomer.on('tap', function (e) {
if (!clicked) {
zoomer.get('pinch').set({enable: true});
zoomer.get('pan').set({enable: true, direction: Hammer.DIRECTION_ALL});
clicked = true;
} else {
zoomer.get('pinch').set({enable: false});
zoomer.get('pan').set({enable: false});
clicked = false;
}

if (currentScale > 1) {
adjustScale = 1;
adjustDeltaX = 0;
adjustDeltaY = 0;
} else {
adjustScale = 2;
}

currentScale = adjustScale * e.scale;
currentDeltaX = adjustDeltaX + (e.deltaX / currentScale);
currentDeltaY = adjustDeltaY + (e.deltaY / currentScale);

image.style.transform = 'scale(' + currentScale + ') translate3d(' + currentDeltaX + 'px, ' + currentDeltaY + 'px, 0)';
});

zoomer.on('pan pinch', function (e) {
currentScale = Math.max(1, Math.min(adjustScale * e.scale, 4));
currentDeltaX = adjustDeltaX + (e.deltaX / currentScale);
currentDeltaY = adjustDeltaY + (e.deltaY / currentScale);

var scaledX = ((((image.width * currentScale) / 2) - (image.width / 2)) / currentScale);
if (currentDeltaX > scaledX)
currentDeltaX = scaledX;
if (currentDeltaX < -scaledX)
currentDeltaX = -scaledX;

var scaledY = ((((image.height * currentScale) / 2) - (image.height / 2)) / currentScale);
if (currentDeltaY > scaledY)
currentDeltaY = scaledY;
if (currentDeltaY < -scaledY)
currentDeltaY = -scaledY;

image.style.transform = 'scale(' + currentScale + ') translate3d(' + currentDeltaX + 'px, ' + currentDeltaY + 'px, 0)';
});

zoomer.on('panend pinchend', function () {
adjustScale = currentScale;
adjustDeltaX = currentDeltaX;
adjustDeltaY = currentDeltaY;
});

function reset() {
zoomer.get('pinch').set({enable: false});
zoomer.get('pan').set({enable: false});

clicked = false;

adjustScale = 1;
adjustDeltaX = 0;
adjustDeltaY = 0;

currentScale = null;
currentDeltaX = null;
currentDeltaY = null;

image.style.transform = 'scale(' + 1 + ') translate3d(' + 0 + 'px, ' + 0 + 'px, 0)';
}
})();
}
}

最佳答案

要从内部作用域调用函数,您必须以某种方式将其传递到周围的作用域。您的代码的一个可能的示例:

var resets = [];
function init() {
[...]
for (var i = 0; i < images.length; i++) {
(function() {
[...]
resets[i]=function reset() {
[...]
})

然后天真地调用它们:

resets[0](); resets[1](); resets[2];

或通过:

resets.forEach(function(f) { f(); } );

关于javascript - 从外部函数绑定(bind)事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35240515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com