Introdução ao jQuery

Felippe Alex Scheidt · Capítulo 23 de 27

Páginas do PDF

Introdução ao jQuery

4.4 Manipulação dinâmica do DOM

4.4 Manipulação dinâmica do DOM Funções para alteração dinâmica do DOM, seja removendo, adicionando ou alterando a hierarquia de elementos da árvore do document object model.

 

A função wrap()

Esta função envolve um elemento com outra tag. No código abaixo, toda vez que o button recebe um clique, a função wrap() envolve o mesmo com uma div:

<!DOCTYPE html>

<html lang="pt">

<head>

<style>

div{border: 1px solid black;padding:20px;}

</style>

<meta charset="UTF-8"/>

<script src="jquery.js"></script>

<script>

$(document).ready(function(){

$("#bto").click(function(){

$(this).wrap("<div></div>");

});

});

</script>

</head>

<body>

<button id="bto">Wrap this!</button>

</body>

</html>

O elemento div será criado dinamicamente e adicionado ao DOM, ao entorno do button nesse caso.

 

Funções insertBefore e insertAfter

A função insertBefore permite anexar um elemento no DOM, exatamente antes de um determinado elemento. A função insertAfter faz o oposto, ela permite anexar um elemento logo depois de um determinado elemento. No exemplo a seguir, temos dois botões. O primeiro insere um elemento p, criado dinamicamente, antes do elemento #menu. O segundo botão insere um elemento p, depois do elemento #menu:

<!DOCTYPE html>

<html lang="pt">

<head>

<meta charset="UTF-8"/>

<style>

div, p{border:1px solid black;margin:10px;}

#menu{background-color:lightgreen;}

</style>

<script src="jquery.js"></script>

<script>

$(document).ready(function(){

$("#insertB").click(function(){

$("<p>elemento inserido antes</p>").insertBefore("#menu");

});

$("#insertA").click(function(){

$("<p>elemento inserido depois</p>").insertAfter("#menu");

});

});

</script>

</head>

<body>

<button id="insertB">InsertBefore P</button>

<button id="insertA">InsertAfter P</button> <h1>Título principal</h1>

<div id="menu">Porções: arroz, batata frita</div>

<div id="artigos">Conheça mais sobre culinária</div>

</body>

</html>

 

Função replaceWith

Esta função substitui um elemento por outro. No exemplo a seguir, quando o button #trocar é pressionado, a div "#content" é substituída por um parágrafo. O novo elemento é passado como parâmetro na função replaceWith. Depois que o replaceWith é executado, a div content não existirá mais na árvore DOM. O replaceWith pode ser visto também como a execução de duas operações: (1) remove a div e (2) adiciona o novo elemento.

<!DOCTYPE html>

<html lang="pt">

<head>

<meta charset="UTF-8"/>

<style>

div,p{border:1px solid black;

margin:10px;background-color:yellow;

}

p{background-color:lightgreen;}

</style>

<script src="jquery.js"></script>

<script>

$(document).ready(function(){

$("#trocar").click(function(){

$("#content").replaceWith("<p>Novo conteudo!</p>");

});

});

</script>

</head>

<body>

<button id="trocar">ReplaceWith p</button>

<div id="content">Conteúdo da div sobre alguma coisa

importante.</div>

</body>

</html>

 

A função clone()

Esta função, como o próprio nome já diz, faz um clone ou uma cópia de determinado elemento. Às vezes, criar seu próprio elemento usando apenas o jQuery pode ser muito trabalhoso, ainda mais se este elemento possui diversos nodos filhos. É o caso do código abaixo, onde sempre que o usuário clica no botão "Novo campo", uma nova linha na tabela é inserida. Se fossemos criar esta linha manualmente, precisaríamos criar 3 inputs, depois anexá-las a 3 <td>s e depois anexá-las a <tr>. Isso acaba sendo muito trabalhoso. A alternativa aqui é usar a função clone, onde apenas especificamos o elemento a ser copiado e a função retorna um novo elemento, independente do elemento original. Depois disso, basta anexá-lo num ponto da árvore DOM:

<!DOCTYPE html>

<html lang="pt">

<head>

<meta charset="UTF-8"/>

<script src="jquery.js"></script>

<style>

tr:nth-child(even){

background-color: blue;

}

</style>

<script>

var newTR;

$(document).ready(function(){

$("#cloneButton").click(function(){

newTR = $("#notas tbody tr:first").clone();

newTR.children().children().val("");

$("#notas tbody").append(newTR);

});

});

</script>

</head>

<body>

<button id="cloneButton">Novo campo</button>

<table id="notas">

<thead>

<tr>

<th>Nome</th>

<th>Nota 1</th>

<th>Nota 2</th>

</tr>

</thead>

<tbody>

<tr>

<td><input type="text" name="nome"/></td> <td><input type="number" name="n1" step="any"

min="0" max="10"/>

</td>

<td><input type="number" name="n2" step="any"

min="0" max="10"/>

</td>

</tr>

</tbody>

</table>

</body>

</html>

Uma observação importante quando se trabalha com a função clone: cuidado ao clonar elementos que possuem um id. Neste caso, ou você não usa id, optando pelo uso de classes, ou antes de anexar o elemento clonado você altera o id desse elemento. Lembre-se que esta é uma regra importante do HTML e que se, não respeitada, poderá comprometer a funcionalidade do jQuery e do JavaScript e o seu script não terá o resultado esperado.

A função load()

Esta função carrega dados do servidor e os anexam diretamente em um elemento HTML. No exemplo abaixo, a função load() carrega o conteúdo do arquivo "roteiros.txt" e o anexa ao elemento #lista. A função load é um tipo de chamada ajax. Para conseguir testar esta função é necessário que a mesma esteja dentro de um servidor web como, por exemplo, o apache.

<!DOCTYPE html>

<html lang="pt">

<head>

<meta charset="UTF-8"/>

<script src="jquery.js"></script>

<style>

ul{font-family:monospace;}

button{display:block;margin: 20px 0px;}

</style>

<script>

$(document).ready(function(){

$("#prox").click(function(){

$("#lista").load("roteiros.txt");

});

});

</script>

</head>

<body>

<h4>Melhores destinos</h4>

<button id="prox">Carregar lista</button> <ul id="lista">

</ul>

</body>

</html>

 

A função ajax()

Esta função permite gerar requisições do tipo GET ou POST para um servidor de forma assíncrona, isto é, sem a necessidade de bloquear a interface do usuário até o retorno da resposta. Para fazer uma chamada assíncrona precisamos definir alguns parâmetros:

url : define o endereço da página ou arquivo a ser requisitado.

context : define o elemento que será vinculado à requisição, geralmente aquele que receberá os dados retornados pelo servidor.

type : define qual o método de requisição que será utilizado, geralmente GET ou POST.

success : define a função callback, que é executada após a resposta do servidor.

Abaixo temos um exemplo de requisição assíncrona que solicita o arquivo tabela.txt, sem bloquear a navegação do usuário. Caso a resposta seja confirmada (com sucesso), uma função anônima é declarada, cujo parâmetro data encapsula os dados retornados pelo servidor. Nesse caso, a operação se completa fazendo um append() desses dados ao elemento #lista.

<!DOCTYPE html>

<html lang="pt">

<head>

<meta charset="UTF-8"/>

<script src="jquery.js"></script>

<style>

ul{font-family:monospace;}

button{display:block;margin: 20px 0px;}

</style>

<script>

$(document).ready(function(){

$("#carregar").click(function(){

$.ajax({

url: "tabela.txt",

context: $("#lista"),

type: "GET",

success: function(data){

this.append(data);