>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Вывод данных в окно диалога в режиме реального времени http://forum.mozilla-russia.org/viewtopic.php?id=63912 |
Michael72 > 26-06-2014 16:33:32 |
Диалоговое окно открывается следующим методом: Выделить код Код:... var win_prefs = "chrome,dialog=no,dependent=no,resize=yes,screenX="+this.mX+",screenY="+this.mY+ ",width="+this.mWidth+",height="+this.mHeight; window.openDialog(this.mURL, "_blank", win_prefs); Код вызываемого диалога: Выделить код Код:<?xml version="1.0" encoding="windows-1251"?> <?xml-stylesheet href="chrome://conversiontools/skin/overlay.css" type="text/css"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="System Tools" id="ConversionTools" onload="Continue();" maxwidth="583" minwidth="583" maxheight="473" minheight="473" > <script type="application/x-javascript" src="conversiontools.js"/> <script type="application/x-javascript" src="chrome://jslib/content/jslib.js" /> <vbox minwidth="583" minheight="473"> <hbox minheight="63" align="start"> <box maxwidth=""> <description id="Status" width="564" height="50"></description> </box> </hbox> <hbox minheight="40" align="start"> <textbox id="Log" width="530" height="378" multiline="true" style="margin: 0px 0px 0px 20px"/> </hbox> </vbox> </window> В процессе выполнения задачи функция Continue (вызывается опцией onload) выводит данные в объект с ID "Status" и "Log" с помощью функции dodate: Выделить код Код:function clock(mls) { now = new Date(); if(mls != null) {now.setTime(mls);} // время hours = now.getHours(); minutes = now.getMinutes(); seconds = now.getSeconds(); timeStr = "" + hours; timeStr += ((minutes < 10) ? ":0" : ":") + minutes; timeStr += ((seconds < 10) ? ":0" : ":") + seconds; this.time = timeStr; // дата date= now.getDate(); month= now.getMonth()+1; year= now.getYear(); dateStr= "" + month; dateStr+= ((date<10) ? "/0" : "/") + date; dateStr+= "/" + ((year<2000) ? eval("year+1900") : year); this.date = dateStr; // дата в виде: Oct. 7, 2002 date= now.getDate(); Month = new Array("Янв.","Фев.","Март","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Ноя.","Дек."); month= Month[now.getMonth()]; year= now.getYear(); dateStr= "" + month; dateStr+= " " + date; dateStr+= ", " + ((year<2000) ? eval("year+1900") : year); this.dateform1 = dateStr; // сколько минут msPerMinute = 60 * 1000; this.minutes = now.getTime()/msPerMinute; } function dodate(text,Control) { today=new clock(); if (Control == "Log") document.getElementById("Log").value+=today.time + " " + text + "\n"; else document.getElementById(Control).value=today.time + " " + text; } Предполагается, что данные будут выводиться параллельно выполнению задачи, показывая пользователю информацию по мере её вывода в диалоговое окно. Однако окно не появляется до тех пор пока задача не дойдёт до своего завершения, после этого окно показывает полученный результат. Можно ли изменить данную ситуацию? Нужно, чтобы по сути было нечто подобное индикатору процесса, т.е. чтобы пользователь видел выводимые данные по мере их вывода, а не в самом конце. Для демонстрации:
Большая база данных для конвертации - "Адресная книга Штрихкод" После установки расширения, запустите его используя команду меню веб-браузера Firefox: Инструменты - Конвертация форматов. В открывшемся диалоговом окне выберите из списка Утилиты утилиту Конвертировать CSV в DSL. Выберите файл из архива в качестве "файла ввода", а в качестве "файла вывода" выберите любой временный каталог. Нажмите OK. |
Michael72 > 26-06-2014 18:44:39 |
okkamas_knife пишет
Судя по данной рекомендации, мне кажется, что ты правильно понял куда выводятся данные. Для пущей наглядности привожу скрин-шот этого окна, куда выводятся данные: Таким образом выглядит это окно в самом конце процесса. При выполнении процесса диалогового окна не видно, а Firefox входит в состояние "не отвечает". На скрин-шоте видно, что в объекте с ID "Status" написано "Готово", а в объекте с ID "Log" находятся все логи, которые накопились в ходе выполнения процесса. Желание заключается в том, чтобы при выполнении задачи в поле Status пользователь мог следить за сообщениями, что именно сейчас выполняется процессом, а в поле Log мог бы наблюдать динамическое пополнение этого списка. Применение метода setTimeout не помогло. Запускал с помощью этого метода функцию dodate (на мой взгляд это чем-то согласуется с твоей рекомендацией), а также самую первую функцию Continue. Смысла в циклическом вызове функции не вижу, потому что даже первый вызов не приводит к отображению самого диалогового окна. Повторюсь ещё раз, оно появляется только после того как весь процесс заканчивается: доходит успешно до конца или происходит какая-то ошибка. |
Michael72 > 27-06-2014 00:19:34 |
okkamas_knife пишет
Для теста поместил два объекта Status и Log в то же окно, в котором выполняется запуск обработки файла. Т.е. окно уже открыто, все элементы визуально видны. Однако результат аналогичный. Данные выводятся в объекты Status и Log только в конце процесса. В момент выполнения процесса Firefox также входит в состояние "не отвечает". |
Michael72 > 27-06-2014 04:08:41 |
okkamas_knife пишет
|