Проблема с перенаправлением Javascript в Google Chrome - PullRequest
2 голосов
/ 27 декабря 2011

Моя проблема чем-то похожа на этот ТАК вопрос. Однако, поскольку моя реализация немного отличается, я создал новый вопрос.

У меня есть страница, где кнопка «Назад» должна быть отключена (получил скрипт после долгих поисков). Эта страница выполняет перенаправление в другое место (действие контроллера ASP.NET MVC). Поскольку для завершения действия требуется время, отображается сообщение ожидания. Ниже приведен скрипт, который я использовал для отключения кнопки «Назад» и перенаправления страницы.

<script type="text/javascript">
    function changeHashOnLoad() {
        window.location.href += "#";
        setTimeout(changeHashAgain, 50);
    }

    function changeHashAgain() {
        window.location.href += "1";
    }

    var storedHash = window.location.hash;
    window.setInterval(function () {
        if (window.location.hash != storedHash) {
            window.location.hash = storedHash;
        }
    }, 50);

    //do after all images have finished loading
    $(window).load(function () {    
        changeHashOnLoad();        
        //show the wait message
        $("#domWaitMessage").show();
        //redirect to the new page/controller action
        window.location.href = document.forms[0].action;
    });
</script>

Мой код выше работает в IE и Firefox, но не в Chrome. Экран сильно мерцает в Opera, но перенаправление все еще работает. В Chrome вызывается действие в моем контроллере, и обработка происходит, но страница не перенаправляется после завершения обработки. Большинство из вас, ребята, могут почувствовать необходимость изменить поток / реализацию, но я не имею права голоса в этом вопросе, поэтому должен придерживаться этого потока.

Platform: ASP.NET MVC 2.0
jQuery Version: 1.4.1
Chrome Version: 16.0.912.63m

UPDATE:

Ниже приведены снимки экрана, сделанные на вкладке fiddler и chrome network.

Скрипач:
Скриншот Fiddler http://img43.imageshack.us/img43/638/200response.png

Chrome:
Снимок экрана Chrome http://img594.imageshack.us/img594/6381/chromenetwork.png

HTML

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Dummy Title</title>
</head>
<body>
    <form id="form1" method="post" action="Home/BookingConfirmation">    
        <div id="domWaitMessage">
            <img src="Content/images/preloader.gif" alt="Please Wait...." />
        </div>    
    </form>
</body>
</html>

ОБНОВЛЕНИЕ РАБОЧИЙ СЦЕНАРИЙ

<script type="text/javascript">
    function changeHashOnLoad() {
        window.location.href += "#";
        setTimeout(changeHashAgain, 50);
    }

    function changeHashAgain() {
        window.location.href += "1";
    }

    var storedHash = window.location.hash;
    window.setInterval(function () {
        if (window.location.hash != storedHash) {
            window.location.hash = storedHash;
        }
    }, 50);

    //do after all images have finished loading
    $(window).load(function () {    
        changeHashOnLoad();        
        //show the wait message
        $("#domWaitMessage").show();
        //ORIGINAL REDIRECTION CODE
        //window.location.href = document.forms[0].action;
        //NEW WORKING REDIRECTION CODE
        setTimeout(function () { window.location.href = document.forms[0].action; }, 100);
    });
</script>

Ответы [ 3 ]

5 голосов
/ 31 декабря 2011

На самом деле, вот что происходит:

  1. Функция changeHashOnLoad () устанавливает тайм-аут для сохранения второго хеша в истории («# 1»). Но функция не выполняется сейчас (будет через 50 мс)

  2. Основной код продолжает выполняться до строки, выполняющей перенаправление на document.forms [0] .action

  3. Только сейчас: выполняется функция timeHashAgain () с указанным временем. Страница перенаправляется на «# 1», а перенаправление на document.forms [0] .action отменяется

Простой и быстрый обходной путь: задержите основное перенаправление.

setTimeout(function () { window.location.href = document.forms[0].action; },100);

Так что вы можете сказать "Почему Chrome?" ? Chrome и его движок JavaScript V8 просто намного быстрее, чем другие браузеры. В 50 мс, chrome все еще начал перенаправление, в то время как FF и IE нет!

0 голосов
/ 31 декабря 2011

Это работает для меня в Chrome.Поскольку вы не предоставили полный код, трудно сказать, где находится ошибка, но, похоже, ее нет в приведенном выше коде.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <link rel="stylesheet" type="text/css" href="class.css" />
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript">
    function changeHashOnLoad() {
        window.location.href += "#";
        setTimeout(changeHashAgain, 50);
    }

    function changeHashAgain() {
        window.location.href += "1";
    }

    var storedHash = window.location.hash;
    window.setInterval(function () {
        if (window.location.hash != storedHash) {
            window.location.hash = storedHash;
        }
    }, 50);

    //do after all images have finished loading
    $(window).load(function () {    
        changeHashOnLoad();

        //show the wait message
        $("#domWaitMessage").show();
        //redirect to the new page/controller action
        window.location.href = document.forms[0].action;
    });
</script>
    </head>
    <body>
    <form method="post" action="gotothispage.page">
    <div style="display: none" id="domWaitMessage">HELLO</div>
    </form>
    </body>
</html>
0 голосов
/ 27 декабря 2011

Вместо использования getAttribute("action") попробуйте так:

window.location.href = document.forms[0].action;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...