【问题标题】:All Browsers except Firefox don't react to jQuery .click()除 Firefox 之外的所有浏览器都不响应 jQuery .click()
【发布时间】:2021-07-09 10:07:19
【问题描述】:

我有以下 HTML/Twig 结构

            <select name="herstellerSelect" class="categoryElement" id="herstellerDropdown" style="display: block;">
               <option class="preselect" value="" style="display: block;">Hersteller wählen</option>
                {{ _self.cpitems0(categories.categories, categories.categories_info, parts, oop_display, oop_opened) }}
            </select>

Twig 宏“cpitems0”为

生成元素

这是 jQuery 代码,除其他事项外,一旦子级(&lt;select&gt;&lt;option&gt; 元素)被点击,它就会向控制台输出文本。

$(document).ready(function() {

console.log('CATEGORY SELECTOR TEST');

$("#herstellerDropdown").children().click(function(e) {
e.preventDefault();

console.log('CATEGORY SELECTOR TEST 2');

...

我也试过

$(document).ready(function() {

console.log('CATEGORY SELECTOR TEST');

$("#herstellerDropdown").on('click', '> *', function(e) {
e.preventDefault();

console.log('CATEGORY SELECTOR TEST 2');

...

只有 Firefox(私有模式和清除浏览器缓存)显示第二个 console.log 输出,所有其他测试的浏览器(Brave、Chromium、Opera Developer 在私有模式下,在 Ubuntu 20.4 上清除浏览器缓存)只显示第一个控制台。日志输出

有人知道为什么会这样吗?

更新 14.10.2021 14:20 -> 我必须使用 $("#herstellerDropdown").on("change" ... ) 而不是 .$("#herstellerDropdown") .click 因为它是一个元素。

一般来说,我必须使用“AJAX 级联下拉菜单”来实现应该实现的功能。我以为我可以避免 AJAX 并将服务器生成的内容加载到 DOM 中并使用 $("selectElement").html(elements) 复制相应的元素,但我想这会导致性能不佳和设计不佳,所以我必须使用级联下拉菜单!

【问题讨论】:

  • 请点击edit 并发布您的尝试minimal reproducible example,使用[&lt;&gt;] sn-p 编辑器记录输入和预期输出。这不是树枝问题,所以请只发布干净的 HTML 和 JS
  • 您可以一次性加载所有下拉内容集而不使用 Ajax,但您可能需要 Ajax

标签: html jquery cross-browser


【解决方案1】:
  1. 使用 on("change" 而不是 click
  2. 选项不需要 ID
  3. 为什么要显示:阻止?
  4. 为什么要使用 preventDefault() ?

这适用于 Chrom(e/ium) 和 Fx

$(function() {
  $("#herstellerDropdown").on("change", function(e) {
    console.log(this.value)
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name="herstellerSelect" class="categoryElement" id="herstellerDropdown">
  <option class="preselect" value="" style="display: block;">Hersteller wählen</option>
  <option data-val-one="Key0" data-val-two="" data-val-three="" value="entry0">categories_info[keyZero].elementid 0</option>
  <option data-val-one="Key1" data-val-two="" data-val-three="" value="entry1">categories_info[keyZero].elementid 1</option>
  <option data-val-one="Key2" data-val-two="" data-val-three="" value="entry2">categories_info[keyZero].elementid 2</option>
</select>

【讨论】:

  • 谢谢,我已经更改了,我不需要 display: block 和 ID,最初我以为我可以隐藏/显示选项,但现在我知道我必须删除/添加它们将我带到另一个挑战,因为当您单击“上一个”选择时,“下一个”
  • 我有三个 时,它应该只显示属于第一个选定
  • 请更新您的问题,而不是在 cmets 中发布详细说明。它被称为级联下拉列表,如果服务器需要填充第二个和第三个下拉列表,则需要 Ajax。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多