{"id":7429,"date":"2019-04-02T08:40:54","date_gmt":"2019-04-02T11:40:54","guid":{"rendered":"https:\/\/www.mxcursos.com\/blog\/?p=7429"},"modified":"2019-04-02T22:14:09","modified_gmt":"2019-04-03T01:14:09","slug":"criando-efeito-no-formulario-com-javascript","status":"publish","type":"post","link":"https:\/\/www.mxcursos.com\/blog\/criando-efeito-no-formulario-com-javascript\/","title":{"rendered":"Criando efeito no formul\u00e1rio com Javascript"},"content":{"rendered":"<p>Nesse tutorial voc\u00ea vai aprender a criar um efeito no formul\u00e1rio com Javascript, incrementando mais a experi\u00eancia do usu\u00e1rio com seu site e usando separadamente as responsabilidades com HTML, CSS e claro, Javascript.<\/p>\n<p>Para esse tutorial, na parte de Javascript, iremos utilizar s\u00f3 a linguagem JS, sem adotar algum framework ou biblioteca. Primeiro porque o script ser\u00e1 pequeno e segundo porque sempre \u00e9 interessante desacoplar sua aplica\u00e7\u00e3o de um framework. E de quebra, aprenderemos coisas novas, nesse caso, alguns recursos do ES6 ou <a href=\"http:\/\/www.ecma-international.org\/ecma-262\/6.0\/\" target=\"_blank\" rel=\"noopener noreferrer\">ECMAScript 2015<\/a>.<\/p>\n<p>Vamos seguir a premissa de separar as responsabilidade: HTML para marca\u00e7\u00e3o, CSS para estiliza\u00e7\u00e3o e Javascript para comportamento.<\/p>\n<p><a href=\"https:\/\/www.mxcursos.com\/blog\/exemplos\/form\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">Veja aqui o exemplo online do efeito no formul\u00e1rio<\/a><\/p>\n<h2>Escrevendo HTML<\/h2>\n<p>Vamos definir nossa marca\u00e7\u00e3o com HTML.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;form action=\"\" class=\"form-container\"&gt;\r\n     \r\n\r\n&lt;\/form&gt;<\/pre>\n<p>Definimos primeiro o formul\u00e1rio, que apenas ter\u00e1 uma classe. Nesse exemplo, <strong>.form-container<\/strong>.<\/p>\n<p>\u00c9 interessante adicionar classes a elementos aos quais voc\u00ea precise estilizar ou precise fazer altera\u00e7\u00f5es pontuais, mas n\u00e3o quer interferir em outros elementos iguais.<\/p>\n<p>Prefira <strong>classes<\/strong> ao inv\u00e9s de <strong>id&#8217;s<\/strong>. Isso porque o <strong>id<\/strong> precisa ser \u00fanico na p\u00e1gina e existe uma tend\u00eancia de querermos reaproveitar os estilos. Desta forma, n\u00e3o poder\u00edamos adicionar o mesmo id em outro elemento para aproveitar o estilo.<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;form action=\"\" class=\"form-container\"&gt;\r\n        &lt;div class=\"fields\"&gt;\r\n          \r\n        &lt;\/div&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Vamos agora adicionar uma <strong>div <\/strong>com a classe <strong>.fields\u00a0<\/strong>, que servir\u00e1 para agrupar o elemento do formul\u00e1rio.<\/p>\n<p>\u00c9 comum utilizarmos a tag de par\u00e1grafo para este fim, mas semanticamente n\u00e3o seria o ideal, j\u00e1 que n\u00e3o se trata de um paragrafo. Al\u00e9m disso, a <strong>div<\/strong> \u00e9 um elemento &#8220;n\u00e3o sem\u00e2ntico&#8221; e nesse caso se encaixa perfeitamente.<\/p>\n<pre class=\"lang:xhtml decode:true\">    &lt;form action=\"\" class=\"form-container\"&gt;\r\n        &lt;div class=\"fields\"&gt;\r\n            &lt;input type=\"text\" name=\"name\"  class=\"input\" placeholder=\"Digite seu nome\"\/&gt;\r\n            \r\n        &lt;\/div&gt;\r\n    &lt;\/form&gt;<\/pre>\n<p>Agora adicionamos um campo do formul\u00e1rio <strong>input<\/strong> do tipo <strong>text<\/strong>. Iremos adicionar uma classe chamada <strong>.input .<\/strong><\/p>\n<pre class=\"lang:xhtml decode:true\">    &lt;form action=\"\" class=\"form-container\"&gt;\r\n        &lt;div class=\"fields\"&gt;\r\n            &lt;input type=\"text\" name=\"name\"  class=\"input\" placeholder=\"Digite seu nome\"\/&gt;\r\n            &lt;div class=\"highlight\"&gt;&lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/form&gt;<\/pre>\n<p>Agora adicionaremos uma\u00a0<strong>div<\/strong> com uma classe chamada<strong> .highlight<\/strong>. Ela ir\u00e1 ser respons\u00e1vel pelo efeito como fosse simular uma barra que vai acompanhando enquanto digitamos.<\/p>\n<p>Pronto, basicamente esse \u00e9 no nosso HTML.<\/p>\n<h2>Escrevendo CSS<\/h2>\n<p>Vamos criar um arquivo chamado <strong>style.css<\/strong> e adicion\u00e1-lo numa pasta chamada <strong>css.<\/strong><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-7441 size-full\" src=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta.jpg\" alt=\"Estrutura da pasta para o CSS\" width=\"324\" height=\"316\" srcset=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta.jpg 324w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta-24x24.jpg 24w\" sizes=\"(max-width: 324px) 100vw, 324px\" \/><\/p>\n<p>Antes de escrever o CSS, vamos linkar ao nosso arquivo index.html<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;link rel=\"stylesheet\" href=\"css\/style.css\" \/&gt;<\/pre>\n<p>Para utilizar esse arquivo css, adicionaremos a tag <strong>link<\/strong>\u00a0e no atributo <strong>href<\/strong>, indicando onde est\u00e1 o arquivo. Esse c\u00f3digo ficar\u00e1 dentro do bloco da tag <strong>head.<\/strong><\/p>\n<p>Para um melhor entendimento do nosso c\u00f3digo CSS, deixarei os blocos separados para explicar melhor e depois, no final, mostro todo c\u00f3digo CSS, ok?<\/p>\n<pre class=\"lang:css decode:true \">.form-container{\r\n    width:500px;\r\n    margin:0 auto;\r\n}<\/pre>\n<ul>\n<li>Na linha 1, selecionamos o elemento do formul\u00e1rio.<\/li>\n<li>Na linha 2, definimos a largura do formul\u00e1rio.<\/li>\n<li>Na linha 3, definimos para que ele fique centralizado na horizontal.<\/li>\n<\/ul>\n<pre class=\"lang:css decode:true \">.form-container .fields {\r\n    position: relative;\r\n    width: 100%;\r\n    margin:25px auto;\r\n}<\/pre>\n<ul>\n<li>Na linha 1, selecionamos o <strong>.fields<\/strong>. Nesse caso, usamos a sele\u00e7\u00e3o a partir do elemento pai, que seria o <strong>.form-container.<\/strong><\/li>\n<li>Na linha 2, definimos um <strong>position<\/strong> com valor <strong>relative<\/strong>, porque no elemento filho <strong>.highlight<\/strong> ser\u00e1 definido como absoluto e para garantimos o posicionamento de acordo com elemento pai, esse elemento ser\u00e1 definido como <strong>relativo.<\/strong><\/li>\n<li>Na linha 3, definimos uma largura de 100%.<\/li>\n<li>Na linha 4, definimos um margin com altura e base de 25px e direito e esquerda com auto.<\/li>\n<\/ul>\n<pre class=\"lang:css decode:true\">.form-container .input {\r\n    width:100%;\r\n    height: 50px;\r\n    font-size: 12px;\r\n    line-height: 12px;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n    border:0;\r\n    outline: none;\r\n    border-bottom:3px solid #000; \r\n}<\/pre>\n<ul>\n<li>Na linha 1, selecionamos o elemento do formul\u00e1rio, que atribu\u00edmos a classe <strong>.input.<\/strong><\/li>\n<li>Na linha 2, definimos uma largura de 100%.<\/li>\n<li>Na linha 3, uma altura de 50px.<\/li>\n<li>Na linha 4, o tamanho da fonte para 12px.<\/li>\n<li>Na linha 5, o espa\u00e7o entre linhas tamb\u00e9m de 12px.<\/li>\n<li>Na linha 6, escolhemos a fonte Arial, Helvetica e sans-serif.<\/li>\n<li>Na linha 7, removemos a borda.<\/li>\n<li>Na linha 8, removemos o contorno.<\/li>\n<li>Na linha 9, adicionamos uma borda na base com 3px. Ele servir\u00e1 como uma linha-guia para fazermos o efeito.<\/li>\n<\/ul>\n<pre class=\"lang:css decode:true \">.form-container .highlight{\r\n    position: absolute;\r\n    left:0;\r\n    bottom: 0; \r\n    width: auto;\r\n    max-width: 100%;\r\n    height:0;\r\n    overflow: hidden;\r\n    border-top:3px solid #F00;\r\n    font-size: 12px;\r\n    line-height: 12px;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n}<\/pre>\n<ul>\n<li>Na linha 1, selecionamos a <strong>div.highlight.<\/strong><\/li>\n<li>Na linha 2, definimos um <strong>position <\/strong>como <strong>absolute<\/strong> em rela\u00e7\u00e3o ao elemento pai, que no caso \u00e9 o <strong>form.form-container.<\/strong> Como definimos ele como <strong>position<\/strong> <strong>relative<\/strong>, o calculo da posi\u00e7\u00e3o dele ser\u00e1 baseado no do pai. Caso n\u00e3o tiv\u00e9ssemos definido o elemento pai como <strong>relative,<\/strong>\u00a0a base do c\u00e1lculo da posi\u00e7\u00e3o seria o <strong>body.<\/strong><\/li>\n<li>Na linha 3, definimos left:0 para que elemento encoste a esquerda.<\/li>\n<li>Na linha 4, definimos bottom:0, para o elemento encoste na base.<\/li>\n<li>Na linha 5, definimos uma largura como autom\u00e1tica, onde navegador ir\u00e1 definir essa largura.<\/li>\n<li>Na linha 6, definimos uma largura m\u00e1xima de 100%.<\/li>\n<li>Na linha 7, definimos uma altura como zero para n\u00e3o mostrar o conte\u00fado que existir\u00e1 dentro dela.<\/li>\n<li>Na linha 8, definimos o <strong>overflow<\/strong> como <strong>hidden\u00a0<\/strong>para n\u00e3o permitir que o conte\u00fado seja exibido al\u00e9m do que foi definido na width e height.<\/li>\n<li>Na linha 9, definimos uma borda no topo, que ser\u00e1 o efeito quando a pessoa estiver digitando.<\/li>\n<li>Na linha 10, definimos o tamanho da fonte.<\/li>\n<li>Na linha 11, definimos o espa\u00e7o entre linha.<\/li>\n<li>Na linha 13, definimos a fonte.<\/li>\n<\/ul>\n<p>\u00c9 importante as defini\u00e7\u00f5es da tamanho, espa\u00e7o de linha e fonte sejam a mesmas, tanto do campo <strong>input<\/strong> quanto na <strong>div.highlight<\/strong><\/p>\n<pre class=\"lang:css decode:true \">.form-container{\r\n    width:500px;\r\n    margin:0 auto;\r\n}\r\n\r\n.form-container .fields {\r\n    position: relative;\r\n    width: 100%;\r\n    margin:25px auto;\r\n}\r\n\r\n.form-container .input {\r\n    width:100%;\r\n    height: 50px;\r\n    font-size: 12px;\r\n    line-height: 12px;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n    border:0;\r\n    outline: none;\r\n    border-bottom:3px solid #000; \r\n}\r\n\r\n.form-container .highlight{\r\n    position: absolute;\r\n    left:0;\r\n    bottom: 0; \r\n    width: auto;\r\n    max-width: 100%;\r\n    height:0;\r\n    overflow: hidden;\r\n    border-top:3px solid #F00;\r\n    font-size: 12px;\r\n    line-height: 12px;\r\n    font-family: Arial, Helvetica, sans-serif;\r\n}<\/pre>\n<h2>Escrevendo o Javascript<\/h2>\n<p>Vamos criar agora o c\u00f3digo Javascript que definir\u00e1 o comportamento que desejamos, que no caso seria o efeito ao digitar no campo <strong>input.<\/strong> Ele vai adicionar o mesmo conte\u00fado digitado no elemento <strong>.highlight<\/strong> .<\/p>\n<p>Vamos criar um arquivo chamado <strong>main.js<\/strong>, e adicionar na pasta <strong>js.<\/strong><\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-7457 size-full\" src=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta-2.jpg\" alt=\"Estrutura da pasta para o Javascript\" width=\"324\" height=\"316\" srcset=\"https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta-2.jpg 324w, https:\/\/www.mxcursos.com\/blog\/wp-content\/uploads\/2017\/12\/html-css-pasta-2-24x24.jpg 24w\" sizes=\"(max-width: 324px) 100vw, 324px\" \/><\/p>\n<p>Agora vamos adicionar o Javascript na nossa p\u00e1gina html.<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;script type=\"text\/javascript\" src=\"js\/main.js\"&gt;&lt;\/script&gt;<\/pre>\n<p>Criamos uma tag <strong>script<\/strong>\u00a0e com atributo <strong>src<\/strong> indicamos onde est\u00e1 o arquivo <strong>js<\/strong>. Esse c\u00f3digo ser\u00e1 adicionado antes do fechamento da tag <strong>body<\/strong>.<\/p>\n<p>Nessa parte, iremos fazer como mostrado na parte do HTML, adicionaremos cada parte e comentando tudo para um melhor entendimento.<\/p>\n<pre class=\"lang:js decode:true \">let fields = document.querySelectorAll('.fields');<\/pre>\n<p>Definimos uma vari\u00e1vel com palavra reservada <strong>let<\/strong>. Ele \u00e9 diferente da palavra reservada <strong>var<\/strong>, porque a <strong>var<\/strong> define uma vari\u00e1vel global e o <strong>let<\/strong> define de acordo com o escopo de bloco.<\/p>\n<p>Nessa vari\u00e1vel <strong>fields<\/strong>, ela recebe todos os elementos que tenham a classe <strong>.fields<\/strong>. Se voc\u00ea j\u00e1 usou <strong>jQuery<\/strong>, sabe que essa sintaxe j\u00e1 \u00e9 familiar, s\u00f3 que voc\u00ea pode fazer nativamente com <strong>querySelectorAll .<\/strong><\/p>\n<pre class=\"lang:js decode:true\">let fields = document.querySelectorAll('.fields');\r\n\r\nfields.forEach( element =&gt; {\r\n\r\n});<\/pre>\n<p>Com <strong>document.querySelectorAll <\/strong>voc\u00ea ter\u00e1 o retorno de uma lista de elementos, mas precisamos percorrer essa lista. E para isso, usamos o <strong>forEach. <\/strong>Dentro desse <strong>forEach, <\/strong>executamos uma <strong>fun\u00e7\u00e3o an\u00f4nima, <\/strong>que \u00e9 passado o par\u00e2metro e o elemento que foi percorrido.<\/p>\n<p>Essa sintaxe da <strong>fun\u00e7\u00e3o an\u00f4nima<\/strong> \u00e9 chamado <strong>arrow function<\/strong>. Seria uma forma curta para cria\u00e7\u00e3o de uma fun\u00e7\u00e3o an\u00f4nima e onde o <strong>this<\/strong> \u00e9 relacionado ao contexto, mas n\u00e3o define na fun\u00e7\u00e3o em si.<\/p>\n<p>Isso poderia ser feito dessa forma:<\/p>\n<pre class=\"lang:js decode:true \">fields.forEach(function(element) {\r\n\r\n});<\/pre>\n<p>Mas sempre \u00e9 bom ver novos recursos, pois iremos ver esta sintaxe cada vez mais.<\/p>\n<pre class=\"lang:js decode:true\">let fields = document.querySelectorAll('.fields');\r\n\r\nfields.forEach( element =&gt; {\r\n    let input = element.querySelector('.input');\r\n    let highlight = element.querySelector('.highlight');\r\n});<\/pre>\n<p>Iremos recuperar o <strong>.input<\/strong> e o <strong>.highlight<\/strong>. Agora, usaremos o <strong>querySelector<\/strong>, que diferente do <strong>querySelectorAll <\/strong>retorna uma cole\u00e7\u00e3o de elementos, mas ele retorna apenas o primeiro. Usaremos o <strong>querySelector<\/strong> a partir dos itens retornados do <strong>forEach<\/strong>.<\/p>\n<pre class=\"lang:js decode:true\">let fields = document.querySelectorAll('.fields');\r\n\r\nfields.forEach( element =&gt; {\r\n    let input = element.querySelector('.input');\r\n    let highlight = element.querySelector('.highlight');\r\n    \r\n    input.addEventListener('keyup', e =&gt; {\r\n\r\n    });\r\n});<\/pre>\n<p>Agora precisamos capturar o que foi digitado pelo usu\u00e1rio. E para isso, adicionamos um evento ao <strong>input.<\/strong> Para adicionar o evento, utilizamos <b>addEventListener. <\/b>No primeiro par\u00e2metro, informamos qual evento queremos, que no caso seria <b>keyup. <\/b>No segundo, o <b>callback, <\/b>que ser\u00e1 executado quando for disparado o evento. Como \u00e9 uma fun\u00e7\u00e3o an\u00f4nima, usamos a sintaxe do <strong>arrow function.<\/strong><\/p>\n<pre class=\"lang:js decode:true\">let fields = document.querySelectorAll('.fields');\r\n\r\nfields.forEach( element =&gt; {\r\n    let input = element.querySelector('.input');\r\n    let highlight = element.querySelector('.highlight');\r\n    \r\n    input.addEventListener('keyup', e =&gt; {\r\n        let value = input.value;\r\n        highlight.innerHTML = value;\r\n\r\n    });\r\n});<\/pre>\n<p>Agora, criamos uma vari\u00e1vel com nome <strong>value,<\/strong> que recebe o valor digitado no <strong>input<\/strong>. Depois, adicionamos esse valor digitado dentro do elemento <strong>.highlight.<\/strong><\/p>\n<p>Pronto, dessa forma, basta digitar o valor do formul\u00e1rio que ele vai exibindo a barra acompanhando. Veja ele funcionando:<\/p>\n<p><a href=\"https:\/\/www.mxcursos.com\/blog\/exemplos\/form\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">Exemplo Online<\/a><\/p>\n<h2>Algumas considera\u00e7\u00f5es<\/h2>\n<p>Quando foi solicitado para adicionar o Javascript no final do body, estamos fazendo uma boa pr\u00e1tica para melhorar o carregamento da p\u00e1gina. Outra quest\u00e3o importante \u00e9 que precisamos carregar a estrutura dos elementos primeiro, para depois selecion\u00e1-los. Mas e se voc\u00ea precisar adicionar na tag head,? Precisar\u00edamos informar para carregar o script s\u00f3 depois do carregamento do DOM. Para isso, podemos fazer dessa forma:<\/p>\n<pre class=\"lang:js decode:true \">document.addEventListener('DOMContentLoaded', function(){\r\n\r\n \/*Aqui dentro iria o c\u00f3digo*\/\r\n\r\n});<\/pre>\n<p>Adicionamos a um evento <strong>DOMContentLoaded<\/strong>, que vai executar s\u00f3 quando carrega o DOM.<\/p>\n<p>Outra quest\u00e3o \u00e9 sobre o <strong>arrow functions<\/strong>. Lembre que informei sobre <strong>this<\/strong> que \u00e9 relacionado ao contexto e n\u00e3o a ele mesmo? Vamos utilizar o tutorial para vermos isso na pr\u00e1tica. Vamos trocar <strong>arrow functions<\/strong> para fun\u00e7\u00e3o an\u00f4nima (<strong>expression functions).<\/strong><\/p>\n<pre class=\"lang:js decode:true\">let fields = document.querySelectorAll('.fields');\r\n\r\nfields.forEach(function(element){\r\n    let input = element.querySelector('.input');\r\n    let highlight = element.querySelector('.highlight');\r\n    input.addEventListener('keyup', function() {\r\n        let value = this.value;\r\n        highlight.innerHTML = value;\r\n    });\r\n})<\/pre>\n<p>Veja que o c\u00f3digo permaneceu o mesmo, trocamos s\u00f3 <strong>arrow functions<\/strong> pelas fun\u00e7\u00f5es an\u00f4nimas (<strong>expression functions<\/strong>), mas dentro do evento <strong>keyup.<\/strong> Ao inv\u00e9s de usar o <strong>input<\/strong> para recuperar o valor, usamos o <strong>this<\/strong>. O <strong>this<\/strong> nesse caso est\u00e1 relacionado \u00e0 fun\u00e7\u00e3o e n\u00e3o ao contexto. Ent\u00e3o ele pega o valor do evento disparado.<\/p>\n<p>Nesse tutorial, vimos conceitos <strong>ES6<\/strong>, a defini\u00e7\u00e3o de vari\u00e1vel com <strong>let<\/strong>, <strong>arrow functions<\/strong> e a diferen\u00e7a com <strong>expression functions <\/strong>al\u00e9m de\u00a0como utilizar <strong>addEventListener. <\/strong>Vimos ainda como esperar a execu\u00e7\u00e3o do c\u00f3digo s\u00f3 ap\u00f3s carregar o DOM usando <strong>DOMContentLoaded<\/strong>.<\/p>\n<p>Espero que tenha gostado.<\/p>\n<p>Abra\u00e7os!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesse tutorial voc\u00ea vai aprender a criar um efeito no formul\u00e1rio com Javascript, incrementando mais a experi\u00eancia do usu\u00e1rio com seu site e usando separadamente as responsabilidades com HTML, CSS e claro, Javascript. Para esse tutorial, na parte de Javascript, iremos utilizar s\u00f3 a linguagem JS, sem adotar algum framework ou biblioteca. Primeiro porque o [&hellip;]<\/p>\n","protected":false},"author":67,"featured_media":19180,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[678],"tags":[1292,1233],"class_list":["post-7429","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","tag-form","tag-javascript"],"_links":{"self":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/7429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/comments?post=7429"}],"version-history":[{"count":0,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/7429\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media\/19180"}],"wp:attachment":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media?parent=7429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/categories?post=7429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/tags?post=7429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}