【问题标题】:Strange behavior of javascript RegExp in FirefoxFirefox 中 javascript RegExp 的奇怪行为
【发布时间】:2017-05-08 20:56:24
【问题描述】:

对于我在 GWTP 应用程序中遇到的一个奇怪问题,我需要您的建议。

设置是这样的:我的应用程序(GWTP 前端,Spring + Tomcat 后端),我正在对 SuperDevMode 设置进行所有测试。该应用程序有许多模块 (处理不同的业务),我最近刚刚添加了一个新模块。

我们有一个带有菜单的标题,用户可以在其中选择特定值,该值将添加到 URL,然后我们将重新加载页面。

例如:

  • 当前 URL 是 localhost:8888?devId=2&locale=en#somePlaceToken
  • 在下拉菜单中选择一个值后(例如 test1),URL 是 localhost:8888?devId=2&locale=en&testVal=test1#somePlaceToken

这是通过以下方式完成的(对于其他模块,这种方式已经工作了很长时间):

在演示者中:

public void onChangeTestVal(ChangeTestValEvent evt) {
   GWT.log("zzzz, it did get here.");
   UrlUtil.append("testVal", evt.getValue());
}

UrlUtil:

public static native void append(String key, String value) /*-{
    key = escape(key); value = escape(value);

    var s = $wnd.document.location.search;
    var kvp = key + "=" + value;

    var r = new RegExp("(&|\\?)" + key + "=[^\&]*");

    s = s.replace(r, "$1" + kvp);

    console.log("test RegExp: " + RegExp.$1);

    if (!RegExp.$1) { s += (s.length > 0 ? '&' : '?') + kvp; };

    $wnd.document.location.search = s;
}-*/

总而言之,这个想法是检查“key”是否存在 -> 替换;否则,添加字符串“key=val”。

我已经测试过,这在纯 html + js 设置上运行良好。但是,就我而言,在尝试使用实际的 GWT 应用程序时,我发现它有时不起作用!

特别是,当它不起作用时,多亏了日志,我发现 RegExp.$1 返回了一些奇怪的值:我正在使用的 Firefox 版本(日志:test RegExp: 26 for FF 26,以及52 代表 FF 52 ..)

对可能干扰上述正则表达式匹配过程的任何因素有任何想法吗?我完全一无所知,因为它在纯 html + js 设置上运行良好 :( 更奇怪的是,只有新模块有这个错误,而且只在 Firefox 上。我很确定我没有错过一些配置(与其他模块相比),所以我需要提示为什么会发生这种情况。提前致谢。

【问题讨论】:

  • RegExp.$1 已弃用。不要使用它们。
  • 但在我的测试中,这适用于 Chrome (58)。您对 Firefox 中此问题的可能原因有什么建议吗?
  • 它不是任何规范的一部分,因此行为未定义。你应该做的是为一个新的var分配一个新的值,然后,替换后,检查if (oldStr!==newStr) { // ok, do something as there was a replacement }

标签: javascript regex gwt jsni gwtp


【解决方案1】:

参见RegExp.$1-$9RegExp.$1 属性不在标准轨道上。不要在面向 Web 的生产站点上使用它:它不适用于每个用户。实现之间也可能存在很大的不兼容性,并且未来的行为可能会发生变化。

你应该给一个新的var赋值一个新的值,然后,替换后,检查旧字符串是否等于一个新字符串,如果不是,则执行替换,否则不。

使用类似的东西

var r = new RegExp("(&|\\?)" + key + "=[^&]*");
var new_s = s.replace(r, "$1" + kvp);
if (new_s === s) { new_s += (new_s.length > 0 ? '&' : '?') + kvp; };
$wnd.document.location.search = new_s;

【讨论】:

  • 一个明显的解决方案 :) 只是我想知道根本原因(对于我的新模块 + FireFox 的组合)。无论如何,我想我将不得不求助于这个 - 在再次挖掘之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多