отменить функцию preventDefault() или лучший способ программно отключить коллекции ссылок

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

Вопрос

У меня есть страница, на которой есть прослушиватели событий для состояния сети.Когда сеть "отключена", я хочу отключить все междоменные ссылки, чтобы перейти в автономный режим.Я пытался использовать .preventDefault(), однако, когда приложение снова подключится к Сети, мне нужно снова включить ссылки.

Прослушиватели событий

//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
});

Функция для "отмены привязки"

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

Я ищу масштабируемое решение, которое не вызовет задержек при наличии значительного количества ссылок на странице.Есть ли простое решение, позволяющее обратить вспять .preventDefault() позвонить или как лучше выполнить эту задачу?

Возможные решения


Мои первоначальные мысли были о том, чтобы либо сохранить массив значений href, а затем удалить / добавить.Я поиграл с хранилищем HTML5, используя webdbя мог бы создать базу данных и динамически извлекать hrefs onclick ... однако я не уверен, что это лучшее решение для этого.

Это было полезно?

Решение

Похоже, вы используете jQuery, по крайней мере, в части обработки ссылок.

Важно понимать, что $.click(обработчик) - это просто сокращение от .bind('click', обработчик).Если вы определяете обработчик в другом месте, вы также можете отменить его позже, вот так:

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);

Кстати, href ^="http" немного хрупок, если вы хотите, чтобы это происходило только с внешними ссылками.Внутренние ссылки могут начинаться с "http", а некоторые внешние ссылки могут начинаться с других протоколов, таких как "ftp".Лучше присвоить таким ссылкам их собственный класс, как это делает Википедия с "external" .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top