在进行全局正则表达式替换时摆脱不稳定

时间:2014-05-07 22:11:47

标签: javascript

让我们假设我们有一个页面,比如说:

<html>
  <body>
    (111) 111.1111
    <br />
    (222) 222.2222
    <br />
    333 333 3333
    <br />
    444-444-4444

    <script>
      // replace all phone numbers with our own

      var re = /\d{3}[().-\s[\]]*\d{3}[().-\s[\]]*\d{4}/g;
      var sourcestring = document.documentElement.innerHTML;
      var replacementpattern = "(111) 867-5309";
      var result = sourcestring.replace(re, replacementpattern);
      document.documentElement.innerHTML = result; 
   </script>                       
  </body>

我们的页面正常加载,但它显示的原始电话号码可能是1/4秒(非常明显)。

有没有办法基本上停止显示其他数字,并且在更换时只显示(111)867-5309字符串?

也许一个解决方案就是要有一些内容可以解析html(但在显示之前)?

编辑:

为了澄清,除了javascript(将通过src =加载)之外,我无法访问HTML的其余部分。

1 个答案:

答案 0 :(得分:1)

如果您可以修改页面以移动脚本,则可以使其正常工作。

  1. 首先,将您的脚本放在内容之前(最好是在头部)。
  2. 您的代码应该在一个函数中,您可以在内容准备就绪后调用
  3. 使用您的函数处理DOMContentLoaded事件。 (reference here,如果浏览器不支持后备列表)
  4. 这样的事情:

    <html>
      <head>
        <script>
          function replacePhoneNumbers () {
              // replace all phone numbers with our own
    
              var re = /\d{3}[().-\s[\]]*\d{3}[().-\s[\]]*\d{4}/g;
              var sourcestring = document.documentElement.innerHTML;
              var replacementpattern = "(111) 867-5309";
              var result = sourcestring.replace(re, replacementpattern);
              document.documentElement.innerHTML = result;
          }
    
          document.addEventListener('DOMContentLoaded', replacePhoneNumbers);
        </script>
      </head>
      <body>
        ...
      </body>
    </html>
    

    如果你不能移动你的剧本,那么你无能为力;在内容已经呈现之前,它不会被执行。