deshacer preventDefault() o la mejor manera de deshabilitar mediante programación colecciones de enlaces

StackOverflow https://stackoverflow.com/questions/6339190

Pregunta

Tengo una página que tiene detectores de eventos para el estado de la red.Cuando la red está 'fuera de línea' quiero deshabilitar cualquier cruce de dominio de los enlaces de entrar en un modo sin conexión.Yo estaba tratando de usar .preventDefault(), sin embargo , cuando la aplicación vuelva a estar en línea necesito para volver a habilitar los enlaces.

Los Detectores De Eventos

//check network status
if(!navigator.onLine) { 
    offlineLinks(); //Offline mode function
}
//add event listeners for network status
window.addEventListener('offline', function(e) {
    offlineLinks(); //Offline mode function
}, false);
window.addEventListener('online', function(e) {
    //need to re-enable links/Online mode
}, false);
window.addEventListener('error', function(e) {
    alert('Error fetching manifest: there is a good chance we are offline.');
    offlineLinks(); //Offline mode function
});

La función de 'desvinculación'

function offlineLinks() {
    $('a[href^="http"]').click(function(e) {
        e.preventDefault();
        $('#offline-dialog').dialog({
            modal: true,
            buttons: {
                Ok: function() {
                    $(this).dialog('close');
                }
            }
        });
    });
}

Estoy en busca de una solución escalable que no causa lag si hay un número significativo de enlaces de la página.Hay una solución simple para revertir la .preventDefault() llame o una mejor forma de realizar esta tarea?

Posibles Soluciones


Mis primeros pensamientos fueron que almacenar una matriz de la href valores y, a continuación, quitar/agregar.He estado jugando con el almacenamiento, utilizando HTML5 webdb's podría crear una base de datos de manera dinámica y tire de la hrefs onclick...sin embargo no estoy seguro de si esta es la mejor solución para esto.

¿Fue útil?

Solución

Usted parece ser el uso de jQuery, al menos para el enlace de controlador de parte.

La cosa es darse cuenta de que $.haga clic en(controlador) es la abreviatura .bind('click', handler).Si se define que el controlador en otros lugares, también puede desenlazar más tarde, como este:

var handler = function(event) { 
  event.preventDefault();
  console.log("the links, they do nothing!");
}

// when you want the external links to be inactive.
// you could use .click(handler) here too, it's the same.
$('a[href^="http"]').bind('click', handler);

// when you want them back
$('a[href^="http"]').unbind('click', handler);

Por el camino, href^="http" es un poco frágil, si usted sólo quiere que esto suceda, los enlaces externos.Enlaces internos podría comenzar con "http", y algunos enlaces externos podría empezar con otros protocolos como "ftp".Mejor dar tales enlaces de su propia clase, como lo hace la Wikipedia con los "externos".

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