0

我在我的 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");
}

上面的代码在不存在该元素的页面上执行时总是以错误结尾 - “Ungültiger Komponentenname rdoGeschlecht1 kann in getClientId nicht aufgelöst werden。” - 在我看来,Notes 会尝试解析对象 ID,即使该行未在实际执行中使用,甚至在未注释时也是如此。

我当然找到了一个快速而肮脏的解决方法,但我肯定不是第一个偶然发现这种行为的人,我真的很想知道有经验的 XPages 程序员会如何处理这个问题?

4

1 回答 1

4

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

也许这有助于解释将 SSJS 或 EL 放入字符串属性或在本例中为脚本块会发生什么。因为关键是CSJS没有在服务器上解析,只是作为字符串传给浏览器。

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

希望这能阐明为什么它会以这种方式工作。

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

于 2014-02-05T11:11:20.217 回答