Ошибка с Safari 5.1 и функцией подтверждения Javascript () - PullRequest
3 голосов
/ 16 сентября 2011

ОБНОВЛЕНИЕ НИЖЕ

Мне кажется, я только что обнаружил действительно странную ошибку в Safari 5.1 на OS X Lion.Я не могу точно подтвердить, существовала ли эта ошибка в более ранних версиях Safari, но я в некотором роде подозреваю, что нет (учитывая тот факт, что часть моего сайта, которая ссылается на эту проблему, использовалась в pre-Lion Safari).Я не вижу ошибки в Chrome, Firefox 6, IE7 или IE9.Я также смог подтвердить, что ошибка не возникает в Safari 5.0.2 в Windows 7, что, вероятно, означает, что это ново для Safari 5.1.

Итак, вот ошибка: может показаться, что еслиФункция javascript Подтверждение () находится внутри другой функции, тогда что-либо внутри этой функции, вызываемое до Подтверждение (), не будет выполнено, пока не будет нажата кнопка «ОК» или «Отмена».Это, конечно, кажется мне огромной и действительно странной ошибкой.Вот мой пример кода:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">

function myexit () {
    console.log(0);

    if ( confirm('Are you sure?') ) {
        window.close();
    }
}
</script>
</head>
<body>
<a href="#" onclick="myexit();">close window</a>
</body>
</html>

Во всех других браузерах, о которых я упоминаю, 0 появляется в консоли одновременно с появлением окна подтверждения режима.В Safari значение 0 появляется только после , когда вы нажимаете «OK» или «Отмена».

Кроме того, если я добавлю функцию Подтверждение () в подфункцию, например:

function confirmwrapper() {

    if ( confirm('Are you sure?') ) {
        console.log(1);
    }
}

function myexit () {
    console.log(0);
    confirmwrapper();
}

... он все еще ломается.

Я что-то здесь упускаю?С уважением, ответы типа «просто используйте JQuery / Mootools / какую-то другую классную библиотеку JS», вероятно, не сильно мне помогут, потому что этот код является частью устаревшей системы, которую я сейчас не могу полностью разорвать, так же как и яхочу.

ОБНОВЛЕНИЕ: Я только что проверил простой запрос AJAX (Mootools Request (), для тех, кто ведет счет, хотя я не думаю, что это действительно имеет значение), и я смог подтвердить, что запрос не выполняется до закрытия диалогового окна подтверждения - либо «ОК», либо «Отмена».Это должно быть ошибка.Орехи.

Заранее спасибо

1 Ответ

1 голос
/ 17 сентября 2011

В данный момент я как бы разговариваю сам с собой, но у меня есть «решение» (и когда я говорю «решение», я действительно имею в виду «взлом, который работает»), учитывая, что я не могу использовать модальный диалог из библиотеки JS. Если я добавлю вызов verify () в другую функцию и вызову ее с помощью вызова setTimeout, это, по-видимому, даст Safari достаточно места для выполнения кода перед подтверждением (). Вот пример:

function doconfirm() {
    if ( confirm('Are you sure you want to logout?') ) {
        window.top.close();
    }
}

function logout () {
    doCourseSave();
    window.setTimeout('doconfirm();', 500);
}

Для ясности, "logout ()" - это функция, которая вызывается при действии пользователя (нажатие кнопки).

...