Embutindo JavaScript em Páginas ASP.NET
JavaScript - Visão Geral
JavaScript, desenvolvido por Netscape Communications e Sun Microsystems, é uma linguagem de programação que podemos usar para adicionar efeitos dinâmicos a nossa página da web. HTML (Hypertext Markup Language) pode somente descrever o modo como os elementos das páginas web (text, forms, hyperlinks, tabelas, e etc [...]) são visualizados - eles não tem uma maneira de ordenar seus comportamentos. A capacidade de inserir scripts de JavaScript em páginas web nos fornece mais controle sobre como as páginas web se comportam.
Linguagens de script semelhantes ao JavaScript proporcionam a web maior poder de processamento e interatividade com o usuário. A utilização do JavaScript é comum em validações de formulário, processo de verificação de todas as informações requeridas e seus formatos - exemplo do formato de data (dd/mm/aaaa).
É importante ressaltar que a interpretação do código ocorre no lado cliente e após a página ter sido completamente baixada do servidor. Isso tem suas vantagens e desvantagens. Uma vantagem é que o JavaScript executa mais rápido que outras linguagens que comunicam direto com o servidor, porém é incapaz de acessar recursos localizados no servidor de que ele origina.
Por tudo, JavaScript não é compilado e independente, o que significa que ele tem que estar embutido em uma página web e ser executado em uma janela de navegador, pois é o navegador que faz interpretação do código JavaScript.
Embutindo Script em uma Página ASP.NET
Devido a importância dos scripts executados no lado cliente para o ASP.NET, não devemos ficar supresos ao ver a dedicação da Framework .NET implementar propriedades que nos permite gerar scripts no cliente a partir do servidor. O ASP.NET usa a nova propriedade "Page.ClientScript" para registrar e colocar as funções JavaScript na página.
Embutindo Blocos de Código no Topo
O método RegisterClientScriptBlock nos permite colocar funções JavaScript personalizadas no topo página - imediatamente após a tag <form>. As construções possíveis com este são:
- RegisterClientScriptBlock (type, key, script);
- RegisterClientScriptBlock (type, key, script, addScriptTags);
Onde:
- type - o tipo de cliente script para registrar. Neste caso, o tipo é a própria página;
- key - palavra chave que permite traçar as funções programaticamente;
- script - conteúdo de rotina do JavaScript;
- addScriptTags - valor booleano que indica se o ASP.NET deve incluir as tags <script> e </script> e inserir o conteúdo de rotina dentro destas.
Veja na prática:
'vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myScript As String = "function AlertHello() { alert('Hello ASP.NET'); }"
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "MyScript", myScript, _
True)
End Sub
//c#
protected void Page_Load(object sender, EventArgs e) {
string myScript = @"function AlertHello() { alert('Hello ASP.NET'); }";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "MyScript", myScript,
true);
}
<!-- Resultado HTML -->
<form>
<script type="text/javascript">
<!--
function AlertHello() { alert('Hello ASP.NET'); }// -->
</script>
<!-- [conteúdo] -->
</form>Listagem 01 - Exemplo de como utilizar o método RegisterClientScriptBlock
No exemplo da Listagem 01 nos especificamos o tipo como (vb) Me.GetType() e this.GetType() (c#), a chave "MyScript", o script para inclusão "function AlertHello(){ [...] }" e um valor "true", que permite colocar o script automaticamente dentro das tags <script>.
Quando temos um pouco de JavaScript que está trabalhando com algum controle em nossa página, e demais casos, devemos utilizar o método RegisterStartupScript em lugar de RegisterClientBlock. Por exemplo, nós usamos o seguinte código para criar uma página que inclui um simples controle <asp:TextBox> que contém um valor "Hello ASP.NET" (Listagem 02).
<asp:TextBox ID="TextBox1" Runat="server">Hello ASP.NET</asp:TextBox>Listagem 02 - Exemplo de controle TextBox
Utilize o método RegisterClientScriptBlock para embutir um script na página que acessa o valor do controle "TextBox1", ilustrado na Listagem 03.
'vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myScript As String = "alert(document.forms[0]['TextBox1'].value);"
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "myKey", myScript, _
True)
End Sub
//c#
protected void Page_Load(object sender, EventArgs e) {
string myScript = @"alert(document.forms[0]['TextBox1'].value);";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"MyScript", myScript, true);
}Listagem 03 - Exemplo de como acessar o controle "TextBox1" com o método RegisterClientScriptBlock
Ao rodar esta página será gerado um erro de JavaScript (Figura 01).
Figura 01 - Erro gerado pela utilização do método RegisterClientScriptBlockA razão deste erro é que a função JavaScript dispara antes das tags serem recebidas pelo navegador. Portanto, a função JavaScript não encontra "TextBox1" e causa erro.
Por fim, a diferença do método RegisterStartupScript é que ele insere a função JavaScript após todas as tags serem recebidas pelo navegador.
Embutindo Campos Ocultos
Desenvolvedores frequentemente armazenam pequenas quantidades de informações na página, ocultas de um usuário. Se o conteúdo é dinâmico, semelhante a uma variável, o formulário trabalhará com um armazenamento local. O método RegisterHiddenField() é responsável por esse procedimento. A construção possível com este método é:
- Page.ClientScript.RegisterHiddenField(hiddenFieldName, hiddenFieldInitialValue);
Onde:
- hiddenFieldName - representa o nome do Hidden, ou melhor, o identificador do controle;
- hiddenFieldInitialValue - valor inicial do controle;
Veja na prática:
'vbPage.ClientScript.RegisterHiddenField("submittime", "")
//c#
Page.ClientScript.RegisterHiddenField("submittime", "");
<!-- Resultado HTML -->
<input type="hidden" name="submittime" id="submittime" value="" />
Listagem 02 - Exemplo de como utilizar o método RegisterHiddenField
Para manipular este campo utilize "document.forms[0].submittime.value = 'submit';".
Uma das desvantagens é que o controle Hidden permite alteração de conteúdo via navegador, o que pode tornar a aplicação vulnerável.
Embutindo Blocos de Código na Base
O método RegisterStartupScript não é muito diferente do método RegisterClientScriptBlock. A grande diferença é que o RegisterStartupScript coloca o script na base da página - depois que o navegador receber todas as tags e antes da tag </form>. As construções possíveis com este são:
- RegisterStartupScript (type, key, script);
- RegisterStartupScript (type, key, script, addScriptTags);
Estes parâmetros seguem a mesma especificação do método RegisterClientScriptBlock.
Veja na prática:
'vb
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim myScript As String = "function AlertHello() { alert('Hello ASP.NET'); }"
Page.ClientScript.RegisterStartupScript(Me.GetType(), "myKey", myScript, _
True)
End Sub
//c#
protected void Page_Load(object sender, EventArgs e) {
string myScript = @"function AlertHello() { alert('Hello ASP.NET'); }";
Page.ClientScript.RegisterStartupScript(this.GetType(),
"MyScript", myScript, true);
}
<!-- Resultado HTML -->
<form>
<!-- [conteúdo] -->
<script type="text/javascript">
<!--
function AlertHello() { alert('Hello ASP.NET'); }// -->
</script>
</form>Listagem 03 - Exemplo de como utilizar o método RegisterStartupScript
Embutindo Referência a um Arquivo ".js"
Muitos desenvolvedores colocam o código JavaScript dentro de um arquivo .js. Considerado uma boa prática, um .js é um arquivo global que permite modificar facilmente o código, persistindo em toda aplicação. Podemos registrar arquivo de script em nossa página através do método RegisterClientScriptInclude. As construções possíveis com este são:
- RegisterClientScriptInclude (key, url);
- RegisterClientScriptInclude (type, key, url);
Onde:
- type - o tipo de cliente script para registrar. Neste caso, o tipo é a própria página;
- key - palavra chave que permite traçar as funções programaticamente;
- url - caminho do arquivo;
Veja na prática:
'vb
Dim myScript As String = "myJavaScriptCode.js"
Page.ClientScript.RegisterClientScriptInclude("myKey", myScript)
//c#
string myScript = "myJavaScriptCode.js"
Page.ClientScript.RegisterClientScriptInclude("myKey", myScript);
<!-- Resultado HTML -->
<script src="myJavaScriptCode.js" type="text/javascript"></script>Listagem 03 - Exemplo de como utilizar o método RegisterClientScriptInclude
Embutindo Atributo Específico em um Controle
O método RegisterExpandoAttribute registra um par de nome/valor como um atributo personalizado de um controle específico.
Confira: ClientScriptManager..::.RegisterExpandoAttribute
Embutindo Recursos
O método RegisterClientScriptResource registra recurso de script de cliente como objeto Page usando o tipo e o nome do recurso.
Confira: ClientScriptManager..::.RegisterClientScriptResource
Adicionando JavaScript a Controles de Servidor
Podemos adicionar efeitos no ASP.NET adicionando JavaScript inline no atributo. Para permitir um evento JavaScript para um objeto HTML, adicione o evento como um atributo do objeto HTML e informe qual a ação que será executada quando o evento for disparado.
Eventos Inline
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="alert('Hello ASP.NET')" />
<asp:Image ID="Image1" runat="server" OnMouseOver="alert('Hello ASP.NET')" />
Eventos Adicionados Dinamicamente
Image1.Attributes.Add("OnMouseOver", "alert('Hello ASP.NET')")
Button1.Attributes.Add("OnClick", "alert('Hello ASP.NET')")
Registrar Identificador dos Controles no Código JavaScript
Dim myScript As String = "<script>document.all." & TextBox1.ClientID & ".focus()</script>"
Page.ClientScript.RegisterStartupScript(Me.GetType(), "myKey", myScript, True)
OU
<!-- [...] -->
document.all.<%# Textbox1.ClientID %>.focus();
<!-- [...] -->Referências
- Professional ASP.NET 2.0 Published by Wiley Publishing, Inc.;
- ASP.NET 2.0 All-in-One Desk Reference For Dummies® Published by Wiley Publishing, Inc.;
- ASP.NET Cookbook, 2nd Edition By Michael A. Kittel, Geoffrey T. LeBlond ;
- ASP.NET Solutions—23 Case Studies: Best Practices for Developers By Rick Leinecker ;
- JavaScript Professional Projects by Paul Hatcher and John Gosney ;
- JavaScript™ by Example By Ellie Quigley ;
Estou disponível para qualquer dúvida ou sugestão (kallebe.santos@gmail.com).
Um grande abraço e até a próxima...