【问题标题】:Why is IE9 taking so long to execute some JQuery?为什么 IE9 执行一些 JQuery 需要这么长时间?
【发布时间】:2011-11-21 16:59:05
【问题描述】:

我有一个应用程序在 ASPX 页面中为 HTML 表 (500x) 中的每个元素执行这段代码 (JQuery 1.4.2)

$(".ArtRow_" + artId).each(function () {  
 if ($(this).find(".ArtOpen_" + artId).length <= 0) return; 
.... };

省略带有find 的行使该页面正常加载,但使用 find:

  • Firefox 和 Chrome:+- 3 秒
  • 在 IE9 中:+- 42 秒(在双核上使用 50% cpu)

我在 IE 中做了一个配置文件,95% 的时间,IE 正在执行函数CLASS(调用堆栈:find.f.filter.CLASS)

我试过了

  • 在查找中使用 Id
  • 使用固定类消除字符串连接

无济于事(42 秒)

有人知道吗?提前致谢!

edit:我现在确信每个都需要这么长时间。我跳过了它,因为使用空代码块它不需要 42 秒来加载。但是加上一些注释,又花了 42 秒,所以我猜这是某种不太智能的死代码检测。

根据明确要求:ArtRow 所在的 HTML

 <tbody>
  <tr class="SB_ReceptielijstHeader">
    <th>Artikel / Bestelling</th>
    <th>Besteldatum</th>
    <th>Pr. School</th>
    <th>Pr. Levering</th>
    <th class="Number">Aantal besteld</th>
    <th class="Number">Aantal ontvangen</th>
  </tr>

  <tr class="SB_ReceptielijstArtikelHeader ArtRow_132109">
    <td id="Titel_132109" class="Artikel" colspan="5">
      <img src="images/SB/Icons/23-book.png" style="vertical-align:middle">&nbsp;9789030170433 - NANO 1</td>
      <td class="Number ArtikelTotal">
    <input type="hidden" value="132109" class="Artikel_Id">
      <input type="hidden" value="" id="ArtLevLn_132109">
        <input type="text" value="12" style="text-align:right" size="4" id="Aantal_132109" name="Aantal_132109" maxlength="4">
        </td>
      </tr>
      <tr class="SB_ReceptielijstRow ArtRow_132109 ArtRowInvisible">
        <td>Bestelling 81 / Lijn </td>
        <td>02/07/2010</td>
        <td>24,05</td>
        <td>22,85</td>
        <td class="ArtOpen_132109 Number">
        </td>
        <td id="ArtToew__132109" class="ArtToew ArtToew_132109 Number">
          <div style="display:none" class="ArtBestLn">
        <input type="hidden" value="">
        </div>
        <input type="text" style="text-align:right" size="4" id="Aantal_" name="Aantal_" maxlength="4"> 
        </td>
          </tr>

          <tr class="SB_ReceptielijstArtikelHeader ArtRow_134399">
        <td id="Titel_134399" class="Artikel" colspan="5">
          <img src="images/SB/Icons/23-book.png" style="vertical-align:middle">&nbsp;9789045533322 - HANDELWIJS 3 INCL CDROM HERWERKT 2010</td>
          <td class="Number ArtikelTotal">
            <input type="hidden" value="134399" class="Artikel_Id">
              <input type="hidden" value="" id="ArtLevLn_134399">
            <input type="text" value="25" style="text-align:right" size="4" id="Aantal_134399" name="Aantal_134399" maxlength="4">
            </td>
              </tr>
              <tr class="SB_ReceptielijstRow ArtRow_134399 ArtRowInvisible">
            <td>Bestelling 81 / Lijn </td>
            <td>02/07/2010</td>
            <td>23,95</td>
            <td>23,60</td>
            <td class="ArtOpen_134399 Number">
            </td>
            <td id="ArtToew__134399" class="ArtToew ArtToew_134399 Number">
              <div style="display:none" class="ArtBestLn">
                <input type="hidden" value="">
                </div>
                <input type="text" style="text-align:right" size="4" id="Aantal_" name="Aantal_" maxlength="4"> 
                </td>
              </tr>

            </tbody>

【问题讨论】:

  • 您能描述一下您实际想要达到的目标吗?有时没有必要对表格中的每个单元格进行操作。例如,当您尝试应用一些 CSS 样式时,通常可以在更高级别上完成。或者当您附加事件侦听器时,也可以在更高级别上完成,因为存在事件委托/冒泡。
  • 如果您知道带有“ArtOpen”类的元素是一种特定类型的标签(如&lt;span&gt; 或其他),那么使用“tag.ArtOpen_”可能会更快一些。跨度>
  • 另外,您使用的是相当旧的 jQuery 版本。该版本可能会对 IE9 的性能做出一些错误的假设。
  • @Pointy: 确实如此,但恐怕升级 Jquery 不是一种选择
  • @Tim:对于每个元素,一些业务逻辑应用在较低的输入字段上......

标签: javascript jquery internet-explorer-9


【解决方案1】:

这很慢,因为它要运行该代码 500 次。

我认为这不是您正在寻找的答案,所以如果您可以发布您的 HTML 结构,我们可以看看是否有一种方法可以优化您使用的选择器以使其更快。

【讨论】:

    【解决方案2】:

    我无法想象下面的代码处理方式与上面的 .find 不同,但您也可以尝试:

    $(".ArtOpen_" + artId, this)
    

    然而,按类获取东西是很费力的。没有对它的原生 javascript 支持,必须检查所有节点以确定哪些节点具有该类。执行 500 次,...

    【讨论】:

    • 在内部,jQuery 将这样的两个参数调用转换为“.find()”。
    • 哦,另外,IE9 支持“getElementsByClassName()”。然而,旧的 jQuery 版本可能不知道这一点。
    • @Pointy 说的加上IE9居然有原生getElementsByClassName
    • 很高兴知道;证实了我的想法:无法想象两种选择以不同的方式工作:p
    • jQuery 1.4.2 比 IE9 早 1 年 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多