Остановка вычислений 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 (так сервер не запускается).