- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在学习 javascript(?),我遇到了这种情况,我真的找不到直接的答案。
所以我在一个 html 页面中有这些段落,我想为其更改背景颜色,我正在使用的代码是这样的:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p')
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
(function(paragraph) {
div2paragraphs[paragraph].onmouseover = function(){
this.setAttribute('style', `background-color: ${colors[paragraph]}`)}
div2paragraphs[paragraph].onmouseout = function(){
this.setAttribute('style', 'background-color: white')}
})(paragraph);
}
我也不太明白这里发生了什么,我只是想用整个“function(){}”来做这件事(据说是匿名函数?),但显然有一种叫做javascript 中的 IIFE,因此您必须包装函数并传递一个唯一变量以使其每次都在循环中运行,但我仍然不明白为什么我必须以“(段落)”结尾。
我在想是否可以通过为每个 setAttribute 操作创建一个函数来做同样的事情,所以我试着这样写:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p')
function changeToColor(color) {
this.setAttribute('style', 'background-color: ' + color);
}
function changeBackWhite() {
this.setAttribute('style', 'background-color: white');
}
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = changeToColor('red');
div2paragraphs[paragraph].onmouseout = changeBackWhite;
}
但无论我做什么,它总是会出现错误:
Uncaught TypeError: this.setAttribute is not a function
或类似的东西。我认为这与这些情况有关,如果您添加括号,它会在执行其他任何操作之前调用该函数?所以它不知道“这个”是什么?我不太明白,但无论如何我对如何用单独的函数编写我在上面所做的同样的事情一无所知。有人能够阐明这一点......吗?
我更习惯使用 Python,所以显然有一些不同的基本概念......
PS:下面这两个例子有什么区别?
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function() {
this.style['background-color'] = colors[paragraph];
}
div2paragraphs[paragraph].onmouseout = function() {
this.style['background-color'] = 'white';
}
}
还有这个
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function(){
this.setAttribute('style', `background-color: $(colors[paragraph]`)
}
div2paragraphs[paragraph].onmouseout = function(){
this.setAttribute('style', 'background-color: white')
}
}
为什么第一个(由 ibrahim mahrir 提供)有效而第二个无效?
最佳答案
在第一个代码示例中,IIFE循环内部是完全无用的,因为您已经在使用尊重 block 作用域的 let
,所以 this problem不会发生。以下代码可以正常工作:
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function() {
this.style['background-color'] = colors[paragraph];
};
div2paragraphs[paragraph].onmouseout = function() {
this.style['background-color'] = 'white';
};
}
注意:您不需要使用setAttribute
来设置style
属性。直接做就行了。
演示:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p');
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = function() {
this.style['background-color'] = colors[paragraph];
};
div2paragraphs[paragraph].onmouseout = function() {
this.style['background-color'] = 'white';
};
}
<div id="div2">
<p>AAAA</p>
<p>BBBB</p>
<p>CCCC</p>
</div>
至于第二个代码示例,您的函数需要返回其他函数以指定为事件监听器。例如 changeColor
应该这样定义:
function changeToColor(color) {
return function() {
this.style['background-color'] = color;
}
}
changeColor
返回的匿名函数将被分配给事件监听器。在您的代码中,changeColor
未返回任何内容,因此 undefined
已附加到事件监听器。此外,changeColor
本身不是事件监听器(它只是一个创建事件监听器并返回它的函数),所以它里面的 this
将是全局对象 窗口
。 window
没有名为 setAttribute
的方法,因此出现错误。
此外,您不需要 changeBackWhite
,您可以对两者都使用 changeColor
(由 closures 提供),如下所示:
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = changeToColor(colors[paragraph]);
div2paragraphs[paragraph].onmouseout = changeToColor('white');;
}
演示:
var colors=['red','pink','blue'];
var div2paragraphs = document.querySelectorAll('#div2 p');
function changeToColor(color) {
return function() {
this.style['background-color'] = color;
}
}
for (let paragraph = 0; paragraph < div2paragraphs.length; paragraph++) {
div2paragraphs[paragraph].onmouseover = changeToColor(colors[paragraph]);
div2paragraphs[paragraph].onmouseout = changeToColor('white');;
}
<div id="div2">
<p>AAAA</p>
<p>BBBB</p>
<p>CCCC</p>
</div>
关于javascript - 如何在函数中为 this.setattribute 传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52691584/
request.setAttribute 和 request.getSession().setAttribute() 有什么区别? 它们存储在哪里以及以什么格式? 最佳答案 区别: 当您使用reque
session.setAttribute 和 request.setAttribute 有什么区别? 最佳答案 范围,session属性住所有的session而request属性只在一个请求中 关于j
我一直热衷于重置我的一个 jsp 页面上的一些验证错误。这是一个我无法再联系到的人(死亡或无法联系)继承的项目。我有一个 jsp 页面,其中包含许多自定义标记库,其中更多页面被添加为选项卡,父页面具有
当您从请求和 getServletContext() 调用它们时,get/setAttribute() 之间有什么区别。我注意到你需要 RequestDispatcher rd = request.g
所以我正在学习操作 DOM,并且我注意到一件有趣的事情: 假设我想使用“.”设置元素的 name 属性。点符号: element.name = "someName"; console.log(docu
HttpServletRequest类的setAttribute()方法和HttpSession类的setAttribute()方法有什么区别? 在什么情况下使用? 最佳答案 一个在请求范围内设置一个
为什么我们要使用setAttribute()方法来设置ServletContext参数,因为我们可以通过在web.xml中设置参数并使用getInitParameter()来获取它们来完成相同的工作?
我在 setAttribute() 方面遇到问题。我已经搜索过互联网和这个网站,但他们没有解决我的问题。我想用 javascript 更改图片的宽度和高度,但它不起作用。请帮助我。
在学校,我的老师将我的代码更改为下面的示例它不起作用,我无法理解它是如何工作并修复它的。 function _$(e, attrs) { var el = document.createEle
我有三个元素,我正在尝试为每个元素设置属性: const foldable = document.getElementsByClassName('foldable') let result = Arr
我正在尝试使用 object3D.lookAt 属性更改图像的视角。目前我正在尝试使用组件的 update() 方法更改图像的方向。这是通过更新我的组件的 Lookat 属性来实现的。 functio
我有一些有效的 SVG 代码,可以通过在形状上设置属性来处理鼠标事件: function plot() { ... shape.setAttributeNS(null, "onmouseove
我使用的表单会根据您单击单选按钮的选项来显示一些 div。 问题是 div 设置为不显示,除非我选择一个选项。 所以我添加了以下函数,以确保如果显示 div,它将具有具有所需属性的形式。 所以我给出这
此代码嵌套在 ascx 控件中。 onclientclick 事件有效并且没有错误,但标签文本没有更改?我错过了什么?
同样,我在使用 setAttribute 时遵循我的引用书和在线引用:它根本不起作用; HTML:
这是一些 HTML: lorem Lorem, ipsum dolor sit amet consectetur adipisicing elit. Eaque magnam expedit
我一直在以不同的方式创建元素,但不确定最佳方法。有什么区别: var myselect = document.createElement("select"); myselect.name="blah"
这里我稍微修改了代码 https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_doc_getelementsbyname_loop 来自
我在为另一个元素设置属性时遇到问题。 我正在使用带有 JS 和 HTML 的 PHP 代码,它看起来像: $value 你一定知道我有两个元素。我用于编写文本的第一个('content')和另一个('
我是 Javascript 的新手,我不知道如何在选定的选项上使用 setAttribute。 我的 html 中有一个 id = employee 的 select 元素(使用 javascript
我是一名优秀的程序员,十分优秀!