【发布时间】: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