在JS代码中停止getClientId()计算

时间:2014-02-05 10:38:44

标签: javascript xpages domino-designer-eclipse

我在XPage上遇到了javascript代码的一些有趣行为

//'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");
}

上面的代码在不存在元素的页面上执行时总是以错误结束 - “getClientIdnichtaufgelöstwerden中的UngültigerKomponentennamerdoGeschlecht1 kann”。 - 在我看来,即使在实际执行中没有使用该行,甚至取消注释时,Notes也会尝试解析对象ID。

我当然找到了一个快速和肮脏的解决方法,但我肯定不是第一个偶然发现这种行为的人,我真的会对经验丰富的XPages程序员会对此感兴趣吗?

1 个答案:

答案 0 :(得分:4)

问题是你正在评论将在浏览器上运行的客户端JavaScript。但是#{javascript :(需要在服务器上运行)中的服务器端JavaScript代码没有被注释掉。

也许这将有助于解释您将SSJS或EL放在字符串属性中的情况,或者在本例中是一个脚本块。因为关键是CSJS没有在服务器上解析,所以它只是作为字符串传递给浏览器。

解析器读取字符串并查找#{javascript:告诉它需要将以下代码发送到结束语},并将结果添加到写入浏览器的字符串中。 SSJS块中以“//”开头的任何行都将被省略。但解析器不会考虑#{javascript之外的任何内容:因为这只是传递给浏览器的文本。浏览器将整个事物解释为客户端JavaScript。

希望澄清为什么它的工作方式如此。

如果要在包含SSJS的脚本块中注释掉一行,并且想要阻止SSJS运行,则需要注释掉CSJS(因此浏览器不会运行它)和SSJS (所以服务器不运行它。)