Остановка вычислений getClientId() в коде JS

Я столкнулся с некоторым интересным поведением кода JavaScript на моих XPages

//'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 пытается разрешить идентификатор объекта, даже если строка не используется в реальном исполнении и даже без комментариев.

Конечно, я нашел быстрый и грязный обходной путь, но я, конечно, не первый, кто сталкивается с таким поведением, и мне действительно было бы интересно узнать, как опытные программисты на XPages будут делать это?

1 ответ

Решение

Проблема в том, что вы комментируете клиентский JavaScript, который будет запускаться в браузере. Но код JavaScript на стороне сервера внутри #{javascript: (который должен быть запущен на сервере) не закомментирован.

Возможно, это поможет объяснить, что происходит, когда вы помещаете SSJS или EL в строковое свойство или, в данном случае, в блок скрипта. Поскольку ключ в том, что CSJS не анализируется на сервере, он просто передается в виде строки в браузер.

Парсер читает строку и ищет # {javascript: который сообщает ему, что следующий код до закрытия} должен быть передан парсеру SSJS, а результат добавлен в строку, которая записывается в браузер. Любые строки в этом блоке SSJS, начинающиеся с "//", будут опущены. Но синтаксический анализатор не будет принимать во внимание ничего, кроме # {javascript: потому что это просто текст, передаваемый в браузер. Это браузер, который интерпретирует все это как клиентский JavaScript.

Надеюсь, это прояснило, почему это работает так, как есть.

Если вы хотите закомментировать строку в блоке сценария, который включает SSJS, и хотите запретить запуск SSJS, вам нужно закомментировать CSJS (чтобы браузер не запускал его) и SSJS (так сервер не запускается).

Другие вопросы по тегам