Pregunta

Yo tengo un <abbr> Etiqueta con clase "Timeago" en mi HTML. Cuando lo configure el valor en la carga de la página, luego llame jQuery("abbr.timeago").timeago(); En la función de documento listo, funciona.

Mi pregunta es, ¿qué pasa si cambio el título de ABBR.Timeago dinámicamente de alguna función JavaScript?

¿A qué función debo llamar? ¿Debo quitar jQuery("abbr.timeago").timeago(); ¿Desde la función de documento listo o dejarlo? gracias

Editar pregunta:

El ejemplo de @Squiddy funciona, actualiza el tiempo solo una vez y sigue siendo así sin cambios. Por ejemplo, si puso a Timeago a la hora actual ... ¿entonces solo es así, no cambia?

Actualización de Bounty:

Por favor, ignore la pregunta anterior. En mi sitio web se invoca un enlace en su función GetJson de clic que obtiene alguna información del servidor a una tabla.

Cada fila representa la retroalimentación del servidor. Aquí está mi código pseudo getJson:

            $.getJSON("feedback/" + feedbackId, function(data) {
            var column ... declared variable in which column selector
        .... some logic that populates table(irrelevant)
            //Store last checked time in title
        column.attr("title", iso8601(new Date()));
            //invoke timeago on this title
        column.html(jQuery.timeago(iso8601(new Date())));
            ....iso8601 is date format function
    });

Por lo tanto, este getJson se invoca para cada retroalimentación que recibo del servidor (n veces). Y cuando JSON completa, la columna apropiada en la tabla se llena con el último tiempo actualizado.

Pero parece que Timeago no está leyendo el valor de título cambiado, no reconoce DOM actualizado. Puse un console.log (elemento valor.

¿Qué debo hacer? También probé esta versión:

$.getJSON("feedback/" + feedbackId, function(data) {
                var column ... declared variable in which column selector
            .... some logic that populates table(irrelevant)
                //Store last checked time in title
            column.attr("title", iso8601(new Date()));
                //invoke timeago on this title

                $(column).livequery(function() {
                $(this).timeago(iso8601(new Date()));
                console.log($(this).attr("title"));
            });  
        });

He pasado unas horas intentando varias solución posible ... como una función llamada cada n segundos, para llamar a la función de Timeago pero siempre los mismos resultados

¿Fue útil?

Solución

Actualización 2: El mismo truco funciona aquí. El elemento column fue convertido previamente por Timeago una vez, cuando eso sucedió, Timeago colocó un campo de datos 'Timeago' en el elemento. Cuando este campo de datos está presente, Timeago no se molestará con él, por lo que debe borrarlo. El código se vería algo así:

$.getJSON("feedback/" + feedbackId, function(data) {
    var column 
    // ... declared variable in which column selector
    // ... some logic that populates table(irrelevant)
    // Store last checked time in title
    column.attr("title", iso8601(new Date()));
    // invoke timeago on this title
    column.data("timeago",null).timeago();
    // ... iso8601 is date format function
});

ACTUALIZAR: corregido, probado, el truco fue que el complemento de Timeago marca los elementos que ya se giraron, y no los dejen volver a girar, a menos que se borre la marca

Cuando cambia el valor en abbr.timeago, debe ejecutar la función timeago () solo en ese elemento nuevamente. Recomendaría alguna función para esto:

$.fn.changeTimeago = function(isotime) {
    return $(this).attr("title",isotime).data("timeago",null).timeago();
}

// usage:
$("abbr.timeago").changeTimeago("2004-07-17T09:24:17Z");

¡Espero que esto sea lo que necesitabas!

Otros consejos

A partir de V1.1.0, jQuery.timeago.js ahora proporciona un update acción que se puede usar:

De: https://github.com/rmm5t/jquery-timeago/pull/115

$(column).livequery(function() {
  $(this).timeago('update', iso8601(new Date()));
});

No agregue ningún código JavaScript o jQuery excepto esto;

$('.timeago').timeago();

y luego agregue 'Z' (o incluye t). Para más información, vaya a esto Enlace

<abbr class='timeago' title='2011-09-09 10:10:10Z'></abbr>

http://en.wikipedia.org/wiki/iso_8601#combined_date_and_time_representations

No pude hacer que funcione después de cambiar el valor en el atributo de título, pero Timeago admite una aproximación directa como esta:

jQuery.timeago(new Date());             //=> "less than a minute ago"
jQuery.timeago("2008-07-17");           //=> "2 years ago"
jQuery.timeago(jQuery("abbr#some_id")); //=> "2 years ago" [title="2008-07-20"]

Entonces, al cambiar un elemento, actualice el HTML usted mismo:

jQuery("abbr.timeago").html(jQuery.timeago("2010-07-17T09:24:17Z"));

Si desea actualizar el elemento Timeago con una nueva fecha. La forma más sencilla de hacer es la siguiente -

$('abbr.timeago').timeago('update',(new Date()).toISOString());

Funciona a las mil maravillas. No entiendo por qué no está documentado en ningún lado. Puede encontrar esta función mirando el código de Timeago JavaScript.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top