2012-01-02 122 views
0

我正在使用Alert()來確保「登錄」和頁面上元素的innerHTML之間存在匹配。字符串比較在Javascript中失敗

var statusElement = document.getElementById('logged-in-status'); 
var currentLoggedInStatus = statusElement.innerHTML; 

    alert("innerHTML is: " + currentLoggedInStatus); 

當警告框彈出,它說:innerHTML的是:登錄

var stringComp = (currentLoggedInStatus == "Login"); 
    alert("stringComp is: " + stringComp); 

當這第二個提示框彈出,它說:stringComp是:假

因此,'if'語句內的代碼ERRONEOUSLY執行。我沒有看到第一個alert()清楚地說明innerHTML是'Login',但if語句中的代碼正好在前面並執行。我試着圍繞'登錄' 單引號,並沒有幫助。

if(currentLoggedInStatus != "Login") 
    { 
     navBarLoginStatusTextElement.innerHTML = 'Login'; 
    } 

要重申的是,的innerHTML =登錄時,我比較innerHTML來登錄 它說,他們是不一樣的!

爲什麼我的javascript比較失敗了?

編輯:這裏是設置「登錄」的價值塊元素和PHP函數:

<a id="logged-in-status" 
     href="http://localhost/myProj/justAfile.php"><?php echo getLoginStatusStr();?> </a> 

,並在一個PHP代碼塊的功能是:

function getLoginStatusStr() 
{ 
     return 'Login'; 
} 
+2

請JSF代碼或鏈接到它,如果可能的話。我可能會建議innerHTML實際上是「登錄」而不是「登錄」...因此,將您的調試警報更改爲警報(「stringComp is:'」+ currentLoggedInStatus +「'」);請驗證這一點。 – AlanFoster 2012-01-02 09:38:04

+1

當你有這個時,你會得到什麼? 'var stringComp =(currentLoggedInStatus.indexOf(「Login」)> = 0);' – 2012-01-02 09:44:46

+1

您的鏈接'#login-in-status'似乎以空白結尾,就像@AlanFoster懷疑的一樣。在比較之前修剪它。 – Stefan 2012-01-02 09:50:48

回答

3

請JSF代碼或鏈接到它,如果可能的話。我可能 建議innerHTML實際上是'登錄',而不是'登錄'... 因此,更改您的調試警報警報(「stringComp是:'」+ currentLoggedInStatus +「'」);請驗證這一點。

發表我原來的評論作爲一個實際的答案。

編輯:因爲我以爲,

href="http://localhost/myProj/justAfile.php"><?php echo getLoginStatusStr();?> </a> 

看到白色的空間?刪除它看起來像

href="http://localhost/myProj/justAfile.php"><?php echo getLoginStatusStr();?></a> 
+0

我在上面的原始問題中添加了塊代碼和設置文本的內聯php函數。我想根據大家的意見,這是關閉之前的唯一空間 – wantTheBest 2012-01-02 09:49:01

+1

@wantTheBest是的,我改變了我的文章,然後再評論,以確認這一點:) – AlanFoster 2012-01-02 09:49:58

+0

謝謝艾倫。自20世紀80年代以來一直在寫代碼。我曾經說過,「一旦你學會了幾種語言,他們都非常相似」,「我已經過了花費大量時間去追尋最終變成一個壞人的階段。」Dagnabbit。大家誰提到了空白向上箭頭,並接受這一個。謝謝所有。 – wantTheBest 2012-01-02 09:54:32

1

您已經可能在原始字符串中有一些額外的空白,在alert()中不可見,但會導致比較失敗。

3

正如其他人所說,您的HTML代碼中可能有一個額外的空白區域。嘗試trim荷蘭國際集團它:

function trim(str) { 
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
} 

var stringComp = (trim(currentLoggedInStatus) == "Login"); 

不過,我勸你檢查HTML代碼的內容爲你的邏輯 - 你永遠不知道什麼樣的瀏覽器(或腳本)做你的代碼。更好地使用專用的狀態變量或類似的東西。

+0

謝謝我欣賞那裏的建議。挑戰是,當頁面處理我的代碼上面,導航欄html已由服務器發送通過require_once「navBarTopOfEveryPage.php」 - 當上面的代碼執行'Login'元素時,已經出現了,上面的代碼改變了'Login'後的事實。使用會話變量來跟蹤「登錄狀態」。 – wantTheBest 2012-01-02 10:08:41

+1

不知道我是否明白你的'navBarTopOfEveryPage.php'正確地做了什麼,但也許它可以編寫一個''代碼片段來複制JavaScript世界中的狀態 – 2012-01-02 10:14:26

+0

好的天哪我在那裏,謝謝你的提示Udo - 我的方法是非常不雅和kludgey,我會採取你的建議,這是一個很大的幫助,謝謝,這是一個漫長的夜晚,我真的很感激它! – wantTheBest 2012-01-02 10:17:36

1
String.prototype.trim = function() { 
a = this.replace(/^\s+/, ''); 
return a.replace(/\s+$/, ''); 
}; 

然後var currentLoggedInStatus = statusElement.innerHTML.trim();

0

我也覺得你有你的字符串一些額外的空格。使用警報檢查此最簡單的方法是將字符串的長度添加到警報消息。這樣你可以看到哪個字符串包含空格/ s(如果有的話)。

我在處理類似問題時發現了另外一個問題。如果您的傳入字符串爲空終止,則修剪功能將不起作用。您可以使用切片函數來擺脫空終止符。