javascript - 事件监听器未触发?

标签 javascript html mouseevent addeventlistener

<分区>

我已尝试将两个事件监听器添加到我的外部脚本中,它们都可以作为附加到 HTML 元素的事件属性正常工作。

事件监听器是:

parent.addEventListener("mousemove", where(event));
parent.addEventListener("mouseleave", reset(event));

其余的代码可以在这里看到: https://codepen.io/rowancavanagh/pen/NBmPGv 或者在代码片段中:

window.onload = function() {
	var parent = document.querySelectorAll(".shadowed");
	var shadow = document.createElement("div");
	for (var i = 0; i < parent.length; i++) {
	  parent[i].appendChild(shadow);
	}
	parent.addEventListener("mousemove", where(event));
	parent.addEventListener("mouseleave", reset(event));
}

function where(e) {
	var x = e.offsetX / e.target.offsetWidth * 10 - 5;
	var y = e.offsetY / e.target.offsetHeight * 10 - 5;
	e.target.querySelector('.shadowed div').style.transform = 'translateX(' + x + 'px) translateY(' + y + 'px)';
}

function reset(e) {
	e.target.querySelector('.shadowed div').style.transform = 'translateX(0px) translateY(0px)';
}
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

html, body {
	height: 100%;
}

body {
	background-color: #eee;
	display: flex;
	justify-content: center;
	align-items: center;
}

.shadowed {
	position: relative;
	width: 400px;
	height: 240px;
	margin: 10px;
	background-color: #fff;
	border-radius: 5px;
}

.shadowed div {
	position: absolute;
	bottom: 0;
	right: 0;
	margin: 0 -10px -10px 0;
	width: calc(100% - 40px);
	height: calc(100% - 40px);
	background-color: #ddd;
	border-radius: 5px;
	z-index: -1;
	transform: translateY(0px) translateX(0px);
	transition: transform .1s ease-out;
}
<div class="shadowed"></div>

如您所见,他们应该在 mousemove 和 mouseleave 上触发几个函数,但实际上没有。

知道我做错了什么吗?

最佳答案

parent 是您使用的 NodeList document.querySelectorAll .您将需要使用 Array.prototype.forEachfor 循环将事件监听器添加到查询选择器选择的每个元素。如果只想匹配第一个元素,可以使用document.querySelector并以您已经完成的相同方式添加事件监听器,因为它将返回与选择器匹配的第一个元素。

改变

window.onload = function() {
    var parent = document.querySelectorAll(".shadowed");
    var shadow = document.createElement("div");
    for (var i = 0; i < parent.length; i++) {
      parent[i].appendChild(shadow);
    }
    parent.addEventListener("mousemove", where(event));
    parent.addEventListener("mouseleave", reset(event));
}

window.onload = function() {
    var parent = document.querySelectorAll(".shadowed");
    var shadow = document.createElement("div");
    for (var i = 0; i < parent.length; i++) {
      parent[i].appendChild(shadow);
    }
    parent.forEach(function(item){
      item.addEventListener("mousemove", where);
      item.addEventListener("mouseleave", reset);
    });
}

另外,您只需要将函数的名称提供给事件监听器即可;您不需要调用该函数(传入事件对象)。

改变

parent.addEventListener("mousemove", where(event));
parent.addEventListener("mouseleave", reset(event));

parent.addEventListener("mousemove", where);
parent.addEventListener("mouseleave", reset);

window.onload = function() {
	var parent = document.querySelectorAll(".shadowed");
	var shadow = document.createElement("div");
	for (var i = 0; i < parent.length; i++) {
	  parent[i].appendChild(shadow);
	}
  parent.forEach(function(item){
   	item.addEventListener("mousemove", where);
	  item.addEventListener("mouseleave", reset);
  });
}

function where(e) {
	var x = e.offsetX / e.target.offsetWidth * 10 - 5;
	var y = e.offsetY / e.target.offsetHeight * 10 - 5;
	e.target.querySelector('.shadowed div').style.transform = 'translateX(' + x + 'px) translateY(' + y + 'px)';
}

function reset(e) {
	e.target.querySelector('.shadowed div').style.transform = 'translateX(0px) translateY(0px)';
}
* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

html, body {
	height: 100%;
}

body {
	background-color: #eee;
	display: flex;
	justify-content: center;
	align-items: center;
}

.shadowed {
	position: relative;
	width: 400px;
	height: 240px;
	margin: 10px;
	background-color: #fff;
	border-radius: 5px;
}

.shadowed div {
	position: absolute;
	bottom: 0;
	right: 0;
	margin: 0 -10px -10px 0;
	width: calc(100% - 40px);
	height: calc(100% - 40px);
	background-color: #ddd;
	border-radius: 5px;
	z-index: -1;
	transform: translateY(0px) translateX(0px);
	transition: transform .1s ease-out;
}
<div class="shadowed"></div>

关于javascript - 事件监听器未触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885490/

相关文章:

javascript - 在滚动条上增加绝对顶部位置

javascript - 使用ajax和php时如何防止在服务器端多次提交上传

javascript - 具有重叠 div 的鼠标事件

html - 在 HTML 中将类别移至最右侧,将文章移至左侧

html - 链接 css 文件会破坏 html 表格格式

java - JMapViewer:setMovementMouseButton() 方法的奇怪行为

javascript - 移动鼠标光标 Javascript

javascript - Firefox 和 chrome constructor.prototype 之间的行为差​​异?

javascript - 从 JS 发布表单值数组

javascript - 在 Angular JS 中预填充 ng-repeat 内的下拉值