2009-06-11 8 views
3

Voici d'abord les informations d'arrière-plan. Site Web ASP.NET 2.0 avec AJAX Extensions 1.0.Safari et ASP.NET AJAX PageRequestManager.add_endRequest Fonction ne se déclenche toujours

J'ai un problème étrange qui ne se produit que dans Safari et je ne peux que supposer Chrome, car ils utilisent tous deux WebKit. J'utilise aussi jQuery dans le site, mais actuellement la référence à jQuery n'est chargée que sur une page, donc je ne pense pas que ce soit le problème.

J'ai un sympathique "Processing Request ..." message qui apparaît lorsque vous soumettez une publication asynchrone ou non-asynchrone page et cache après la publication. Dans le cas de la publication asynchrone, j'utilise la méthode add_endRequest(...) de PageRequestManager pour masquer le message "Demande de traitement ...". Cela fonctionne très bien dans FireFox, IE 6/7/8 et Opera mais pour une raison quelconque sur Safari (versions Windows et Mac), le add_endRequest(...) ne se déclenche pas toujours. Je suis tout au sujet du navigateur croisé alors je me demandais si quelqu'un a des idées sur la façon de résoudre ce problème.

Ceci est un bouchon de spectacle pour moi parce que non seulement le message "Demande de traitement ..." apparaît, mais je place également un div transparent sur le dessus de la page entière pour éviter plusieurs clics après la soumission, ainsi la page devient inutilisable sauf si vous savez comment pirater le CSS pour masquer la div transparente.

est ici l'extrait de code de balisage de ma page maître de ce que je fais pour gérer mon « Demande de traitement ... » message:

<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> 

Et si vous vous demandez ce que aspNetAjaxFix.js est, voir ce question que j'ai posté sur StackOverFlow, Internet Explorer's Operation Aborted and Latency Issue

J'ai également googlé ceci bien sûr avec pas beaucoup de chance. Cet article a semblé pertinent, http://forums.asp.net/t/1247957.aspx mais pose seulement la même question, aucune solution.

Tout aperçu de ce problème serait grandement apprécié.

Répondre

4

Bien après avoir creusé plus, j'ai découvert le problème. Cela n'a rien à voir avec la méthode add_endRequest(...) de PageRequestManager et tout ce qui concerne la détection du navigateur dans l'API côté client ASP.NET AJAX pour les navigateurs Safari et WebKit.

Merci à ce message de taliesins sur les forums ASP.NET, http://forums.asp.net/t/1252014.aspx. J'ai trouvé ce post par voir d'abord que je recevais cette erreur:

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(). 

même si je l'appelais Sys.Application.notifyScriptLoaded() dans mon JavaScript.

Afficher le bouchon résolu.

0

1-créer 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-changement ScriptManager

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