【问题标题】:Toggling an html IMG element's class using JS (no Jquery)使用 JS(无 Jquery)切换 html IMG 元素的类
【发布时间】:2016-01-26 11:25:48
【问题描述】:

我放弃...您所有的答案只是针对本地元素的不同方式。

如果您费心实际阅读我所说的内容,您会意识到这与我已有的代码无关,只是该代码不适用于 IMG 标签。

在试图展示我的问题时(并且您的解决方案都没有与已经发生的事情有任何不同),我发现我可以通过将灰度滤镜应用于放置在每个图像上的 DIV 元素来实现我想要的.然后,鼠标悬停事件会触发 DIV 元素中的不透明度更改。

我想要的有点重,但它回答了我的实际问题。答案是:

是的,可能有一种方法可以切换 IMG 标签的类别。但是不,如果不引起争论或被告知我正在使用“错误代码”,我可能不会在这里找到它。所以是的,定位 DIV 元素更容易、更有效。

顺便说一句,页面加载时间与数据包的大小有关。较大的数据包(图像、html/css/js 文档等)需要更长的下载时间,因此页面需要更长的加载时间。我正在尝试创建的网站证明了这一论点,我有一个几乎完整且(几乎)功能齐全的网站,其中包含大量“聪明”的小效果,全部小于 20mb,其中大约 15mb 是图像。该网站简洁明了,托管在我的三星 Galaxy Tab 4(使用木瓜)上,几乎可以立即加载。

这就是我所说的“我希望它非常精简”的意思。感谢大家的帮助,很遗憾我无法让任何人了解发生了什么。

【问题讨论】:

  • 就从 JS 引用它而言,它是 div 还是 img 元素应该没有任何区别,但无论哪种方式,您都不需要任何 JS,您可以只使用悬停效果CSS。话虽如此,请尝试onClick="colorFunction(this)";
  • 我也会这么想,但显然这不适用于 IMG 元素。我会尝试记录它发生的事情并上传到YouTube或其他东西,这太奇怪了!我不知道您可以在 CSS 中编写鼠标悬停过渡效果?
  • IMG 元素没有什么神奇之处。忘记 YouTube,更新您的问题以显示您的实际代码(而不是孤立地显示 onClick=... 部分 - 这是您的 img 标签中的一个属性,或者......?并考虑在 jsfiddle.net 提供问题的演示。
  • 问题不在于它对图像有效或无效,您传递给 onclick 处理程序的引用有问题。解决方案在于找出如何正确地将 img 元素作为参数传递给 onclick 函数。
  • 从具有 id 属性的元素中自动创建全局变量,是 IE 引入的坏习惯(出于兼容性原因,后来一些浏览器也被复制了)——但这并不正确。因此,没有在您的代码中没有名为image1 的变量,因此undefined 被传递给您的函数——因此导致您看到的错误。您可以使用<img onclick="colorFunction(this)"> 直接传递元素,也可以将id 作为字符串值传递,然后在函数中使用document.getElementById 来获取对元素的引用。

标签: javascript html css image


【解决方案1】:

如果您将onClick 添加到不需要传递任何内容的图像元素,您将收到包含所有信息的MouseEvent。您需要来自事件的target

我建议不要在元素上使用onClick,因为它不可扩展,你必须将它添加到所有元素中。最好将侦听器添加到包装/容器元素,然后通过某些属性过滤目标,例如data-something 请检查fiddle

所以你有包装元素和图像:

<div class="images-container">
  <img src="https://placeholdit.imgix.net/~text?txtsize=33&txt=350%C3%97150&w=350&h=150" data-toggleable class="thumb-gray thumb-color" />
  <img src="https://placeholdit.imgix.net/~text?txtsize=33&txt=350%C3%97150&w=350&h=150" data-toggleable class="thumb-gray" />
  <img src="https://placeholdit.imgix.net/~text?txtsize=33&txt=350%C3%97150&w=350&h=150" data-toggleable class="thumb-gray" />
</div>

然后你将监听器附加到你的 wrapping 元素上。这是最佳实践,因为您无需将侦听器附加到每个元素,同时您可以轻松扩展您的解决方案

var imagesContainerEl = document.querySelector('.images-container');

imagesContainerEl.addEventListener('click', function(event) {
    var element = event.target;
    if (element.hasAttribute('data-toggleable')) {
      element.classList.toggle('thumb-color');
  }
});

可以扩展相同的代码以支持mouseovermouseout。检查fiddle2。一个功能来统治他们并在黑暗中束缚他们..

var imagesContainerEl = document.querySelector('.images-container');

imagesContainerEl.addEventListener('mouseover', onToggleImage);
imagesContainerEl.addEventListener('mouseout', onToggleImage);


function onToggleImage(event) {
    var element = event.target;
    if (element.hasAttribute('data-toggleable')) {
      element.classList.toggle('thumb-color');
  }
}

还更新了fiddle,它展示了如何制作图像灰度/彩色

【讨论】:

  • 此解决方案将立即将效果应用于图像容器中的所有图像(DIV 元素)。我一直在使用的代码做同样的事情并且占用更少的空间(看起来也更干净更简单)。这不是我想要达到的。请允许我正在做几分钟来展示我遇到的问题,然后人们可以称我为愚蠢或告诉我我正在使用“错误代码”,但前提是他们可以提供更好的解决方案(那不是以不同的方式做同样的事情)。
  • 这个解决方案适用于图像、div 和任何你想要的东西。我会争论清洁和简单,但这不是主题。下次在提问之前考虑提供适当的示例和解释。
  • 不确定您所说的“正确示例”是什么意思。我尝试使用 JSFiddle 来演示我的问题,将我正在使用的 EXACT 代码复制并粘贴到相关框中,您知道吗,该代码有效!然后我尝试保存所有页面并在 chrome 中打开画廊页面,即 firefox 和 safari,我遇到了和以前一样的问题。控制台中没有效果和错误消息。此外,我尝试了您的“解决方案”,正如我所说,它似乎将效果添加到 DIV 包装器内的所有图像。它无法区分图像。
  • 如果您不想对所有图像应用效果,那么只需从不应受到影响的图像中删除data-toggleable。我已经编辑了我的答案并添加了新的小提琴,它展示了如何在悬停时制作灰度/彩色图片。
【解决方案2】:

是您在问题中所指的

onClick="colorFunction(image1)"

一个 内联 javascript 事件监听器?

如果是这样,请尝试将其替换为:

onClick="colorFunction(this)"

并将colorFunction()改写为:

function colorFunction(image) {
    image.classList.toggle('thumb-color');
}

【讨论】:

  • 从互联网自学,不知道什么是“内联 javascript 事件监听器”。我会尝试您的建议并尝试找出您的意思(笑)。
  • 通常事件侦听器是您在页面/项目的脚本部分中注册 dom 元素的函数,例如:.addEventListener('click', function(event){}); “内联”版本是您在 html ->“内联”中使用的 onclick="" 属性。 @100000011
  • 这行不通。如果您像这样调用colourFunction()this 将不是元素。
  • 谢谢,@nnnnnn,我不太熟悉 inline javascript 的工作原理,因为我习惯于只不显眼地部署 addEventListener。帖子已更新。
  • @Tariq - 不,没关系,@nnnnnn 是对的。他评论后我更新了帖子。之前,它显示为:onClick="colorFunction()"this.classList.toggle('thumb-color');(...如果您不使用内联事件侦听器,而是不显眼地添加事件侦听器...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多