我如何在香草javascript中:选择器,事件和$(this)的需要
How do I in vanilla javascript: selectors,events and the need of $(this)
我有三张span.main{overflow:hidden}
裁剪的照片。用户可以通过触摸事件平移跨度,并探索图片的隐藏部分。
到目前为止的代码:
document.addEventListener('DOMContentLoaded', function() {
var box = document.querySelector('.main');
box.addEventListener("touchstart", onStart, false);
box.addEventListener("touchmove", onMove, false);
box.addEventListener("touchend", onEnd, false);
});
var startOffsetX, startOffsetY;
var moving = false;
function getPos(ev) {
return {
x: ev.touches ? ev.touches[0].clientX : ev.clientX,
y: ev.touches ? ev.touches[0].clientY : ev.clientY
};
}
function onStart(ev) {
moving = true;
var box = document.querySelector('.main');// I need something like $(this)
var pos = getPos(ev);
startOffsetX = pos.x + box.scrollLeft;
startOffsetY = pos.y + box.scrollTop;
if (ev.preventDefault)
ev.preventDefault();
else
ev.returnValue = false;
}
function onMove(ev) {
if (moving) {
var pos = getPos(ev);
var x = startOffsetX - pos.x;
var y = startOffsetY - pos.y;
var box = document.querySelector('.main'); // I need something like $(this)
box.scrollLeft = x;
box.scrollTop = y;
if (ev.preventDefault)
ev.preventDefault();
else
ev.returnValue = false;
}
}
function onEnd(ev) {
if (moving) {
moving = false;
}
}
问题是,只有第一个缩略图能按预期工作。我试过:
-querySelector只返回第一个元素,所以如果我添加ID,querySelector('#box1,#box2,#box3')
应该可以工作。Nein。我想我在函数上有个"这个"问题。。。
-将活动(正如苹果公司所建议的)内联<div class="box" onStart="ontouchstartCallback( ev);" ontouchend="onEnd( ev );"ontouchmove="onMove( ev );" > <img></div>
看起来像是一个解决方案。。。我猜,又是因为"这个"。。。
您需要使用querySelectorAll
方法。它返回子树中所有匹配的元素,而不是只返回第一个元素(querySelector
就是这样做的)。然后使用for
循环遍历它们。
var elements = document.querySelectorAll('.main');
for (var i = 0, ii = elements.length; i < ii; ++i) {
var element = elements[i];
element.ontouchstart = onStart;
// ...
}
您可以采取的另一种方法(可能是更好的方法)是使用事件委派,在父元素上设置事件侦听器,并通过检查每个事件的target
属性来决定要处理哪些图片。
<div id="pictures">
<span class="main"><img /></span>
<span class="main"><img /></span>
<span class="main"><img /></span>
</div>
var parent = document.getElementById('pictures');
parent.ontouchstart = function (e) {
var box = e.target.parentNode; // parentNode because e.target is an Image
if (box.className !== 'main') return;
onStart(e, box);
};
相关文章:
- jQuery的等价物's$(this)在Ractive.js事件代理中
- 如何确定$(this)是否在单击事件的数组中
- 组合类和事件监听器:`this`关键字
- 表单提交事件中this.submit()的行为
- 如何使用.bind(this)删除对象的事件侦听器
- $(this.el).find()在事件处理程序中工作,而不是在初始化函数(主干.js)中工作
- extjs中事件处理程序函数中的THIS上下文
- 为什么 DOM 事件处理程序中的嵌套函数会修复“this”绑定
- 使用 RequireJS 和 JQuery onclick 事件处理“this”
- Angular ES6,THIS,Scope和EL在JQLITE点击事件中全部未定义
- 事件处理函数不适用于“this”关键字
- ReactJS:在 JQuery 事件侦听器函数中调用 'this'
- 将点击的事件“this”传递给另一个函数,这是正确的做法
- 使用 $(this) 的事件
- 如何在 onClick 事件调用的函数中使用 $(this)
- 全局范围 - 在触发事件侦听器后访问“this”
- 从原型中的事件访问“this”
- 在Javascript中,在IE8中,附加到事件中的Object方法将“窗口对象”而不是对象本身保留在“this”
- this.value 在从 onchange 事件调用函数时显示为 undefind
- 处理 jQuery 事件时在 JavaScript 类中覆盖的 'this' 关键字