代码之家  ›  专栏  ›  技术社区  ›  Tell Don Zampano

为什么css选择器“table tr:not(tr:nth child(even))”引发类型错误?

  •  0
  • Tell Don Zampano  · 技术社区  · 6 年前

    此选择器为什么工作:

    document.querySelectorAll('table tr:not(:nth-child(even))');
    

    虽然此选择器没有(引发类型错误):

    document.querySelectorAll('table tr:not(tr:nth-child(even))');
    

    var query = (selector) => {
      return document.querySelectorAll(selector);
    };
      
    try {
      var select_a = 'table tr:not(:nth-child(even))';
      var select_b = 'table tr:not(tr:nth-child(even))';
    
      query(select_a).forEach((node) => {
        node.style.color = 'red';
      });
    
      query(select_b).forEach((node) => {
        node.style.color = 'blue';
      });
    } catch (e) {
        query('div:nth-child(3)')[0].textContent = e.toString();
    }
    var query = (selector) => {
      return document.querySelectorAll(selector);
    };
      
    try {
      var select_a = 'table tr:not(:nth-child(even))';
      var select_b = 'table tr:not(tr:nth-child(even))';
    
      query(select_a).forEach((node) => {
        node.style.color = 'red';
      });
    
      query(select_b).forEach((node) => {
        node.style.color = 'blue';
      });
    } catch (e) {
        query('div:nth-child(3)')[0].textContent = e.toString();
    }
    <table>
      <tr>
        <td>row 1 first-name</td>
        <td>row 1 last-name</td>
        <td>row-1 email</td>
      </tr>
      <tr>
        <td>row 2 first-name</td>
        <td>row 2 last-name</td>
        <td>row-2 email</td>
      </tr>
      <tr>
        <td>row 3 first-name</td>
        <td>row 3 last-name</td>
        <td>row-3 email</td>
      </tr>
      <tr>
        <td>row 4 first-name</td>
        <td>row 4 last-name</td>
        <td>row-4 email</td>
      </tr>
      <tr>
        <td>row 5 first-name</td>
        <td>row 5 last-name</td>
        <td>row-5 email</td>
      </tr>
    </table>
    
    <div>Why does select_a work but not select_b?</div>
    
    <div></div>
    1 回复  |  直到 6 年前
        1
  •  4
  •   misorude    6 年前

    虽然此选择器没有(引发类型错误):

    document.querySelectorAll('table tr:not(tr:nth-child(even))');
    

    :not() 只接受_简单选择器__,并且 tr:nth-child(even) 不是这样的。

    https://drafts.csswg.org/selectors-3/#simple-selectors-dfn :

    简单选择器可以是类型选择器、通用选择器、属性选择器、类选择器、ID选择器或伪类。

    要么 是这里的重要关键字。只允许这些选择器类型中的一种,而不允许它们的组合。