A tecnologia Web Dynpro até a sua versão 7.2 não permite que você utilize Javascript para manipular elementos de sua UI, no entanto o ABAP Objects nos presenteia com a classe CL_JAVA_SCRIPT para que possamos utilizar scripts externos para chamar nossas funções Javascript em aplicações Web Dynpro. As versões mais recentes do Web Dynpro como a 7.3 ou superiores já inclui elementos de integração HTML chamados HTMLIsland e HTMLContainer que possibilita integrar Javascript e CSS aos elementos de sua UI.
Você pode usar a classe CL_JAVA_SCRIPT para executar programas em JavaScript que, por exemplo, são carregados de recursos externos ou programados em um editor e escrito por você mesmo. Você também pode criar um arquivo Javascript dinamicamente de um código ABAP.
CL_JAVA_SCRIPT: Objetos Javascript
HTML Integration: Integração HTML
Usando uma Biblioteca Externa
1 – Crie um novo componente Web Dynpro e crie seu layout como na figura abaixo, usando os elementos básicos, como labels, caixa de texto, botões e containers transparentes para espaçar os elementos:
2 – Crie dois atributos no contexto da View Main, um para o Input_field e outro para exibir a mensagem no TextView:
3 – Crie um evento de clique para o botão e utilize o código abaixo para criar seu recurso javascript dinamicamente:
4 – Ative e teste sua aplicação, entre com um valor e a função Javascript do recurso criado dinamicamente chamado script.js será executada e seu resultado retornado em uma variável javascript chamada resultado que será recuperada e exibida na página Web.
Exemplo:
Neste exemplo utilizamos a classe CL_JAVA_SCRIPT para criar um arquivo Javascript que contem uma função e uma variável que retorna o resultado da função, utilizamos o evento de clique do botão para criar, compilar e executar a função Javascript e manipula-la através de código ABAP.
Abap
method ONACTIONONCLIQUEBOTAO . * //Declara objetos javascript e scripts DATA: MSG TYPE string, Get_valor TYPE string, JS_Objeto TYPE REF TO CL_JAVA_SCRIPT, MeuScript TYPE String. * //Os códigos utilizando a instrução WRITE * //Não tem efeito no Web Dynpro * //você pode utilizar os trechos em um programa comum * //para testar o seu javascript dinâmico. * //Cria Script CONCATENATE ' function quadrado(x) { return x * x}; ' ' var resultado = quadrado(mapa) ' INTO MEUSCRIPT SEPARATED BY CL_ABAP_CHAR_UTILITIES=>CR_LF. * //Cria objeto javascript JS_OBJETO = CL_JAVA_SCRIPT=>CREATE( ). * //Compila objeto javascript JS_OBJETO->COMPILE( exporting SCRIPT_NAME = 'script.js' SCRIPT = MEUSCRIPT ). * //Verifica compilação if JS_OBJETO->LAST_CONDITION_CODE <> 0. write: / 'Erro de compilação de script', JS_OBJETO->LAST_ERROR_MESSAGE. else. write / 'foi compilado com sucesso'. endif. * //Recupera valor do usuário DATA lo_el_context TYPE REF TO if_wd_context_element. DATA ls_context TYPE wd_this->Element_context. DATA lv_valor TYPE wd_this->Element_context-valor. * //Recupera elemento via lead selection lo_el_context = wd_context->get_element( ). * // @TODO Caso queira validar o elemento vazio IF lo_el_context IS INITIAL. ENDIF. * //Recupera o atributo lo_el_context->get_attribute( EXPORTING name = `VALOR` IMPORTING value = lv_valor ). * //Define um valor de variavel atravez do ABAP JS_OBJETO->SET( NAME = 'mapa' VALUE = lv_valor ). * //Executa Javascript JS_Objeto->EXECUTE( exporting SCRIPT_NAME = 'script.js' ). * //Verifica se script foi executado if JS_OBJETO->LAST_CONDITION_CODE <> 0. write: / 'Erro na execução de script', JS_OBJETO->LAST_ERROR_MESSAGE. else. write / 'JavaScript foi executado com sucesso'. endif. skip. * //Retorna valor de script GET_VALOR = JS_OBJETO->GET( NAME = 'resultado' ). * //Define uma menssagem para o usuario DATA lv_msg TYPE wd_this->Element_context-msg. * //Recupera o elemento via lead selection lo_el_context = wd_context->get_element( ). * // @TODO - caso queira validar IF lo_el_context IS INITIAL. ENDIF. * //Cria mensagem de retorno para o usuário CONCATENATE lv_valor ' * ' lv_valor ' = ' GET_VALOR INTO MSG. lv_msg = MSG. * //Define valor do atributo lo_el_context->set_attribute( name = `MSG` value = lv_msg ). * //Verifica se o objeto retornou um valor if JS_OBJETO->LAST_CONDITION_CODE <> 0. write: / 'Erro em recuperar objeto javascript', JS_OBJETO->LAST_ERROR_MESSAGE. else. write: / 'Valor do objeto :', GET_VALOR. endif. endmethod.