【问题标题】:How to fix this error "Uncaught DOMException: Failed to execute 'querySelectorAll' on 'Document': 'div.com[min=]' is not a valid selector"? [duplicate]如何修复此错误“未捕获的 DOMException:无法在 'Document' 上执行 'querySelectorAll':'div.com[min=]' 不是有效的选择器”? [复制]
【发布时间】:2020-12-14 10:07:57
【问题描述】:

我想用reddit之类的孩子隐藏cmets,我写了这个函数:

function toggle(id, lft, rgt) {
    var kids = (rgt - lft - 1) / 2;
    if (kids >= 1) {
        var element = document.querySelector("div.com#com" + id).getAttribute('value');
        var low = Number(element.split('-')[0]);
        var high = Number(element.split('-')[1]);
        for (var i = low + 1; i <= high - 1; i += 1) {
            const x = document.querySelectorAll('div.com[min=' + i + ']');
        }
        Array.from(x).forEach(comment => {
            if (comment.style.display === "none") {
                comment.style.display = "block";
            } else {
                comment.style.display = "none";
            }
        });
    }

例如这是父评论:

<div> 
      <a onclick="return toggle(1, 1, 4)" href="javascript:void(0)">[-]</a>
       <div id="com1" class="com md" value="1-4" min="1">yellow</div>
</div> 

这是一个子评论:

<div> 
     <a onclick="return toggle(2, 2, 3)" href="javascript:void(0)">[-]</a>
    <div id="com2" class="com md" value="2-3" min="2">hello </div>
</div> 

我想隐藏所有在父值 1 和 4 之间具有 min 属性的 cmets,并且该子级具有 min=2,因此必须将其隐藏。但是js函数不工作,那是什么问题呢?

其他问题?

  • 我应该在for loop 中写foreach 还是可以 这样吗?
  • 如果标题中的错误得到修复,该功能是否可以工作并且子cmets会被隐藏,如果没有,为什么?

【问题讨论】:

  • 当您拥有应该是唯一的 ID 时,为什么要使用类选择器?只需使用 document.getElementById("com"+id).getAttribute("value") - 但是不建议在非表单字段上使用 value 属性
  • 另外请点击edit 然后[&lt;&gt;] sn-p 编辑器并生成minimal reproducible example
  • @mplungjan 谢谢,但问题出在const x = document.querySelectorAll('div.com[min=' + i + ']');
  • 不,不要。 @mplungjan 'div.com[min=' + i + ']` 和div.com[min="${i}"] 的区别在于第一个会生成'div.com[min=0]',这是无效的,而第二个会生成'div.com[min="0"]',这是有效的吗?此外,这个问题是一个很好的标志,人们很可能会带着同样的 DOMException 错误消息来到这里(减去实际的 'div.com[min=]' 过去)
  • for 循环也没有任何意义.....您只是在集合中的最后一项上执行 Array.from()。

标签: javascript


【解决方案1】:

好吧,正如错误消息所说,您的选择器无效。在属性值周围添加引号。

const x = document.querySelectorAll(`div.com[min="${i}"]`);

(使用 ES6 模板文字看起来更易读)。

【讨论】:

  • 非常感谢@mbojko,它起作用了,但该功能不起作用,但后来我在for loop 中复制了foreach ,它起作用了。非常感谢
猜你喜欢
  • 2018-10-14
  • 2021-07-19
  • 2019-09-16
  • 2018-11-04
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多