javascript RegExp 在 Firefox 中的奇怪行为

Strange behavior of javascript RegExp in Firefox

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

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

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

例如:

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

在演示者中:

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, "" + kvp);

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

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

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

所以总而言之,想法是检查 "key" 是否存在 -> 替换;否则,添加字符串 "key=val".

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

特别是,当它不起作用时,感谢日志,我发现 RegExp.$1 returns 一些奇怪的值:我正在使用的 Firefox 版本(日志:测试 RegExp: FF 26 为 26,FF 52 为 52 ..)

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

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

你应该做的是给一个新的变量赋一个新的值,然后在替换之后,检查旧字符串是否等于新字符串,如果不相等,则进行替换,否则,不进行替换。

使用类似

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