【问题标题】:Is there a better and/or faster way to execute this regex?有没有更好和/或更快的方法来执行这个正则表达式?
【发布时间】:2015-11-29 14:30:16
【问题描述】:

我需要每 500 毫秒运行一次这个命令,但是运行一次就足够滞后了。是否有解决方案可以在功能仍然执行相同操作的同时提高性能?

$('#current-update > div.update-content > ol:nth-child(4) > li > div.info > p').each(function() {
    var matchthis = $(this).text().match(/\*(.*?)\*/g);
    if (matchthis) {
        var replacethis = $(this).html().replace(/\*(.*?)\*/g, "<strong>$1</strong>")
        $(this).replaceWith('<p data-bind="html: parsedBody" class="body">' + replacethis + "</p>")
    }
});

【问题讨论】:

  • 我想你可以跳过matchthis 测试并进行替换。
  • 要格式化代码块,突出显示代码并单击工具栏中的{} 按钮。另请参阅:stackoverflow.com/editing-help
  • 为什么需要每半秒运行一次?滞后的不是正则表达式,而是从replaceWith() 重绘的DOM。
  • @RocketHazmat 好吧,这本身就是问题所在,如果我拥有该网站,我可以更轻松地做到这一点,但是我为它开发了一个 Chrome 扩展程序,因此操作起来并不容易。这些帖子是通过转到另一个链接来加载的,比如说您在 example.com/updates/1234 上,然后您单击另一个帖子,该帖子会将您带到 example.com/updates/4321 而无需重新加载页面(大部分时间)
  • @RocketHazmat 检查哪些帖子需要它是.match() 所做的,它不会运行第二部分来替换它,除非某些内容与.match() 参数匹配。有没有更有效的方法来做到这一点?

标签: javascript jquery regex


【解决方案1】:

由于正则表达式,它并不慢。这很慢,因为我怀疑在您的代码中的某处这些段落标签每 500 毫秒动态更新一次,其中包含 cmets,然后您将逐个迭代它们以更改值。

关于操纵 dom 的第一条规则 - 一次不要多次操纵 dom。由于新涌入的 angular、bootstrap、buildscript、data-binding、jquery 开发人员尚未了解流畅的 Web 交互的重要性,这一点经常被忽视。

每次使用 jquery 选择器读取 dom 时 - $('#getThis') 都会花费渲染时间。每次你在 dom 上渲染一些东西 - $('#getThis').html('add this') 都会花费渲染时间。在一个迭代中结合这两个动作会成倍增加,特别是如果你在计时器上这样做。

你现在得到的结果很慢,不是因为正则表达式,而是因为多个 dom 操作,并且每次迭代都重新读取 dom。

重新思考您的架构。除非您读取整个 html 块,使用正则表达式遍历字符串,然后一次性写入 dom,否则它不会变得比这更快。

祝你好运

【讨论】:

  • 过了一会儿,我稍微优化了我的代码,仍然可以做很多不同的事情,它检查是否需要对任何一个段落块进行更新(可能高达 500时间,这并不少见!)所以我基本上把一个定时器放在 1000 毫秒(或 1 秒)上,如果需要,它只会一次改变一个,有点慢,在某些时候我应该考虑用纯 JavaScript 来做.
猜你喜欢
  • 2023-03-27
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多