Некоторое время назад я получил приведенный ниже javascript с веб-сайта, который показывает и скрывает подсказку даты на основе выбора из подсказки значения переключателя.
<script type = "text/javascript">
var inputs = document.getElementsByTagName("input");
var list_box = new Array();
/****Identify Radio Buttons and load them into an array****/
var radio_buttons = new Array();
j=0;
for(i=0;i<inputs.length;i++)
{
if (inputs[i].type=='radio')
{
radio_buttons[j] = inputs[i];
j++;
}
}
/****Set the onclick event of each radio button option to trigger our custom function****/
radio_buttons[0].setAttribute("onclick",function(){ToggleDate();});
radio_buttons[1].setAttribute("onclick",function(){ToggleDate();});
radio_buttons[2].setAttribute("onclick",function(){ToggleDate();});
/****Create a handle for date prompt****/
var prompt = document.getElementById("date_prompts").childNodes[0];
function ToggleDate()
{
if (radio_buttons[0].checked)
{
/**** First options (in our case "Custom") is selected.****
**** Date Prompt will be Shown or Enabled. ****/
document.getElementById("date_prompts").style.display = ''; //show
// prompt.disabled = ''; //enable
canSubmitPrompt();
}
else
{
/**** Second options (in our case "Yesterday") is selected.****
**** Date Prompt will be Hidden or Disabled. ****/
document.getElementById("date_prompts").style.display = 'none'; //hide
//prompt.disabled = 'true'; //disable
canSubmitPrompt();
}
}
</script>
Хотя мы использовали Cognos 10.2.2, этот код работал нормально (вместе с парой других элементов HTML, охватывающих подсказку даты). Сейчас мы находимся в процессе обновления до Cognos 11.0.11, пока я тестировал отчеты в новой среде, я обнаружил, что этот код больше не работает, а подсказка даты отображается независимо от того, какой вариант выбран с помощью радиокнопки.
Пожалуйста, может кто-нибудь дать мне несколько указателей относительно того, что может здесь происходить, или еще лучше сказать мне, как решить проблему.
При создании нового отчета в Cognos 11 и добавлении элементов по отдельности появляется следующее сообщение об ошибке ...
Вывод отчета в формате HTML сформирован некорректно. Если в вашем отчете используются элементы «HTML Item», убедитесь, что они приводят к правильному формату HTML.
Причина: имя содержит недопустимый символ.
URL: Строка: 274 Характер: 24 Источник: для (i = 0; i



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Cognos выпустила JavaScript API с Cognos 10.2, который значительно упрощает то, что вы здесь делаете. Кроме того, он гарантированно будет поддерживаться между версиями.
Вот те же функции, написанные для Cognos JavaScript API:
Предположения:
Код
var report = cognos.Report.getReport('_THIS_'); //Get report reference
var radioprompt = report.prompt.getControlByName('radio_buttons'); //Get prompt reference
var datespan = document.getElementById('date_prompts'); //Get span to hide/unhide
radioprompt.setValidator(validateRadio); //Assign a validation function
function validateRadio(values) {
var result = true;
if (values && values.length > 0) { //Make sure prompt has value
if (values[0].use == '1') { //Check if first radio button selected
datespan.style.display = ''; //Show
} else {
datespan.style.display = 'none'; //Hide
}
}
return result; //Return result to Cognos. Always true in this case.
}
Дополнительную информацию о Cognos JavaScript API можно найти здесь: Документация по Cognos 11 JavaScript API
Вы можете сделать это с помощью переменной рендеринга.
Чтобы функция автоматической отправки не запускала отчет, вам, вероятно, потребуется создать некоторые настраиваемые функции, чтобы заменить кнопку Заканчивать. См. Образец кода в спецификации отчета ниже. (Свойство Работайте с полной интерактивностью, похоже, не хранится в спецификации отчета. Вам нужно будет установить его вручную.)
Этот конкретный пример работает в 10.2.1 или 11.0.7 в режиме совместимости (Запуск с полной интерактивностью = Нет). Я еще не работал, чтобы сделать это правильно в 11.0.4+, используя RequireJS.
<report xmlns = "http://developer.cognos.com/schemas/report/14.1/" useStyleVersion = "11.4" expressionLocale = "en-us">
<drillBehavior/>
<layouts>
<layout>
<reportPages>
<page name = "Page1">
<style>
<defaultStyles>
<defaultStyle refStyle = "pg"/>
</defaultStyles>
</style>
<pageBody>
<style>
<defaultStyles>
<defaultStyle refStyle = "pb"/>
</defaultStyles>
</style>
<contents/>
</pageBody>
</page>
</reportPages>
<promptPages>
<page name = "Prompt page1">
<pageHeader>
<contents>
<block>
<contents>
<textItem>
<dataSource>
<staticValue>Prompt Page</staticValue>
</dataSource>
<style>
<defaultStyles>
<defaultStyle refStyle = "tt"/>
</defaultStyles>
</style>
</textItem>
</contents>
<style>
<defaultStyles>
<defaultStyle refStyle = "ta"/>
</defaultStyles>
</style>
</block>
</contents>
<style>
<defaultStyles>
<defaultStyle refStyle = "hp"/>
</defaultStyles>
</style>
</pageHeader>
<pageBody>
<contents>
<table>
<style>
<defaultStyles>
<defaultStyle refStyle = "tb"/>
</defaultStyles>
<CSS value = "border-collapse:collapse;width:100%"/>
</style>
<tableRows>
<tableRow>
<tableCells>
<tableCell>
<contents>
<selectValue selectValueUI = "radioGroup" autoSubmit = "true" parameter = "ShowHide">
<selectOptions>
<selectOption useValue = "Show Date Prompt">
<displayValue>Show Date Prompt</displayValue>
</selectOption>
<selectOption useValue = "Hide Date Prompt">
<displayValue>Hide Date Prompt</displayValue>
</selectOption>
</selectOptions>
</selectValue>
<selectValue parameter = "Parameter2" cascadeOn = "ShowHide" required = "false">
<style>
<CSS value = "visibility:hidden"/>
</style>
</selectValue>
</contents>
<style>
<CSS value = "text-align:left;vertical-align:top"/>
</style>
</tableCell>
<tableCell>
<contents>
<selectDate parameter = "Date">
<conditionalRender refVariable = "String1">
<renderFor refVariableValue = "Show Date Prompt"/>
</conditionalRender>
</selectDate>
</contents>
<style>
<CSS value = "text-align:left;vertical-align:top"/>
</style>
</tableCell>
</tableCells>
</tableRow>
</tableRows>
</table>
</contents>
<style>
<defaultStyles>
<defaultStyle refStyle = "py"/>
</defaultStyles>
</style>
</pageBody>
<pageFooter>
<contents>
<promptButton type = "cancel">
<contents/>
<style>
<defaultStyles>
<defaultStyle refStyle = "bp"/>
</defaultStyles>
</style>
</promptButton>
<promptButton type = "finish">
<contents/>
<style>
<defaultStyles>
<defaultStyle refStyle = "bp"/>
</defaultStyles>
</style>
</promptButton>
</contents>
<style>
<defaultStyles>
<defaultStyle refStyle = "fp"/>
</defaultStyles>
</style>
</pageFooter>
<style>
<defaultStyles>
<defaultStyle refStyle = "pp"/>
</defaultStyles>
</style>
</page>
</promptPages>
</layout>
</layouts>
<XMLAttributes>
<XMLAttribute output = "no" name = "RS_CreateExtendedDataItems" value = "true"/>
<XMLAttribute output = "no" name = "RS_modelModificationTime" value = "2013-01-08T15:30:33.117Z"/>
<XMLAttribute output = "no" name = "listSeparator" value = ","/>
</XMLAttributes>
<modelPath>/content/folder[@name='Samples']/folder[@name='Models']/package[@name='GO Sales (query)']/model[@name='model']</modelPath>
<reportVariables>
<reportVariable type = "string" name = "String1">
<reportExpression>ParamDisplayValue('ShowHide')</reportExpression>
<variableValues>
<variableValue value = "Show Date Prompt"/>
<variableValue value = "Hide Date Prompt"/>
</variableValues>
</reportVariable>
</reportVariables>
<reportName>ShowHide</reportName>
</report>
Уловка для предотвращения автоматической отправки заключается в использовании скрытого приглашения, у которого свойство «Cascade Source» заполнено как параметр переключателя. Это превращает автоматическую отправку в повторную подсказку. Однако ваше решение менее желательно, потому что вся страница приглашения должна обновляться каждый раз, когда выбирается значение переключателя. Это может занять много времени и привести к неидеальному взаимодействию с пользователем.
Все дело в контексте. Я согласен с тем, что если все запросы находятся на этой странице, это может вызвать проблемы с производительностью. У меня есть отчет, который делает что-то похожее (но с гораздо большим количеством опций), но это единственное, что делает страница с подсказками. Все подсказки, не связанные с этой функцией, находятся на других страницах подсказок. Производительность не проблема.
Мне очень нравится ваша рекомендация использовать скрытую подсказку. Мне удалось удалить весь JavaScript из образца. Это увеличивает вероятность того, что отчет сохранится после обновления.
Спасибо за ответ. Предположительно, указанный вами фрагмент кода заменит код в тегах <script>? /