“Неизвестное исключение” при отмене страницы разгружается с “location.href”

Только что запущенный проект в .net и найденной большой информации здесь (*dead связываются по состоянию на февраль 2014) об использовании Приобретения Windows Image. Много демонстрационного кода VB и некоторого c#.

5
задан Jason Berkan 5 November 2009 в 15:38
поделиться

1 ответ

Да, это известное поведение IE. Когда вы пытаетесь перейти из JavaScript (используя location, location.href, location.replace, document.location, history, даже обходные методы, такие как link.click или form.submit), beforeunload Cancel вызовет исключение. Тестовый пример очень прост:

window.onbeforeunload= function() { return '?'; }
location.href= 'http://www.example.com/';

Это может быть даже намеренно, чтобы дать сценарию знать, что попытка навигации не удалась, за исключением того, что имя ошибки совершенно бесполезно. (Я получаю «Неопределенную ошибку».)

Традиционное решение - просто поймать ее:

try {
    location.href= '...';
} catch(e) {}

Я всегда с подозрением отношусь к этому, хотя ловля всех исключений, как правило, плохая новость (но IE не 'не позволяю вам перехватывать только это исключение ... за исключением проверки точного stringTo, которое ужасно хрупко.

Другой подход состоит в том, чтобы переместить работу onbeforeunload в вызывающий код, чтобы настоящая onbeforeunload никогда не происходила и не было исключений:

function navigate(url) {
    if (window.onbeforeunload) {
        if (confirm(window.onbeforeunload()+' Press OK to continue, or Cancel to stay on the current page.')
            window.onbeforeunload= '';
        else
            return;
    }
    location.href= url;
}

Однако любое решение может оказаться за пределами вашего понимания, если, что кажется вероятным, это какая-то среда используют то, что вставляют код, а не то, что вы написали сами.

onclick="location.href='/<WhicheverPageYouRequested>.aspx'";

Что это за контроль? Честно говоря, это выглядит подозрительно: безусловно, то, что вы нажимаете, чтобы перейти на другую страницу, должно быть размечено как простая ссылка, а не как элемент JavaScript-onclick (во многих отношениях они идут не так). Если бы это была простая ссылка, не относящаяся к JavaScript, вам не пришлось бы беспокоиться об ошибке IE.

Между прочим, ваша функция beforeunload, вероятно, не сработает в браузерах, отличных от IE (returnValue - это только для IE). Это также кажется немного сложным ... что? неправильно с:

window.onbeforeunload= function() {
    if(checkIsDirty())
        return 'If you continue your changes will not be saved.';
}
9
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: