Documentos de Académico
Documentos de Profesional
Documentos de Cultura
O AJAX termo uma pseudo-sigla para "Asynchronous JavaScript And XML", (Ver nota) , mas agora muito usado de forma mais ampla para cobrir todos os mtodos de se comunicar com um servidor usando JavaScript. Como veremos, Ajax (Ver nota) nem sempre assncrona e nem sempre envolvem XML.
O Objetivo do Ajax
O principal objetivo do Ajax proporcionar um meio simples e padro para uma pgina web para se comunicar com o servidor sem uma atualizao de pgina completa. Para ilustrar isto, considere um simples formulrio de registro.Voc tem muito provvel experimentou a frustrao de ter que tentar vrios nomes de usurio quando se inscrever para algum site novo. Voc preencher todo o formulrio, clique no boto enviar, aguarde um segundo ou assim, e em seguida, obter a mesma forma de volta com uma mensagem dizendo que o nome de usurio que voc escolheu no est disponvel. Voc tenta outro mais fcil de lembrar nome de usurio e encontr-lo tambm no est disponvel.Voc repetir isso vrias vezes at que finalmente voc escolhe alguns nome de usurio obscura. Este processo no seria to ruim se voc no tem que esperar a pgina inteira para atualizar cada vez que voc tentou um novo nome de usurio. (Ver nota) Mas isso um exemplo muito simples. Algumas aplicaes web-based requerem constante interao com um banco de dados atravs de uma camada intermediria. Tomemos, por exemplo, uma interface para atualizar os registros de empregados. A maneira tradicional de se fazer isso ilustrado abaixo.
2. Quando o usurio escolhe um empregado, o servidor retorna uma nova pgina (FIRST REFRESH) e um formulrio exibido. (AjaxBasics / Demos / EditEmployee.jsp)
3. O usurio pode ento editar os dados de funcionrios (por exemplo, alterar "Andrew" para "Andy") e enviar o formulrio. O servidor ento retorna a nova
4. Para voltar para a lista de funcionrios para iniciar o processo de modificar dados de outro empregado, o usurio teria que clicar sobre o "Employee List" link (REFRESH TERCEIROS).
1. Como com o mtodo tradicional, a aplicao Ajax mostra uma lista de funcionrios para escolher.(AjaxBasics / Solues / EmployeeAdmin.html)
2. Quando o usurio escolhe um empregado, a pgina no recarregar. Em vez disso, uma chamada Ajax para o servidor feita, o servidor retorna o
3. O usurio pode ento editar os campos do formulrio. Cada vez que um campo de formulrio perde o foco mudou a alterao enviada para o servidor com Ajax, as atualizaes do lado do servidor codificar os dados no banco de dados e envia de volta a lista atualizada dos funcionrios para o navegador. JavaScript novamente utilizado para exibir a lista actualizada na
pgina.
4. A lista de funcionrios atualizado para refletir as alteraes feitas. Aviso "Andrew" foi alterado para "Andy" na lista. exibida uma mensagem informando ao usurio que o banco de dados foi atualizado. (Ver nota)
Tudo isso feito sem ter que fazer uma atualizao completa ainda. Esta a grande vantagem do Ajax.
O objeto XMLHttpRequest
O mecanismo para o envio de dados para e recuperar dados do servidor com o Ajax o objeto XMLHttpRequest.Infelizmente, os browsers modernos que suportam pedidos XMLHttp tm mtodos diferentes para faz-lo. Vamos examinar o mtodo Mozilla (Ver nota) eo mtodo do Internet Explorer e depois vamos ambos os mtodos abstratos com uma nica funo definida pelo usurio.
[ieXmlHttpVersions.length] = "Microsoft.XMLHTTP"; var i; for (i = 0; i <ieXmlHttpVersions.length; i + +) {try {var xmlhttp = new ActiveXObject (ieXmlHttpVersions [i]);. document.getElementById ("Contedo") innerHTML = "<h1> Usando" + ieXmlHttpVersions [i] + "</ h1 > "; break;} catch (exc) {alert (ieXmlHttpVersions [i] +" no suportado. ");}} if (typeof xmlhttp ==" undefined ") document.getElementById (" Contedo ") <innerHTML =". h1> XMLHttp no pode ser criado </ h1> ";} </ script> </ head> <a <body> Iniciar href="javascript:Start()"> </ a> <div id="Content"> </ div> </ body> </ html> Explicao cdigo Este cdigo cria um array contendo os nomes de todas as diferentes verses do Microsoft XMLHttp do controle ActiveX, comeando com o mais recente. Em seguida, percorre o array e usa o primeiro controle disponvel para criar um objeto xmlhttp. Assim que encontrar um, ele grava a verso sendo usada para o corpo da pgina. Se nenhuma das verses suportado, ele escreve "XMLHttp no pode ser criado!"
} catch (ERR2) { alert (ieXmlHttpVersions [i] + "no suportado."); } } } if (typeof xmlhttp == "undefined") document.getElementById ("Contedo") innerHTML = "<h1> XMLHttp no pode ser criado </ h1>".; } </ Script> ---- ---- Cdigo Omitida
A abrir tpicas () chamada de mtodo mostrado abaixo. Xmlhttp.open ("GET", "Demo.xml", true);
Tipos de pedido
Embora a especificao HTTP identifica vrios mtodos de solicitaes HTTP (Ver nota) , o mais comumente suportado (e usados) so mtodos GET, POST e HEAD. CABEA O mtodo HEAD o menos usado dos trs, entretanto, para pedidos simples, pode ser tudo que voc precisa. Ele simplesmente retorna o meta-informao contida no cabealho HTTP. A chamada ficaria assim: Xmlhttp.open ("HEAD", "Demo.jsp", true); E a resposta pode ter esta aparncia: Servidor: Microsoft-IIS/5.1 X-Powered-By: ASP.NET Data: Fri, 03 Mar 2006 17:47:47 GMT Content-Type: text / xml Accept-Ranges: bytes Last-Modified: Fri, 03 Mar 2006 14:07:51 GMT ETag: "50c59dccb3ec61: 99E" Content-Length: 21 O pedido enviado XMLHttpRequest como segue: xmlhttp.send (null); Ns vamos explicar porque nulo passado em apenas um momento. GET O mtodo GET usado para enviar informaes para o servidor como parte da URL. O servidor retorna as informaes de cabealho mesmo que o mtodo retorna HEAD, mas tambm retorna o corpo da mensagem (ie, o contedo da pgina). Quaisquer pares nome-
valor para ser processado pela pgina de recepo deve ser passado ao longo da querystring. A chamada ficaria assim: Xmlhttp.open ("GET", "Demo.jsp FirstName = Nat & Dunn LastName =?", true); A resposta seria a mesma que a resposta mostrada para o mtodo HEAD seguido pelo corpo da mensagem, que normalmente seria de texto simples, HTML ou XML. Mais uma vez, o pedido XMLHttpRequest enviado da seguinte forma: xmlhttp.send (null); POST O mtodo POST usado para enviar informao como uma entidade fechada. A chamada ficaria assim: Xmlhttp.open ("POST", "Demo.jsp", true); O cabealho de resposta um pouco diferente na medida em que especifica que o contedo retornado no armazenvel em cache. Como com GET, o corpo da mensagem normalmente seria de texto simples, HTML ou XML. O pedido enviado XMLHttpRequest como segue: xmlhttp.setRequestHeader ("Content-Type", "application / xwww-form-urlencoded"); xmlhttp.send ("FirstName = Nat & Dunn LastName ="); Como voc pode ver, com POST, primeiro precisamos definir o tipo de contedo para "application / x-www-form-urlencoded;". Isso informa ao servidor que esperar os dados do formulrio. No mtodo de envio, que incluem pares nome-valor. Estes pares nome-valor esto disponveis para a pgina de recebimento para o processamento. Nada pode ser enviado desta forma com a cabea e mtodos GET, razo pela qual nulo foi passado nos exemplos anteriores. Veremos mais tarde que tambm podemos enviar dados em outros formatos, como XMLprimas, utilizando o mtodoPOST.
Este uso de uma funo inline pode ser novidade para voc. Em JavaScript, as funes so objetos de primeira classe e pode ser atribudo a variveis ou propriedades de outros objetos. Poderamos tambm criar uma funo chamada e atribuir essa funo para xmlhttp.onreadystatechange. O arquivo de exemplo a seguir ilustra como o evento readystatechange manipulado.
Na prtica, antes de fazer qualquer coisa com os dados de resposta xmlhttp, queremos garantir que oreadyState est completo (4), ento colocamos uma condio dentro da nossa funo para verificar o seguinte: xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { / / Faz alguma coisa aqui } } Agora estamos prontos para fazer algo com os dados retornados. Antes de olhar para um exemplo, vamos dar uma olhada nas propriedades e mtodos do objeto xmlhttp, por isso sabemos o que est disponvel para ns. Propriedades do objeto XMLHttpRequest Propriedade onreadystatechange readyState responseText responseXML estado statusText Descrio Especifica a funo de callback para ser disparado quando o estado muda pronta. Contm o estado da resposta. Mantm o corpo da mensagem como uma string. Mantm o corpo da mensagem como um objeto XML. Detm o cdigo de status retornado do servidor (por exemplo, 200 para o sucesso, 404 para pgina no encontrada, etc.) Contm o texto de status retornado do servidor. Objeto XMLHttpRequest Mtodos Mtodo abort () getAllResponseHeaders () getResponseHeader (header) open (mtodo, URL, Async) send (postData) setRequestHeader (valor de cabealho) Descrio Aborta a solicitao XMLHTTP. Recupera os valores de todos os cabealhos HTTP como uma string. Recupera o valor do cabealho HTTP especificado como uma string. Inicializa o objeto XMLHttpRequest. Envia a solicitao HTTP para o servidor. Especifica o nome eo valor de um cabealho HTTP.
Uma aplicao comum verificar a propriedade status para se certificar de que o pedido foi bem sucedida e, em seguida, para a sada do corpo da mensagem para uma div na pgina HTML. O arquivo de exemplo a seguir demonstra isso.
xmlhttp.send (null); } ---- ---- Cdigo Omitida Explicao cdigo Esta pgina simplesmente "copia" o texto de resposta (xmlhttp.responseText) e "cola" que em "Contedo" div na pgina.
1. AjaxBasics abrir / Exerccios / EmployeeList.jsp em seu editor de e revisar o cdigo. Esta pgina retorna uma lista dos funcionrios como links. Quando os links so clicados, o GetEmployeeForm (funo) chamado com EmployeeForm.jsp eo EmployeeID como parmetros passados. O primeiro item da lista gerada mostrado abaixo: 2. <li> 3. <A href = "javascript: void (0)" 4. onclick = "GetEmployeeForm ('EmployeeForm.jsp', 1)"> Nancy Davolio </ a> </ Li> 5. AjaxBasics abrir / Exerccios / EmployeeForm.jsp em seu editor de e revisar o cdigo. Esta pgina retorna um formulrio preenchido com os dados do funcionrio cujo id foi passado ao longo dos querystring. Para ver isto, em seu browser para navegar AjaxBasics / Exerccios / EmployeeForm.jsp? Eid = 1. O cdigo retornado mostrado abaixo: <h2> Employee Editar </ h2> onsubmit="return <form false"> <table> <tr> <td> Nome: </ td> <input type = "text" name = value "FirstName" = "Nancy" onchange = "UpdateEmployee ('EditEmployee.jsp', 'Nome', this.value, 1);" /> </ td> </ tr> <tr> <td> Sobrenome: </ td> <td> <input type="text" name="LastName" value="Davolio" onchange=" UpdateEmployee('EditEmployee.jsp','LastName',this.va lue,1); "/> </ td> < / tr> <tr> <td> Ttulo: </ td> <input type = "text" name = "Ttulo" value = "Sales Representative" onchange = "UpdateEmployee ('EditEmployee.jsp', 'Ttulo' , this.value, 1); "/> </ td> </ tr> <tr> <td> Extenso: </ td> <input type =" text "name =" Extenso "value =" 5467 "onchange =" UpdateEmployee ('EditEmployee.jsp', 'extenso', this.value, 1); "/> </ td> </ tr> </ table> </ form> Como uma pgina independente, parece como se segue:
6. AjaxBasics abrir / Exerccios / EditEmployee.jsp em seu editor de e revisar o cdigo. Esta pgina atualiza o banco de dados e redireciona para EmployeeForm.jsp para que o formulrio ser devolvido.
7. AjaxBasics abrir / Exerccios / Scripts / Ajax.js em seu editor de e revisar o cdigo. Esta pgina contm apenas a funo para criar o objeto XMLHttpRequest. A funo chamada createXHR (). 8. AjaxBasics abrir / Exerccios / EmployeeAdmin.html para edio. Este o lugar onde voc vai fazer o seu trabalho. 1. Na funo GetEmployeeList () onde o comentrio : abrir um XMLHttpRequest usando o mtodo POST. Use o passado em URL. Quando o estado das mudanas pedido, chamar o mtodo display (). Enviar o pedido. 2. No visor () funo: Defina a propriedade innerHTML de OutputDiv ao r esponseText do objeto xmlhttp retornado. Teste a sua soluo para esta pea, abrindo AjaxBasics / Exerccios / EmployeeAdmin.html no seu browser. Voc dever ver uma lista dos funcionrios. Se voc no fizer isso, verifique o seu GetEmployeeList () e display () funes. 3. Na funo GetEmployeeForm (): Abra um XMLHttpRequest usando o mtodo POST. Use o passado em URL. Certifique-se de passar na EmployeeID como "eid" na querystring. Quando o estado das mudanas pedido, chamar o mtodo display (). Enviar o pedido. 4. No UpdateEmployee (funo): Abra um XMLHttpRequest usando o mtodo POST. Use o passado em URL. Certifique-se de passar na EmployeeID como "eid", o campo que est sendo alterado como "campo" eo valor novo campo como "valor" na querystring. Quando o estado das mudanas pedido, chamar o mtodoEmployeeUpdated (). Enviar o pedido.
"Aviso"; OutputDiv.innerHTML = xmlhttp.responseText;} else {/ /. Defina a propriedade innerHTML de OutputDiv ao responseText do objeto xmlhttp}}} function GetEmployeeForm (URL, EID) {OutputDiv = document.getElementById ("FormDiv"); OutputDiv.innerHTML = Loading "..."; / * Abre um XMLHttpRequest usando o mtodo POST. Use o passado em URL. Certifique-se de passar na EmployeeID como "eid" na querystring. Quando o estado das mudanas pedido, chamar o mtodo display (). Enviar o pedido. * UpdateEmployee funo /} (URL, campo de valor,, EID) {/ * Abre um XMLHttpRequest usando o mtodo POST. Use o passado em URL. Certifique-se de passar na EmployeeID como "eid", o campo que est sendo alterado como "campo" eo valor novo campo como "valor" na querystring. Quando o estado das mudanas pedido, chamar o mtodo EmployeeUpdated (). Enviar o pedido. * EmployeeUpdated funo /} () {if (xmlhttp.readyState == 4 & & xmlhttp.status == 200) {var MessageDiv = document.getElementById ("MessageDiv"); if (xmlhttp.responseText.indexOf ("Failed") = = 0) {MessageDiv.className = "Aviso"; MessageDiv.innerHTML = xmlhttp.responseText;} else {MessageDiv.innerHTML = "Atualizado!"; FadeElem (MessageDiv, 255,255,0,255,255,255); setTimeout (function () {GetEmployeeList (' EmployeeList.jsp ')}, "1000"); / Call / para GetEmployeeList est atrasado para dar ao banco de dados uma oportunidade de atualizao. }}} Window.onload = function () {GetEmployeeList ("EmployeeList.jsp");} </ script> </ head> <body> <h1> Administrao Employee </ h1> <p nome do funcionrio Clique para modificar. </ p> <div id="EmployeeList"> </ div> <div id="FormDiv"> </ div> <div id="MessageDiv"> </ div> </ body> </ html> Onde est a soluo?
Notas de Rodap
1. Ajax: Uma Nova Abordagem para Aplicaes Web http://www.adaptivepath.com/publications/essays/archives/000385.php 2. Embora no seja incomum ver o termo escrito em letras maisculas (AJAX), est se tornando padro para escrev-lo como Ajax. 3. Para um bom exemplo de melhorar esta experincia, ver o Encontrar um domnio formulrio de busca em nome http://sbs.smallbusiness.yahoo.com/domains . 4. Na prtica, voc pode querer fazer isso "Atualizado!" mensagem de menos distrao ou usar um boto ao invs de mudar o evento para iniciar as atualizaes. 5. Este mtodo tambm suportado pelo Opera e Safari. 6. Na verdade, o Internet Explorer 7 ter suporte nativo para o objeto XMLHttpRequest. 7. http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html # sec5.1.1 Para continuar a aprender Ajax ir para o topo desta pgina e clique na prxima lio na Tabela esse Tutorial Ajax de Contedo.