2017-05-08 68 views
1

我需要您对我在我的GWTP应用程序中遇到的奇怪问题提出建议。JavaScript RegExp在Firefox中的奇怪行为

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

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

例如:

  • 当前URL为localhost:8888 DEVID = 2 &语言环境= EN#somePlaceToken
  • 后在下拉菜单中选择的值(例如TEST1),URL为localhost:8888 ?DEVID = 2 &区域= 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 = val”。

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

特别是,当它不起作用时,感谢日志,我发现RegExp。$ 1会返回一些奇怪的值:我使用的Firefox版本(日志:测试RegExp:26代表FF 26,和52的FF 52 ..)

任何想法可能会干扰上述正则表达式匹配过程中的任何因素?我完全无能为力,因为它在纯html + js设置上工作正常:(更奇怪的是,它只是新模块有这个错误,并且只在Firefox上。我确信我不会错过某些配置(相对于其他模块),所以我需要一个提示,为什么会这样。在此先感谢。

+0

的'正则表达式。$ 1'已被弃用。不要使用它们。 –

+0

但在我的测试中,这适用于Chrome(58)。你对Firefox中这个问题的可能原因有什么建议吗? – ramcrys

+0

它不是任何规格的一部分,所以行为是不确定的。你应该做的是给一个新的var分配一个新的值,然后,在替换之后,检查if(oldStr!== newStr){// ok,做一些替换操作}' –

回答

1

RegExp.$1-$9,该RegExp.$1财产是不是一个标准的轨道。不要使用它面向网页制作网站:它不适用于每个用户,也可能在实现之间存在很大的不兼容性,并且行为可能会在将来发生变化。

你应该做的是为新var分配一个新值,然后在替换之后,检查是否旧的ing等于一个新的字符串,如果不是,则执行替换,否则不是。

使用类似

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; 
+1

显而易见的解决方案:) Just我想知道根本原因(组合我的新模块+ FireFox)。无论如何,我想我不得不诉诸于此 - 在一些挖掘之后。 – ramcrys