javascript RegExp 在 Firefox 中的奇怪行为
Strange behavior of javascript RegExp in Firefox
对于我在 GWTP 应用程序中遇到的一个奇怪问题,我需要您的建议。
设置是这样的:我的应用程序(GWTP 前端,Spring + Tomcat 后端)并且我在 SuperDevMode 设置上进行所有测试。该应用程序有很多模块
(处理不同的业务)我最近刚刚添加了一个新模块。
我们有一个带菜单的页眉,用户可以在其中 select 特定值,该值将添加到 URL,然后我们将重新加载页面。
例如:
- 当前 URL 是 localhost:8888?devId=2&locale=en#somePlaceToken
- select在下拉菜单中输入一个值后(例如 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, "" + 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;
对于我在 GWTP 应用程序中遇到的一个奇怪问题,我需要您的建议。
设置是这样的:我的应用程序(GWTP 前端,Spring + Tomcat 后端)并且我在 SuperDevMode 设置上进行所有测试。该应用程序有很多模块 (处理不同的业务)我最近刚刚添加了一个新模块。
我们有一个带菜单的页眉,用户可以在其中 select 特定值,该值将添加到 URL,然后我们将重新加载页面。
例如:
- 当前 URL 是 localhost:8888?devId=2&locale=en#somePlaceToken
- select在下拉菜单中输入一个值后(例如 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, "" + 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;