{"id":7767,"date":"2022-07-22T06:34:23","date_gmt":"2022-07-22T06:34:23","guid":{"rendered":"https:\/\/www.jose-aguilar.com\/blog\/?p=7767"},"modified":"2022-07-22T06:34:23","modified_gmt":"2022-07-22T06:34:23","slug":"todo-lo-que-necesitas-saber-sobre-xmlhttprequest","status":"publish","type":"post","link":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/","title":{"rendered":"Todo lo que necesitas saber sobre XMLHttpRequest"},"content":{"rendered":"<p><strong>XMLHttpRequest<\/strong> es un objeto nativo del navegador que permite hacer solicitudes HTTP desde <strong>JavaScript<\/strong>.<\/p>\n<p>Con este objeto puedes cargar y descargar cualquier tipo de archivo pero tambi\u00e9n se puede utilizar para conseguir otras metas.<\/p>\n<p>Se que hoy en d\u00eda hay otro m\u00e9todo m\u00e1s moderno que hace que el objeto <strong>XMLHttpRequest<\/strong> se quede obsoleto pero te voy a explicar 3 razones por las que <strong>XMLHttpRequest<\/strong> todav\u00eda se utiliza y no debes dejar de aprender su uso o al menos conocer su existencia.<\/p>\n<p><strong>XMLHttpRequest<\/strong> se usa por tres razones:<\/p>\n<ol>\n<li>Existen infinidad de scripts existentes que usan <strong>XMLHttpRequest<\/strong>.<\/li>\n<li>Mantener el funcionamiento de aplicaciones en navegadores antiguos.<\/li>\n<li>Rastreo del progreso de la subida de archivos.<\/li>\n<\/ol>\n<p>Si algunos de estos motivos tiene mucho peso para ti, usa <strong>XMLHttpRequest<\/strong> sin duda.<\/p>\n<p>De lo contrario, te recomiendo usar la t\u00e9cnica m\u00e1s moderna \u00abfetch\u00bb de la que pronto hablar\u00e9 en este blog.<\/p>\n<h2>Creaci\u00f3n de las instancia<\/h2>\n<p>Puedes crear una instancia del objeto as\u00ed:<\/p>\n<div id=\"wpshdo_1\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_1\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_1\"><\/a><a id=\"wpshat_1\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_1\"  onClick=\"javascript:wpsh_toggleBlock(1)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_code(1)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_1\" onClick=\"javascript:wpsh_print(1)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_1\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\"><span class=\"kw2\">const<\/span> request <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> XMLHttpRequest<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>Es una llamada sencilla sin par\u00e1metros, ya que, el constructor no tiene argumentos.<\/p>\n<h2>M\u00e9todos principales<\/h2>\n<p>Lo primero que se suele hacer, justo despu\u00e9s de crear la instancia del objeto es inicializarlo con la funci\u00f3n:<\/p>\n<div id=\"wpshdo_2\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_2\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_2\"><\/a><a id=\"wpshat_2\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_2\"  onClick=\"javascript:wpsh_toggleBlock(2)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_code(2)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_2\" onClick=\"javascript:wpsh_print(2)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_2\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"kw3\">open<\/span><span class=\"br0\">&#40;<\/span>method<span class=\"sy0\">,<\/span> URL<span class=\"sy0\">,<\/span> <span class=\"br0\">[<\/span>async<span class=\"sy0\">,<\/span> user<span class=\"sy0\">,<\/span> password<span class=\"br0\">]<\/span><span class=\"br0\">&#41;<\/span><\/pre><\/div><\/div>\n<p>Este m\u00e9todo open() especifica los par\u00e1metros principales para la petici\u00f3n:<\/p>\n<ul>\n<li><em><strong>method:<\/strong><\/em>\u00a0m\u00e9todo HTTP. Usualmente \u00abGET\u00bb o \u00abPOST\u00bb.<br \/>\n<strong>URL:<\/strong>\u00a0la URL a solicitar, una cadena, puede ser un objeto URL.<br \/>\n<strong>async<\/strong>: si se asigna expl\u00edcitamente a false, entonces la petici\u00f3n ser\u00e1 asincr\u00f3nica. En caso contrario, petici\u00f3n s\u00edncrona. Por defecto, la petici\u00f3n es as\u00edncrona.<br \/>\n<strong>user, password:<\/strong>\u00a0usuario y contrase\u00f1a para autenticaci\u00f3n HTTP b\u00e1sica (si se requiere).<\/li>\n<\/ul>\n<p>Para enviar la petici\u00f3n utiliza:<\/p>\n<div id=\"wpshdo_3\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_3\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_3\"><\/a><a id=\"wpshat_3\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_3\"  onClick=\"javascript:wpsh_toggleBlock(3)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_code(3)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_3\" onClick=\"javascript:wpsh_print(3)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_3\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>Este m\u00e9todo abre la conexi\u00f3n y env\u00eda la solicitud al servidor.<\/p>\n<p>Se puede usar un par\u00e1metro opcional que permite enviar par\u00e1metros al servidor.<\/p>\n<p>Por ejemplo, se puede usar este par\u00e1metro para enviar datos de un formulario al servidor usando el m\u00e9todo POST.<\/p>\n<h2>Eventos m\u00e1s utilizados<\/h2>\n<p>Los eventos m\u00e1s m\u00e1s \u00fatiles son los siguientes:<\/p>\n<ul>\n<li><strong>load<\/strong>: cuando la solicitud est\u00e1; completa (incluso si el estado HTTP es 400 o 500), y la respuesta se descarg\u00f3 por completo.<br \/>\n<strong>error<\/strong>: cuando la solicitud no pudo ser realizada satisfactoriamente, ej. red ca\u00edda o una URL inv\u00e1lida.<br \/>\n<strong>progress<\/strong>: se dispara peri\u00f3dicamente mientras la respuesta est\u00e1 siendo descargada, reporta cu\u00e1nto se ha descargado.<\/li>\n<\/ul>\n<h2>Propiedades del resultado de la solicitud<\/h2>\n<p>Una vez el servidor ha respondido, es posible recibir el resultado mediante las siguientes propiedades del objeto <em>request<\/em>:<\/p>\n<ul>\n<li><strong>status<\/strong>: C\u00f3digo del estado HTTP (un n\u00famero): 200, 404, 403 y as\u00ed por el estilo, puede ser 0 en caso de una falla no HTTP.<\/li>\n<li><strong>statusText<\/strong>: Mensaje del estado HTTP (una cadena): usualmente OK para 200, Not Found para 404, Forbidden para 403 y as\u00ed por el estilo.<\/li>\n<li><strong>response<\/strong> (scripts antiguos deben usar responseText): El cuerpo de la respuesta del servidor.<\/li>\n<li><strong>timeout<\/strong>: l\u00edmite de tiempo en milisegundos.<\/li>\n<\/ul>\n<p>Ejemplo:<\/p>\n<div id=\"wpshdo_4\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_4\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_4\"><\/a><a id=\"wpshat_4\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_4\"  onClick=\"javascript:wpsh_toggleBlock(4)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_4\" onClick=\"javascript:wpsh_code(4)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_4\" onClick=\"javascript:wpsh_print(4)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_4\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">responseType<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">'json'<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<h2>Tipo de respuesta<\/h2>\n<p>Con la propiedad request.responseType puedes asignar el formato de la respuesta:<\/p>\n<ul>\n<li>\u00ab\u00bb (default) \u2013 obtiene una cadena<\/li>\n<li>\u00abtext\u00bb \u2013 obtiene una cadena<\/li>\n<li>\u00abarraybuffer\u00bb \u2013 obtiene un ArrayBuffer (para datos binarios, ve el cap\u00edtulo ArrayBuffer, arrays binarios),<\/li>\n<li>\u00abblob\u00bb \u2013 obtiene un Blob (para datos binarios, ver el cap\u00edtulo Blob).<\/li>\n<li>\u00abdocument\u00bb \u2013 obtiene un documento XML (puede usar XPath y otros m\u00e9todos XML) o un documento HTML (en base al tipo MIME del dato recibido).<\/li>\n<li>\u00abjson\u00bb \u2013 obtiene un JSON (autom\u00e1ticamente analizado).<\/li>\n<\/ul>\n<h2>Estados de la solicitud<\/h2>\n<p>El objeto <strong>XMLHttpRequest<\/strong> cambia de estado a medida que avanza en su progreso.<\/p>\n<p>El estado actual es accesible con request.readyState.<\/p>\n<p>A continuaci\u00f3n puedes ver todos los estados:<\/p>\n<div id=\"wpshdo_5\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_5\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_5\"><\/a><a id=\"wpshat_5\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_5\"  onClick=\"javascript:wpsh_toggleBlock(5)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_5\" onClick=\"javascript:wpsh_code(5)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_5\" onClick=\"javascript:wpsh_print(5)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_5\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">UNSENT <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ estado inicial<\/span>\nOPENED <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ llamada abierta<\/span>\nHEADERS_RECEIVED <span class=\"sy0\">=<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ cabeceras de respuesta recibidas<\/span>\nLOADING <span class=\"sy0\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ la respuesta est\u00e1 cargando (un paquete de datos es recibido)<\/span>\nDONE <span class=\"sy0\">=<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">;<\/span> <span class=\"co1\">\/\/ solicitud completa<\/span><\/pre><\/div><\/div>\n<p>Estos estados puedes seguirlos usando el evento request.readystatechange:<\/p>\n<div id=\"wpshdo_6\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_6\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_6\"><\/a><a id=\"wpshat_6\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_6\"  onClick=\"javascript:wpsh_toggleBlock(6)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_6\" onClick=\"javascript:wpsh_code(6)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_6\" onClick=\"javascript:wpsh_print(6)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_6\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">onreadystatechange<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n  <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>request.<span class=\"me1\">readyState<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"co1\">\/\/cargando<\/span>\n  <span class=\"br0\">&#125;<\/span>\n  <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>request.<span class=\"me1\">readyState<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n    <span class=\"co1\">\/\/solicitud finalizada<\/span>\n  <span class=\"br0\">&#125;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>Puedes encontrar oyentes del evento readystatechange en c\u00f3digo realmente antiguo.<\/p>\n<p>En el pasado no exist\u00eda load y otros eventos.<\/p>\n<p>Hoy en d\u00eda, los manipuladores load\/error\/progress hacen obsoleto el evento readystatechange.<\/p>\n<h2>\u00bfC\u00f3mo abortar solicitudes?<\/h2>\n<p>Puedes terminar la solicitud en cualquier momento con:<\/p>\n<div id=\"wpshdo_7\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_7\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_7\"><\/a><a id=\"wpshat_7\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_7\"  onClick=\"javascript:wpsh_toggleBlock(7)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_7\" onClick=\"javascript:wpsh_code(7)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_7\" onClick=\"javascript:wpsh_print(7)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_7\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">abort<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>En este caso, request.status pasa a tener un valor de 0.<\/p>\n<h2>Gesti\u00f3n de cabeceras<\/h2>\n<p><strong>XMLHttpRequest<\/strong> permite tanto enviar cabeceras personalizadas como leer cabeceras de la respuesta.<\/p>\n<p>Existen 3 m\u00e9todos para las cabeceras HTTP:<\/p>\n<p>setRequestHeader(name, value): Asigna la cabecera de la solicitud con los valores name y value provistos.<\/p>\n<p>Por ejemplo:<\/p>\n<div id=\"wpshdo_8\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_8\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_8\"><\/a><a id=\"wpshat_8\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_8\"  onClick=\"javascript:wpsh_toggleBlock(8)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_8\" onClick=\"javascript:wpsh_code(8)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_8\" onClick=\"javascript:wpsh_print(8)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_8\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">response.<span class=\"me1\">setRequestHeader<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Content-Type'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'application\/json'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>Muchas cabeceras se administran exclusivamente por el navegador, ej. Referer y Host.<\/p>\n<p><strong>XMLHttpRequest<\/strong> no est\u00e1 permitido cambiarlos, por motivos de seguridad del usuario y la exactitud de la solicitud.<\/p>\n<p>getResponseHeader(name): Obtiene la cabecera de la respuesta con el name dado (excepto Set-Cookie y Set-Cookie2).<\/p>\n<p>Por ejemplo:<\/p>\n<div id=\"wpshdo_9\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_9\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_9\"><\/a><a id=\"wpshat_9\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_9\"  onClick=\"javascript:wpsh_toggleBlock(9)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_9\" onClick=\"javascript:wpsh_code(9)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_9\" onClick=\"javascript:wpsh_print(9)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_9\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">getResponseHeader<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Content-Type'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>getAllResponseHeaders(): Devuelve todas las cabeceras de la respuesta, excepto por Set-Cookie y Set-Cookie2.<\/p>\n<h2>Enviar un formulario<\/h2>\n<p>Teniendo como punto de partida el siguiente formulario:<\/p>\n<div id=\"wpshdo_10\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_10\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_10\"><\/a><a id=\"wpshat_10\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_10\"  onClick=\"javascript:wpsh_toggleBlock(10)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_10\" onClick=\"javascript:wpsh_code(10)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_10\" onClick=\"javascript:wpsh_print(10)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_10\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"html4strict\" style=\"font-family:monospace;\"><span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/form.html\"><span class=\"kw2\">form<\/span><\/a> <span class=\"kw3\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;register&quot;<\/span>&gt;<\/span>\n  <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/input.html\"><span class=\"kw2\">input<\/span><\/a> <span class=\"kw3\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;name&quot;<\/span> <span class=\"kw3\">value<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;Jose&quot;<\/span>&gt;<\/span>\n  <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/input.html\"><span class=\"kw2\">input<\/span><\/a> <span class=\"kw3\">name<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;lastname&quot;<\/span> <span class=\"kw3\">value<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;Aguilar&quot;<\/span>&gt;<\/span>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/form.html\"><span class=\"kw2\">form<\/span><\/a>&gt;<\/span><\/pre><\/div><\/div>\n<div id=\"wpshdo_11\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_11\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_11\"><\/a><a id=\"wpshat_11\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_11\"  onClick=\"javascript:wpsh_toggleBlock(11)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_11\" onClick=\"javascript:wpsh_code(11)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_11\" onClick=\"javascript:wpsh_print(11)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_11\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">let formData <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> FormData<span class=\"br0\">&#40;<\/span>document.<span class=\"me1\">forms<\/span>.<span class=\"me1\">register<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"co1\">\/\/ agrega un campo m\u00e1s<\/span>\nformData.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;submitForm&quot;<\/span><span class=\"sy0\">,<\/span> 1<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\n<span class=\"co1\">\/\/ lo enviamos<\/span>\nlet request <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> XMLHttpRequest<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\nrequest.<span class=\"kw3\">open<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;POST&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;ajax.php&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\nrequest.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span>formData<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\nrequest.<span class=\"kw3\">onload<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"kw3\">alert<\/span><span class=\"br0\">&#40;<\/span>request.<span class=\"me1\">response<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<p>Otra opci\u00f3n muy utilizada es enviar el formulario con JSON:<\/p>\n<div id=\"wpshdo_12\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_12\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_12\"><\/a><a id=\"wpshat_12\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_12\"  onClick=\"javascript:wpsh_toggleBlock(12)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_12\" onClick=\"javascript:wpsh_code(12)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_12\" onClick=\"javascript:wpsh_print(12)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_12\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">let request <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> XMLHttpRequest<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\nlet json <span class=\"sy0\">=<\/span> JSON.<span class=\"me1\">stringify<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>\n  <span class=\"kw3\">name<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Jose&quot;<\/span><span class=\"sy0\">,<\/span>\n  surname<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Aguilar&quot;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\nrequest.<span class=\"kw3\">open<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;POST&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'ajax.php'<\/span><span class=\"br0\">&#41;<\/span>\nrequest.<span class=\"me1\">setRequestHeader<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Content-type'<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">'application\/json; charset=utf-8'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\nrequest.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span>json<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<h2>Progreso de carga<\/h2>\n<p>Si tienes la intenci\u00f3n de permitir la subida de alg\u00fan fichero grande en tu servidor, seguramente puedas estar interesado en rastrear el progreso de la carga para mejorar la usabilidad mostr\u00e1ndole al usuario de que debe esperar a que se cargue el fichero para avanzar.<\/p>\n<p>Hay otro objeto exclusivamente para rastrear los eventos de subida: request.upload.<\/p>\n<p>Este genera eventos similares a request, pero request.upload se dispara solo en las subidas:<\/p>\n<ul>\n<li>loadstart \u2013 carga iniciada.<\/li>\n<li>progress \u2013 se dispara peri\u00f3dicamente durante la subida.<\/li>\n<li>abort \u2013 carga abortada.<\/li>\n<li>error \u2013 error no HTTP.<\/li>\n<li>load \u2013 carga finalizada con \u00e9xito.<\/li>\n<li>timeout \u2013 carga caducada (si la propiedad timeout est\u00e1 asignada).<\/li>\n<li>loadend \u2013 carga finalizada con \u00e9xito o error.<\/li>\n<\/ul>\n<p>Ejemplos de manejadores:<\/p>\n<div id=\"wpshdo_13\" class=\"wp-synhighlighter-outer\"><div id=\"wpshdt_13\" class=\"wp-synhighlighter-expanded\"><table border=\"0\" width=\"100%\"><tr><td align=\"left\" width=\"80%\"><a name=\"#codesyntax_13\"><\/a><a id=\"wpshat_13\" class=\"wp-synhighlighter-title\" href=\"#codesyntax_13\"  onClick=\"javascript:wpsh_toggleBlock(13)\" title=\"Click to show\/hide code block\">Source code<\/a><\/td><td align=\"right\"><a href=\"#codesyntax_13\" onClick=\"javascript:wpsh_code(13)\" title=\"Show code only\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/code.png\" \/><\/a>&nbsp;<a href=\"#codesyntax_13\" onClick=\"javascript:wpsh_print(13)\" title=\"Print code\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/printer.png\" \/><\/a>&nbsp;<a href=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/About.html\" target=\"_blank\" title=\"Show plugin information\"><img decoding=\"async\" border=\"0\" style=\"border: 0 none\" src=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/plugins\/wp-synhighlight\/themes\/default\/images\/info.gif\" \/><\/a>&nbsp;<\/td><\/tr><\/table><\/div><div id=\"wpshdi_13\" class=\"wp-synhighlighter-inner\" style=\"display: block;\"><pre class=\"javascript\" style=\"font-family:monospace;\">request.<span class=\"me1\">upload<\/span>.<span class=\"me1\">onprogress<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span>event<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n  <span class=\"kw3\">alert<\/span><span class=\"br0\">&#40;<\/span>`Descargado $<span class=\"br0\">&#123;<\/span>event.<span class=\"me1\">loaded<\/span><span class=\"br0\">&#125;<\/span> de $<span class=\"br0\">&#123;<\/span>event.<span class=\"me1\">total<\/span><span class=\"br0\">&#125;<\/span> bytes`<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\nrequest.<span class=\"me1\">upload<\/span>.<span class=\"kw3\">onload<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n  <span class=\"kw3\">alert<\/span><span class=\"br0\">&#40;<\/span>`El archivo se carg\u00f3 correctamente.`<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span>\n&nbsp;\nrequest.<span class=\"me1\">upload<\/span>.<span class=\"kw3\">onerror<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span>\n  <span class=\"kw3\">alert<\/span><span class=\"br0\">&#40;<\/span>`Error durante la carga<span class=\"sy0\">:<\/span> $<span class=\"br0\">&#123;<\/span>xhr.<span class=\"kw3\">status<\/span><span class=\"br0\">&#125;<\/span>`<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/pre><\/div><\/div>\n<h2>Conclusiones<\/h2>\n<p>Esta entrada es m\u00e1s bien te\u00f3rica.<\/p>\n<p>Ahora ya tienes todo lo que necesitas saber sobre <strong>XMLHttpRequest<\/strong>.<\/p>\n<p>Dejo en tus manos que lo practiques.<\/p>\n<p>En cualquier caso, en pr\u00f3ximos tutoriales entrar\u00e9 en detalle con los ejemplos m\u00e1s pr\u00e1cticos mencionados aqu\u00ed tales como el env\u00edo de un formulario o el rastreo de la carga de un fichero.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.<\/p>\n","protected":false},"author":1,"featured_media":7771,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,14],"tags":[84],"class_list":["post-7767","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ajax","category-javascript","tag-formularios"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog<\/title>\n<meta name=\"description\" content=\"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog\" \/>\n<meta property=\"og:description\" content=\"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/\" \/>\n<meta property=\"og:site_name\" content=\"Jose Aguilar Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/joseaguilarblog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-22T06:34:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"500\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jose Aguilar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:site\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jose Aguilar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/\",\"name\":\"Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png\",\"datePublished\":\"2022-07-22T06:34:23+00:00\",\"author\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\"},\"description\":\"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png\",\"contentUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png\",\"width\":500,\"height\":500,\"caption\":\"XMLHttpRequest\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.jose-aguilar.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Todo lo que necesitas saber sobre XMLHttpRequest\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/\",\"name\":\"Jose Aguilar Blog\",\"description\":\"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\",\"name\":\"Jose Aguilar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"caption\":\"Jose Aguilar\"},\"description\":\"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.\",\"sameAs\":[\"https:\/\/plus.google.com\/114357189801512615537\"],\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog","description":"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"es_ES","og_type":"article","og_title":"Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog","og_description":"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.","og_url":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/","og_site_name":"Jose Aguilar Blog","article_publisher":"https:\/\/www.facebook.com\/joseaguilarblog","article_published_time":"2022-07-22T06:34:23+00:00","og_image":[{"width":500,"height":500,"url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png","type":"image\/png"}],"author":"Jose Aguilar","twitter_card":"summary_large_image","twitter_creator":"@JoseAguilarBlog","twitter_site":"@JoseAguilarBlog","twitter_misc":{"Escrito por":"Jose Aguilar","Tiempo de lectura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/","url":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/","name":"Todo lo que necesitas saber sobre XMLHttpRequest - Jose Aguilar Blog","isPartOf":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage"},"image":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage"},"thumbnailUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png","datePublished":"2022-07-22T06:34:23+00:00","author":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11"},"description":"Descubre cuales son los m\u00e9todos y propiedades del objeto XMLHttpRequest. Env\u00eda un formulario mediante Ajax y controla el progreso de carga.","breadcrumb":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#primaryimage","url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png","contentUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2022\/07\/Todo-lo-que-necesitas-saber-sobre-XMLHttpRequest.png","width":500,"height":500,"caption":"XMLHttpRequest"},{"@type":"BreadcrumbList","@id":"https:\/\/www.jose-aguilar.com\/blog\/todo-lo-que-necesitas-saber-sobre-xmlhttprequest\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.jose-aguilar.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Todo lo que necesitas saber sobre XMLHttpRequest"}]},{"@type":"WebSite","@id":"https:\/\/www.jose-aguilar.com\/blog\/#website","url":"https:\/\/www.jose-aguilar.com\/blog\/","name":"Jose Aguilar Blog","description":"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11","name":"Jose Aguilar","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","caption":"Jose Aguilar"},"description":"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.","sameAs":["https:\/\/plus.google.com\/114357189801512615537"],"url":"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/"}]}},"_links":{"self":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/7767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/comments?post=7767"}],"version-history":[{"count":0,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/7767\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media\/7771"}],"wp:attachment":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media?parent=7767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/categories?post=7767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/tags?post=7767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}