Safari приостанавливает всю анимацию при отправке/отправке формы

У меня есть анимация, которая срабатывает при нажатии ссылки. Это анимация jQuery, которая увеличивает div, затем исчезает. Чтобы обеспечить скорость, в то же самое время, когда нажимается ссылка, перенаправление запускается. Это должно произойти, и я не могу перенести перенаправление в функцию успеха jQuery animate(). Это перенаправление осуществляется посредством отправки формы. В Chrome, Firefox и IE он работает так, как ожидалось, анимация воспроизводится, и если страница загружается целиком до окончания анимации, она перенаправляется, но анимация проигрывает.

В Safari (в первую очередь тестирование на iPad), как только нажимается ссылка, страница, казалось бы, "зависает", и анимация не выполняется. Также есть GIF, которые находятся на экране при загрузке страницы, и, если я нажму ссылку, пока эти GIF будут на экране и анимируются, они также приостанавливаются. Я видел сообщение, в котором говорится, чтобы установить тайм-аут, применить стиль, а затем отправить, но проблема в том, что, хотя HTML будет применять этот стиль CSS, он все равно зависает на экране, и они не имеют дело с анимацией, просто статический стиль CSS.

Вот примерный код, показывающий способ выполнения этого (он не тестируется, просто пытается проиллюстрировать мою точку, поэтому могут отсутствовать ошибки или синтаксические ошибки):

var someData = 'foo'; //This value is irrelevant, just there for syntactical consistency.
$("#link").on("click", function() {
    var form = $("<form method='POST'></form>");
    form.attr("action", "http://someurl.com");
    var input = $("<input type='hidden'/>");
    input.val(someData);
    form.append(input);
    $(document.body).append(form);
    form.submit();
  
    //Form has been submitted, now run a short animation for the remaining life of the current page
    $(this).animate({width: "100px", height: "100px", opacity: "0"}, 150);
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div id="link" style="width: 100px; height: 100px; background-color: #FFF">Click Me</div>

Ответы

Ответ 1

Safari жалуется, что не может найти переменную someData, она пытается установить значение ввода в значение переменной, которая не существует, и перестает выполнять эту часть страницы JavaScript.

[Error] ReferenceError: Can't find variable: someData

Просто создайте переменную следующим образом:

// [snip]
var input = $("<input type='hidden'/>");
var someData;
input.val(someData);
// [snip]

и он будет работать в Safari.

Ответ 2

Вы можете использовать setTimeout для перехода к ссылке после анимации.

var someData = 'foo'; //This value is irrelevant, just there for syntactical consistency.

$("#link").on("click", function() {
    setTimeout(doThisAfterTimeExpires,2000);
    $(this).animate({width: "100px", height: "100px", opacity: "0"}, 150);
});

function doThisAfterTimeExpires(){

    var form = $("<form method='POST'></form>");
    form.attr("action", "http://someurl.com");
    var input = $("<input type='hidden'/>");
    input.val(someData);
    form.append(input);
    $(document.body).append(form);
    form.submit();

}