2010-01-18 32 views
0

上午所有,火狐A HREF#符號導致二傳手不要被所謂

這週一早晨,我努力理解爲什麼followng線在IE中,而不是在FF。

<a class="button" href="#" onclick="setMaintenanceMode(false);">disable</a> 

在IE和FF,當你將鼠標懸停在該按鈕的網址...

http://localhost:8080/mainapp/secure/gotoDevice.action?hardwareId=1&storeCode=2571# 

當單擊該按鈕,下面的方法被稱爲...

function setMaintenanceMode(enabled) { 
    var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 
    document.location.href = url; 
} 

是docuement發送到是(兩個瀏覽器)的網址...

/mainapp/secure/gotoDevice.action?hardwareId=1&amp;storeCode=2571&ModeEnabled=false 

問題是,在IE中struts action setSetCode()的方法被調用,但是從FF它不是!如果我刪除FF作品以上的哈希ahref,但IE不會(href =「#」)。

我試過將'&ModeEnabled='更改爲'&amp;ModeEnabled=',但沒有成功。 我看過谷歌和struts論壇,但沒有成功。

我很想試試所有的ahref,並用Dojo按鈕替換它們,看看它是否有效,但在此之前,我只是想知道是否有人可以指出原因。

我的猜測是,ahref是錯誤的使用,但爲什麼?

如果任何人都可以幫助我理解爲什麼,但將不勝感激。

感謝 傑夫·波特

編輯:返回false是解決方案的一部分。這個問題似乎是因爲網址..

/mainApp/secure/setMaintenanceMode.action?hardwareId=5&amp;storeCode=2571&ModeEnabled=true 

有它裏面的&amp;,如果我去這個網址,因爲它是,那麼它在IE中,而不是在FF。

如果我同時更改爲&那麼它在IE & FF中工作。

如果我更改爲&amp;,那麼它仍然在IE中工作,但不是FF。

任何想法?

注:

似乎支柱2.0.9不支持對<s:url標籤的屬性escapeAmp

默認請求參數將使用轉義&符號被分離(即,&amp;)。這對於XHTML合規性是必需的,但是,當使用由<s:property>標記生成的此標記所生成的URL時,應使用escapeAmp屬性來禁用&符號轉義。

soultion:return false onclick並升級到新的struts +設置escapeAmp param。 其他,url = url.replace("&amp;", "&");

回答

2

嘗試返回false從JavaScript方法

function setMaintenanceMode(enabled) { 
    var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 
    document.location.href = url; 
    return false; 
} 

<a class="button" href="#" onclick="return setMaintenanceMode(false);">disable</a> 

這應該停止的JavaScript onclick事件到達瀏覽器。

+1

除非你'回報setMaintenanceMode(...' – Anonymous 2010-01-18 09:47:47

2

onclick="setMaintenanceMode(false); return false;"

的onclick工作,但隨後在href立即呢,也是如此。您需要從點擊處理程序返回false以表示不應該遵循href。

IE可能猜測你的意思,並做錯了事。

+0

我想你都是正確的,但是這不是完整的解決方案。 請看看我的新意見中的問題。 – 2010-01-18 10:30:31

+0

如果符號出現在你的HTML,它需要顯示爲HTML實體,如果它是在一個單獨的文件加載腳本src =「」,它不應該如此逃脫。我認爲在XHTML與CDATA塊之間有一些情況,但那wouldn在標記解析器中不起作用爲了獲得一致的結果,請將帶有&符號的代碼放在單獨的非HTML文件中。 – Anonymous 2010-01-18 10:35:18

+0

您還可以嘗試使用與&符號不同的字符來分隔查詢字符串中的字段。分號(;)是一個常見的secon d選擇。大多數通用的Web應用程序都明白它的含義,因爲它在RFC中(請參閱http://en.wikipedia.org/wiki/Query_string#Structure及其中的參考資料) – Anonymous 2010-01-18 11:25:34

0

這個URL裏面有&amp;,如果我這樣去看這個url,那麼它可以在IE中使用,但是不能在FF中使用。

我懷疑它 - 它不應該在任何工作。這不是依賴於瀏覽器,而是依賴於服務器。

字符串a=b&amp;c=d被服務器框架分成參數。 Servlet要求僅使用&來分隔參數,因此它將返回a = bamp;c = d。後者的參數顯然不會被期望c的應用程序所識別。

因各種原因HTML規範強烈建議;也被允許作爲分隔符,在這種情況下,你會得到a=b,流浪amp其中沒有一個等號是沒有意義的,並丟棄,c=d。因此,儘管&符號的編碼錯誤,它仍然可以工作。不幸的是,Servlet忽略了這個建議。

默認情況下,請求參數將使用轉義符號(即&amp;)分隔。

哦,親愛的!多麼的不幸。在將參數連接到URL時,您不應該跳過&符號。如果您需要將完成的URL放入文本內容的屬性值中,則應該簡單地將參數與單個連字符和然後一起加入,對整個URL進行HTML編碼。 Struts的默認行爲在這裏完全是錯誤的。

你的情況,你是不是輸出的URL屬性值或文本內容,你寫它變成一個字符串中的腳本塊文字:

var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled; 

在老學校的腳本塊HTML,HTML轉義不適用。 (在使用原生XML的XHTML中,它確實存在,但我們暫時不想這麼做)。

但是,您仍然需要考慮JavaScript轉義。例如,如果setMaintenanceMode鏈接中有撇號,該怎麼辦?它會打破字符串。或者,如果你在字符串中有一個</序列,它會破壞整個腳本塊。

你真正想要做的是使URL(沒有任何&符號轉義),然後使用JavaScript字符串文字反斜槓轉義。最好的辦法是使用現有的JSON編碼器,它將把任何Java值轉換成JavaScript文字,如果它是一個字符串,也可以將周圍的引號放入。您也可以在大多數JSON編碼器中告訴它JS退出<&字符,這意味着如果您決定將該頁作爲XML提供服務,則無需擔心XHTML解析。

我很想撕裂了所有AHREF,並且帶有按鈕

替換它們

那麼肯定,如果你有你點擊一個東西不是到另一個位置的鏈接,只是簡單做通過腳本到頁面的東西,那麼這不是一個真正的鏈接,你會更好地將它標記爲<button><input type="button">,並且使用CSS來重新設置它,以免它看起來像一個按鈕,如果你不想要它至。

但是(再次),這一切似乎都是毫無意義的,因爲目前你正在用行爲來代替鏈接的行爲,就像鏈接只是不那麼靈活。簡單地說有什麼問題:?

<a href="/mainApp/secure/setMaintenanceMode.action?hardwareId=5&amp;storeCode=2571&amp;ModeEnabled=false">disable</a>