{"id":549,"date":"2024-04-03T17:53:41","date_gmt":"2024-04-03T17:53:41","guid":{"rendered":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/?p=549"},"modified":"2024-04-03T17:53:41","modified_gmt":"2024-04-03T17:53:41","slug":"creacion-de-un-cronometro-en-javascript-extendiendo-el-objeto-date","status":"publish","type":"post","link":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/?p=549","title":{"rendered":"Creaci\u00f3n de un cronometro en JavaScript, extendiendo el objeto Date"},"content":{"rendered":"\n<p>En contextos l\u00fadicos o evaluativos, como los que se presentan en el trabajo diario del programa de Producci\u00f3n Electr\u00f3nica Multimedial (PEM), la gesti\u00f3n del tiempo es crucial para establecer l\u00edmites y crear experiencias de usuario m\u00e1s din\u00e1micas. La ausencia de un objeto cron\u00f3metro en JavaScript y la falta de un m\u00e9todo dedicado en el objeto \u00abDate\u00bb han motivado la creaci\u00f3n de una soluci\u00f3n vers\u00e1til y f\u00e1cil de implementar.<\/p>\n\n\n\n<p>Para abordar este desaf\u00edo, proponemos extender la funcionalidad del objeto \u00abDate\u00bb mediante la creaci\u00f3n de un m\u00e9todo espec\u00edfico llamado \u00abChronometer\u00bb. Este m\u00e9todo, ser\u00e1 dise\u00f1ado para recibir tres par\u00e1metros clave como la referencia al elemento en el DOM, donde se visualizar\u00e1 el cron\u00f3metro, el tiempo establecido (con una opci\u00f3n predeterminada de 60 segundos) y una funci\u00f3n de \u201ccallback\u201d, que se ejecutar\u00e1 al alcanzar cero.<\/p>\n\n\n\n<p>A continuaci\u00f3n, presentamos los pasos detallados para replicar este cron\u00f3metro en aplicaciones web:<\/p>\n\n\n\n<p>Lo primero que se va a hacer es extender la funcionalidad del objeto \u201cDate\u201d, para implementar un m\u00e9todo llamado \u201cChronometer\u201d. Este m\u00e9todo, va a recibir tres par\u00e1metros:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>elem: referencia del elemento en el DOM, donde se va a mostrar el cron\u00f3metro<\/li>\n\n\n\n<li>time: tiempo del cron\u00f3metro en segundos, por defecto 60 segundos.<\/li>\n\n\n\n<li>callback: funci\u00f3n que se dispara cuando el cron\u00f3metro llega a cero.<\/li>\n<\/ul>\n\n\n\n<p>Seguidamente, se construir\u00e1 un prototipo del objeto \u201cDate\u201d con un m\u00e9todo llamado \u201cChronometer\u201d, el cual va a recibir los par\u00e1metros \u201celem\u201d, \u201ctime\u201d, \u201ccallback\u201d. Se sigue esta sintaxis, para agregar un m\u00e9todo a un objeto usando prototipos:<\/p>\n\n\n\n<div class=\"wp-block-group has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted has-white-background-color has-background has-small-font-size\">objeto.prototype.nombreFuncion = function(){\n\n\/\/ Lo que va dentro de la funci\u00f3n\n\n}\n\n<strong>\/* Donde, objeto: es el nombre del objeto de javascript que se le va a crear el m\u00e9todo\n\nprototype: palabra reservada de javascript para crear el prototipo\n\nnombreFuncion: nombre del m\u00e9todo que va a tener el objeto *\/<\/strong>\n<\/pre>\n<\/div><\/div>\n\n\n\n<p>El m\u00e9todo \u201cChronometer\u201d del objeto \u201cDate\u201d, debe quedar as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-white-background-color has-background has-small-font-size\">Date.prototype.chronometer = function(elem, time, callback){\n\n\/\/ aqu\u00ed se escribe el c\u00f3digo\n\n}<\/pre>\n\n\n\n<p>Se debe crear un archivo llamado \u201cchronometro.js\u201d y copiar el siguiente c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-white-background-color has-background has-small-font-size\">var intervalChronometer;\n\nDate.prototype.chronometer = function(elem, time=60, callback){\n\nlet segundosRestantes = time;\n\nintervalChronometer = window.setInterval(function(){\n\nconsole.log(segundosRestantes)\n\nif (segundosRestantes &lt;= 0) {\n\nclearInterval(intervalChronometer);\n\ncallback();\n\n} else {\n\nsegundosRestantes--;\n\nvar hours = Math.floor(segundosRestantes \/ 3600);\n\nvar minutes = Math.floor((segundosRestantes % 3600) \/ 60);\n\nvar seconds = segundosRestantes % 60;\n\nelem.innerHTML= `${String(hours).padStart(2,'0')}:${String(minutes).padStart(2,'0')}:${String(seconds).padStart(2,'0')}`;\n\n}\n\n},1000);\n\n}<\/pre>\n\n\n\n<p>Para implementar el prototipo creado, se deben seguir los siguientes pasos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se instancia el objeto \u201cDate\u201d y se llama al m\u00e9todo \u201cChronometer\u201d:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted has-white-background-color has-background has-small-font-size\">var fecha = new Date();\n\nfecha. Chronometer(elem, time, callback);<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Luego, se crea un archivo llamado \u201cindex.html\u201d, donde se copia el siguiente c\u00f3digo:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted has-white-background-color has-background has-small-font-size\">&lt;!DOCTYPE HTML&gt;\n\n&lt;html Lang=\"es\"&gt;\n\n&lt;head&gt;\n\n&lt;meta charset=\"UTF-8\"&gt;\n\n&lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"&gt;\n\n&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n\n&lt;script src=\"chronometer.js\"&gt;&lt;\/script&gt;\n\n&lt;title&gt;Prueba cron\u00f3metro&lt;\/title&gt;\n\n&lt;\/head&gt;\n\n&lt;body&gt;\n\n&lt;!-- espacio donde se va mostrar el cron\u00f3metro --&gt;\n\n&lt;div id=\"chronometer\"&gt;&lt;\/div&gt;\n\n&lt;script type=\"text\/javascript\"&gt;\n\nvar fecha = new Date();\n\nvar elem = document.getElementById(\"chronometer\") \/\/ referencia del DOM\n\nvar time = 20 \/\/ tiempo del cron\u00f3metro en segundos\n\nfecha.chronometer(elem, time, time_out);\n\n\/* funci\u00f3n callback *\/\n\nfunction time_out(){\n\nalert(\"Se termin\u00f3 el tiempo\");\n\n}\n\n&lt;\/script&gt;\n\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/pre>\n\n\n\n<p>En esta gu\u00eda se incluye un archivo denominado \u00abchronometro.js\u00bb, que contiene un c\u00f3digo eficiente para la implementaci\u00f3n del cron\u00f3metro. Adem\u00e1s, la aplicaci\u00f3n pr\u00e1ctica del prototipo creado, se presenta en otro archivo llamado \u00abindex.html\u00bb. <a href=\"https:\/\/multimediades.uned.ac.cr\/pem\/descargas\/Cronometro_JavaScript.zip\" data-type=\"link\" data-id=\"https:\/\/multimediades.uned.ac.cr\/pem\/descargas\/Cronometro_JavaScript.zip\">Ambos est\u00e1n disponibles para desc\u00e1rgalos<\/a>, para facilitar la integraci\u00f3n de este cron\u00f3metro funcional en cualquier proyecto.<\/p>\n\n\n\n<p>Para concluir, resulta esencial subrayar que el c\u00f3digo del cron\u00f3metro ha sido incorporado con \u00e9xito en las producciones llevadas a cabo en el seno del PEM, donde ha sido una herramienta valiosa, adaptable a diversas situaciones y aplicaciones dentro del entorno multimedia.<\/p>\n\n\n\n<p>Adicionalmente, es factible reconocer la presencia destacada de este c\u00f3digo en un proyecto multimedia concreto, titulado <a href=\"https:\/\/multimedia.uned.ac.cr\/index.php?action=detalle&amp;id=135\" data-type=\"link\" data-id=\"https:\/\/multimedia.uned.ac.cr\/index.php?action=detalle&amp;id=135\" target=\"_blank\" rel=\"noreferrer noopener\">Fundamentos de Criminolog\u00eda<\/a>. En este material did\u00e1ctico, el cron\u00f3metro desempe\u00f1a un papel central, proporcionando una soluci\u00f3n eficiente para la gesti\u00f3n y visualizaci\u00f3n precisa del tiempo, tanto en el crucigrama como en la sopa de letras, ambas actividades de la unidad 3.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Referencias:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"has-small-font-size\">Flanagan, D. (2006). <em>JavaScript: the definitive guide<\/em>. O&#8217;reilly.<\/p>\n\n\n\n<p class=\"has-small-font-size\">Date. (s\/f). <em>MDN Web Docs.<\/em> Recuperado el 6 de marzo de 2024, de https:\/\/developer.mozilla.org\/es\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Date<\/p>\n\n\n\n<p class=\"has-small-font-size\">Luna, F. (2019). <em>JavaScript-Aprende a programar en el lenguaje de la web<\/em>. RedUsers.<\/p>\n\n\n\n<p class=\"has-small-font-size\">Trabajando con objetos. (s\/f). <em>MDN Web Docs<\/em>. Recuperado el 6 de marzo de 2024, de https:\/\/developer.mozilla.org\/es\/docs\/Web\/JavaScript\/Guide\/Working_with_Objects<\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>En contextos l\u00fadicos o evaluativos, como los que se presentan en el trabajo diario del programa de Producci\u00f3n Electr\u00f3nica Multimedial (PEM), la gesti\u00f3n del tiempo es crucial para establecer l\u00edmites y crear experiencias de usuario m\u00e1s din\u00e1micas. La ausencia de un objeto cron\u00f3metro en JavaScript y la falta de un m\u00e9todo dedicado en el objeto [&hellip;]<\/p>\n","protected":false},"author":18,"featured_media":563,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6],"tags":[34,30,27,29,25,26],"ppma_author":[46],"class_list":["post-549","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","tag-desarrollo-web","tag-experiencias","tag-recomendaciones","tag-recursos","tag-textual","tag-tutoriales"],"authors":[{"term_id":46,"user_id":18,"is_guest":0,"slug":"yvazquez","display_name":"Yuri V\u00e1zquez P\u00e9rez","avatar_url":{"url":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/wp-content\/uploads\/sites\/8\/2025\/05\/yuri_s.png","url2x":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/wp-content\/uploads\/sites\/8\/2025\/05\/yuri_s.png"},"0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/posts\/549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/users\/18"}],"replies":[{"embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=549"}],"version-history":[{"count":14,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/posts\/549\/revisions"}],"predecessor-version":[{"id":566,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/posts\/549\/revisions\/566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=\/wp\/v2\/media\/563"}],"wp:attachment":[{"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=549"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/multimedia.uned.ac.cr\/pem\/wp\/sonar-multimedia\/index.php?rest_route=%2Fwp%2Fv2%2Fppma_author&post=549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}