Firefox中javascript RegExp的奇怪行为

Firefox中javascript RegExp的奇怪行为,javascript,regex,gwt,jsni,gwtp,Javascript,Regex,Gwt,Jsni,Gwtp,我需要你对我在GWTP应用程序中遇到的一个奇怪问题提出建议 设置如下:我的应用程序(GWTP前端、Spring+Tomcat后端)和我在SuperDevMode设置上进行所有测试。该应用程序有许多模块 (处理不同的业务)我最近刚刚添加了一个新模块 我们有一个带有菜单的标题,用户可以在其中选择一个特定的值,该值将添加到URL,然后我们将重新加载页面 例如: 当前URL是localhost:8888?devId=2&locale=en#somePlaceToken 在下拉菜单中选择一个值(例如te

我需要你对我在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());
}
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;
}-*/
UrlUtil:

public void onChangeTestVal(ChangeTestValEvent evt) {
   GWT.log("zzzz, it did get here.");
   UrlUtil.append("testVal", evt.getValue());
}
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版本(Log:test RegExp:26表示FF 26,52表示FF 52..)

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

请参阅,
RegExp.$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;

RegExp.$1
已被弃用。不要使用它们。但在我的测试中,这在Chrome(58)上有效。您对Firefox中出现此问题的可能原因有何建议?它不是任何规范的一部分,因此行为未定义。您应该做的是为新变量分配一个新值,然后在替换后,检查
if(oldStr!==newStr){//好的,做点什么,因为有一个替代品}
一个明显的解决方案:)只是我想知道根本原因(我的新模块与FireFox的组合)。无论如何,我想我必须求助于这个——在再次挖掘之后。