Функция Safari и ASP.NET AJAX PageRequestManager.add_endRequest не всегда срабатывает - PullRequest
3 голосов
/ 11 июня 2009

Сначала информация о фоне. Веб-сайт ASP.NET 2.0 с расширениями AJAX 1.0.

У меня странная проблема, которая возникает только в Safari, и я могу предположить, что Chrome также работает, так как они оба используют WebKit. Я также использую jQuery на сайте, но в настоящее время ссылка на jQuery загружается только на одной странице, поэтому я не думаю, что это проблема.

У меня есть дружеское сообщение "Обработка запроса ...", которое появляется, когда вы отправляете страницу асинхронной или не асинхронной обратной передачи) и скрывается после обратной передачи. В случае асинхронной обратной передачи я использую метод PageRequestManager add_endRequest(...), чтобы скрыть сообщение «Обработка запроса ...». Это прекрасно работает в FireFox, IE 6/7/8 и Opera, но по некоторым причинам в Safari (версии для Windows и Mac) add_endRequest(...) не всегда срабатывает. Я все о кросс-браузере, так что просто интересно, есть ли у кого-нибудь идеи, как это исправить.

Для меня это ограничитель показа, потому что не только появляется сообщение «Обработка запроса ...», но я также поместил прозрачный элемент div поверх всей страницы, чтобы предотвратить несколько кликов после отправки, чтобы страница стала непригодной для использования. если вы не знаете, как взломать CSS, чтобы скрыть прозрачный div.

Вот фрагмент кода из разметки моей главной страницы о том, что я делаю для обработки моего сообщения «Обработка запроса ...»:

<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript" src="<%= ResolveClientUrl("~/Script/aspNetAjaxFix.js") %>"></script>
<script type="text/javascript" >
(function() {
    var processingID = "<%=processing.ClientID%>"
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    if (prm)
    {
        prm.add_endRequest(
        function (sender, args) {
            //alert('Fired!')
            if (top['showAsyncProcessingWindow'])
            {
                setTimeout(function(){document.getElementById(processingID).className="LockOff";document.getElementById('processMe').className='processMeLockOff';if(typeof(showIE6Selects)!="undefined"){showIE6Selects();}}, 1000);
                top['showAsyncProcessingWindow'] = false;
            }

            if(args.get_error() && args.get_error().name === 'Sys.WebForms.PageRequestManagerServerErrorException')
            {
                args.set_errorHandled(args._error.httpStatusCode == 0);
            }
        });
    }
})();
</script>

И если вам интересно, что такое aspNetAjaxFix.js, посмотрите этот вопрос, который я разместил на StackOverFlow, Операция Internet Explorer прервана и проблема с задержкой

Я тоже, конечно, гуглил без особой удачи. Эта статья, похоже, актуальна, http://forums.asp.net/t/1247957.aspx, но задает только тот же вопрос, но не решает.

Любое понимание этого вопроса будет с благодарностью.

Ответы [ 2 ]

4 голосов
/ 11 июня 2009

Ну, после еще нескольких копаний, я обнаружил проблему. Он не имеет ничего общего с методом PageRequestManager add_endRequest(...) и не имеет отношения к обнаружению браузера в клиентском API ASP.NET AJAX для браузеров на основе Safari и WebKit.

Благодаря этому сообщению от taliesins на форумах ASP.NET, http://forums.asp.net/t/1252014.aspx. Я нашел это сообщение, впервые увидев, что получаю эту ошибку:

Sys.ScriptLoadFailedException: The script 'http://localhost:2241/WebResource.axd?d=hvpXhV5kEMwLgAoaIglURevR_XTtDTBoKZ3aZWWaIvEkBXbLudri1AIv5bRs5f6licjCZMs3Z3MioQLqLTXV98582pKDHkD7BucGkKsPLz41&t=633444640020014740' failed to load. Check for:
Inaccessible path.
Script errors. (IE) Enable 'Display a notification about every script error' under advanced settings.
Missing call to Sys.Application.notifyScriptLoaded().

хотя я и звонил Sys.Application.notifyScriptLoaded() в моем JavaScript.

Показать стопор разрешен.

0 голосов
/ 19 сентября 2017

1-create WebKit.js

Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit
if (navigator.userAgent.indexOf('WebKit/') > -1) {
    Sys.Browser.agent = Sys.Browser.WebKit;
    Sys.Browser.version = parseFloat(navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]);
    Sys.Browser.name = 'WebKit';
}

2-ScriptManager с 2 изменениями

 <asp:ScriptManager ID="ScriptManager1" runat="server"         AsyncPostBackTimeout="600">
            <Scripts>
                <asp:ScriptReference Path="~/JScripts/webkit.js" />
            </Scripts>
        </asp:ScriptManager>
...