2014-02-05 67 views
0

我遇到的JavaScript代碼的一些有趣的行爲就在我的XPages停止getClientId()計算在JS代碼

//'rdoGeschlecht1' is present on page Basis (no problems there), 
//but not on page 'Stufe1'.  
var level = "Stufe1"; 
if(level == "Basis") 
{ 
    alert("1"); 
// var rdoGeschlecht1 = '#{javascript:getClientId("rdoGeschlecht1")}'; 
} 
else if(level == "Stufe1") 
{ 
    alert("2"); 
} 

當一個頁面上執行其中的元素不存在就永遠的代碼在結束時出現錯誤 - 「UngültigerKomponentenname rdoGeschlecht1 kann in getClientId nichtaufgelöstwerden。」 - 在我看來,Notes會嘗試解析對象ID,即使該行在實際執行中未被使用,甚至未被註釋也是如此。

我發現了一個很快的&骯髒的解決方法當然,但我肯定不是第一個絆倒這種行爲,我真的會對XPage程序員將如何應對這個問題感興趣?

+0

可能的重複[爲什麼xPage處理我的評論](http://stackoverflow.com/questions/19679079/why-does-xpage-process-my-comments)我有同樣的問題你的SSJS代碼得到執行甚至如果它被註釋掉了。只要以#{或$ {}開始,它就會被解釋爲SSJS代碼。 –

+1

關於編碼風格的註釋:將{}放在他們自己的行上會爲JavaScript解釋器添加額外的處理。雖然這是Java的品味/風格問題,但它對JavaScript有着微妙而真實的影響。您可能想要改變習慣,並將其與條件陳述放在同一行 – stwissel

回答

4

問題是你正在評論將要在瀏覽器上運行的客戶端JavaScript。但是#{javascript:(需要在服務器上運行)中的服務器端JavaScript代碼未被註釋掉。

也許這將有助於解釋將SSJS或EL放入字符串屬性或在此情況下是腳本塊會發生什麼。因爲關鍵在於CSJS不在服務器上解析,所以它只是作爲字符串傳遞給瀏覽器。

解析器讀取字符串並查找#{javascript:它告訴它以下直到關閉的代碼}需要傳遞給SSJS解析器,並將結果添加到寫入瀏覽器的字符串中。任何開始「//」的SSJS塊內的行都會被省略。但解析器不會考慮#{javascript之外的任何內容:因爲這只是傳遞給瀏覽器的文本。瀏覽器將整個事物解釋爲客戶端JavaScript。

希望澄清爲什麼它的工作方式。

如果您想在包含SSJS的腳本塊中註釋掉一行,並且想要阻止SSJS運行,則需要註釋CSJS(因此瀏覽器不運行它)和SSJS(所以服務器不運行它)。