当前位置: 首页 > 知识库问答 >
问题:

javascript - 为什么当点击其他选项值时,不执行change事件中的代码?

狄玮
2024-01-26

你好,小白不懂求问。请问有一个产品,有多个颜色变体选项,每个变体选项有多张图片,但是在产品详情页上,选中一个颜色变体值,它会展示所有颜色变体的图片。如何通过图片的alt值,实现当选中某个颜色变体值,只展示对应的颜色图片,而其他颜色变体值对应的图片隐藏起来?

//我按youtube上的方法,先将style.dispaly="none",让thumbnail-alt={{ media.alt }},这样当我选中另一个颜色变体的值时,需要刷新网页,对应的图片才能展示出来。

{% for media in product.media %}{%- assign imgNo = forloop.index0 -%}{% case media.media_type %}{% when 'image' %} <{%- if settings.enable_lightbox -%}a href="{{ media | img_url: 'master' }}"{% else %}div{% endif %} {% if product.selected_or_first_available_variant.featured_image.alt != media.alt and product.selected_or_first_available_variant.featured_image.alt != blank %}    style="display:none"  {% endif %}    thumbnail-alt={{ media.alt }}

//然后再添加当选项改变时的代码,来更新对应的图片、价格等信息,以下代码中的_filterImgVariant是我新构造的函数来实现我想要的效果。但是它不起作用。

  /*** Event handler for when a variant input changes. */    _onSelectChange: function() {      var variant = this._getVariantFromOptions();      this.$container.trigger({        type: 'variantChange',        variant: variant      });      if (!variant){        return;      }      this._updateMasterSelect(variant);      this._updateImages(variant);      this._filterImgVariant(variant);      this._updatePrice(variant);      this._updateSKU(variant);      this.currentVariant = variant;      if (this.enableHistoryState) {        this._updateHistoryState(variant);      }    },    _filterImgVariant: function(variant){      if(this.currentVariant.featured_image && this.currentVariant.featured_image.alt){        document.querySelectorAll('[thumbnail-alt]').forEach(img => img.style.display = "none")        const currentImgAlt = this.currentVariant.featured_image.alt        const thumbnailSelector = '[thumbnail-alt = '${currentImgAlt}']'        document.querySelectorAll('[thumbnail-alt]').forEach(img => img.style.display = "block")       }      else {        document.querySelectorAll('[thumbnail-alt]').forEach(img => img.style.display = "block")      }    },    _updateImages: function(variant){      var variantImage = variant.featured_image || {};      var currentVariantImage = this.currentVariant.featured_image || {};      if (!variant.featured_image || variantImage.src === currentVariantImage.src){ return; }      this.$container.trigger({type: 'variantImageChange', variant: variant });    },    _updatePrice: function(variant){      if (variant.price === this.currentVariant.price && variant.compare_at_price === this.currentVariant.compare_at_price){ return; }      this.$container.trigger({ type: 'variantPriceChange', variant: variant });    },

请问各位前辈,我新添加的_filterImgVariant存在什么问题它为什么不起作用。当我选择其他的颜色变体值时,仍然需要重新刷新网页才能展示对应的图片。我不知道问题在哪儿。

共有1个答案

申思远
2024-01-26

首先,你的代码看起来有些问题。你在_filterImgVariant函数中试图获取当前选中的variant的featured_image的alt属性,然后在querySelectorAll中选择匹配这个alt的元素并显示它。然而,你的querySelectorAll语句中的字符串拼接似乎有些问题,你需要在字符串内使用模板字符串(${...})而不是直接拼接字符串。

另外,你的代码中,当this.currentVariant.featured_image.alt存在时,你隐藏了所有图片,然后显示了当前选中的图片。但是,你并没有在隐藏所有图片后重新显示当前选中的图片。你应该先隐藏所有图片,然后再显示当前选中的图片。

以下是我对你的代码的修改:

_filterImgVariant: function(variant){  if(variant.featured_image && variant.featured_image.alt){    document.querySelectorAll('[thumbnail-alt]').forEach(img => img.style.display = "none")    const currentImgAlt = variant.featured_image.alt    const thumbnailSelector = `[thumbnail-alt = '${currentImgAlt}']` // 使用模板字符串进行字符串拼接    document.querySelectorAll(thumbnailSelector).forEach(img => img.style.display = "block")   }  else {    document.querySelectorAll('[thumbnail-alt]').forEach(img => img.style.display = "block")  }}

此外,你可能还需要注意,你在_updateImages函数中只是触发了'variantImageChange'事件,但并没有实际更新图片。你可能需要在触发事件后手动调用_filterImgVariant函数来更新图片。

希望这些信息能帮到你!如果你还有其他问题,欢迎继续提问。

 类似资料:
  • 问题内容: 当值由设置时,事件处理程序中的逻辑未运行,但当用户使用鼠标选择值时,该逻辑确实运行。为什么是这样? 问题答案: 因为该事件需要由用户而不是通过JavaScript代码启动的实际浏览器事件。 而是这样做: 要么

  • 我运行这段代码的时候,点击部件就会出现 Uncaught TypeError: Cannot read properties of undefined (reading 'position')at VertexEnumerator.js:87:28 这样的错误

  • 我正在使用Primefaces 3.5数据表。该表已启用多重选择模式。基本上,该表与[本次展示][1]中的最后一个表相同。表的定义如下 因此,当用户通过单击复选框选择一些行,然后意外地单击一行时,除了用户最后单击的那一行之外,所有选中的行都将被取消选中。 问题是:是否有任何解决方法来维护选中的行,即使用户将单击该行的“退出”复选框? 我的一些观察: 如果用户按Ctrl键并单击该行,则所有其他行都将

  • 问题内容: 因此,我一直在编写一个简单的3D GUI应用程序,旨在让用户只需双击JAR文件即可使用。在将其放入JAR文件之前,它可以正常工作,并且在命令提示符下运行时(在jar文件的目录中键入“ java -jar Modeler.jar”),可以在JAR文件中使其完美运行。但是,当我双击它时,什么也没有发生。它运行完美,没有命令提示符下的错误。我从经验中知道,没有显示启动时的崩溃报告,因为控制台

  • 进程优先权 当计划线程时使用的优先权。在有需要时可调整优先权到较高或较低。 文件位置 你可以为不同的文件类型改变文件夹。在默认情况下,大部分的文件设置在设置位置。然而, 一些文件是保存在 profiles目录和全部日志文件保存在 logs 目录。 文件关联(只限于完整版本) 文件关联是 Navicat 使用什么来打开 Navicat 已保存的文件。例如:.npt 文件(数据传输设置文件)将会使用数

  • 问题内容: 我正在使用。 我得到的正确值,即最大日期。 但是对于我来说,当我真的想要第三条记录(具有最大日期值的记录)中的“ ta3”值时,只需获取第一条记录的值即可,即“ ta1”。 例如 问题答案: 您需要GROUP BY子句或更复杂的查询。 对于示例数据,这将返回3行。 您更有可能想要: 对于示例数据,这将返回1行: 在主要的DBMS中,当select-list中包含聚合列和非聚合列的混合时