2017-05-08 106 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