Для реализации случая с отсутствием события OnChange (пользователь просто вышел из HTML окна), пришлось опробовать несколько вариантов:
1. Обработка события OnKeyUp элемента ввода данных - В этом случае при каждом нажатии кнопки значение передается в SAP, но так как обработка событий осуществляется в синхронном режиме, то при быстром вводе текста пропадает половина символов.
2. Фиксация введенных данных во внутреннюю переменную при событии onKeyUp и по таймеру (ну например 10 секунд) отправка данных в SAP. В принципе работает, но есть вероятность что в момент отправки данных пользователь начнет опять вводить данные - в этом случае опять пропадет символ. Пропаданий символов гораздо меньше чем в первом случае - но они есть.
3. Обработка события onUnload элемента <BODY>. Идея в том чтобы передать данные в момент разрушения HTML объекта. Не работает, событие возникает, но SAP не реагирует на передаваемую ссылку.
4. Вызов скрипта в HTML со стороны SAP. На первый взгляд такое невозможно, но в классе cl_gui_html_viewer есть пара хитрых методов: set_script и execute_script, правда они protected, но их можно использовать если реализовать потомка. Как это сделать можно посмотреть в примере - SAPHTML_SCRIPT_DEMO. Этот вариант также не подходит для реализации поставленной задачи - SAP также не реагирует на сгенерированную таким образом ссылку, хотя возможность запускать скрипты из кода SAP довольно интересная.
5. Комбинированная обработка событий onKeyUp на элементе ввода и onMouseOut на контейнере, который содержит все элементы. Этот вариант полностью подошел, при этом данные не теряются и передаются в SAP. Вот пример кода в HTML шаблоне:
- Код
<table onm ouseout="sendKey();"> <tr> <td><textarea onc hange="sendVal(this)" onk eyup="evntKey(this)" name="FIELD"></td> </tr> </table> |
Код
<script> var curr_element; function evntKey(e){ curr_element=e; } function sendKey() { var l_str=curr_element.value; var la_array=l_str.match(/.{1,250}/g); var vl_str='SAPEVENT:KeyData?'; for(var i=0; i<la_array.length; i++){ if (i>0) {vl_str=vl_str+'&';} vl_str=vl_str+curr_element.name+'_'+i+'='+la_array[i]; } location.href=vl_str; } function sendVal(e) { var l_str=e.value; var la_array=l_str.match(/.{1,250}/g); var vl_str='SAPEVENT:KeyData?'; for(var i=0; i<la_array.length; i++){ if (i>0) {vl_str=vl_str+'&';} vl_str=vl_str+e.name+'_'+i+'='+la_array[i]; } location.href=vl_str; } |
Комментариев нет:
Отправить комментарий