2016-05-16 24 views
7

Attualmente sto lavorando per migliorare uno dei nostri siti, il punteggio relativo alle statistiche di PageSpeed, al momento siamo intorno al 90, vorremmo entrare nella metà degli anni '90, se possibile .Spostamento degli script del toolkit Ajax nella parte inferiore della pagina

Uno dei punti critici che abbiamo è che l'Ajax script manager toolkit sta generando lo script nella parte superiore della pagina, google bandiere questo come un problema "dovrebbe risolvere" e si lamenta che lo script è rendere il blocco e dovrebbe essere spostato nella parte inferiore della pagina o caricato in modo asincrono o tramite l'attributo defer.

sto usando la seguente per combinare i nostri script in un unico file di .js per ridurre al minimo le richieste:

<ajaxToolkit:ToolkitScriptManager ID="manScript" LoadScriptsBeforeUI="false" runat="server" EnableViewState="false" ScriptMode="Release"> 

    <CompositeScript ScriptMode="Release" Path="/CMSGlobalFiles/Js/combinedajax.min.js"> 
     <Scripts> 
      <asp:ScriptReference Name="WebForms.js" Path="/CMSGlobalFiles/Js/aspnet/WebForms.js" Assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
      <asp:ScriptReference Name="MicrosoftAjax.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjax.js" /> 
      <asp:ScriptReference Name="MicrosoftAjaxWebForms.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjaxWebForms.js" /> 
     </Scripts> 
    </CompositeScript> 

</ajaxToolkit:ToolkitScriptManager> 

C'è un modo per impostare sia defer o async sul tag CompositeScript che ottiene in uscita? O qualsiasi altro modo di spostarlo in fondo alla pagina?

ho provato la seguente:

protected override void Render(HtmlTextWriter writer) 
{ 
    StringWriter output = new StringWriter(); 
    base.Render(new HtmlTextWriter(output)); 

    string outputAsString = output.ToString(); 

    if(outputAsString.Contains("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>")) 
    { 
     outputAsString = outputAsString.Replace("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>", string.Empty); 
    } 

    writer.Write(outputAsString); 
} 

E poi compreso manualmente un riferimento allo script in fondo alla pagina:

<script type="text/javascript"> 
    function downloadJSAtOnload() { 
     createScript("/CMSGlobalFiles/Js/combinedajax.min.js?v=1"); 
     createScript("//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"); 
     createScript("/cmsglobalfiles/js/vendor/modernizr.js"); 
     createScript("/cmsglobalfiles/js/main.min.js"); 
     createScript("/cmsglobalfiles/js/vendor/wow.min.js"); 
    } 

    function createScript(path) { 
     var element = document.createElement("script"); 
     element.src = path; 
     document.body.appendChild(element); 
    } 

    if (window.addEventListener) 
     window.addEventListener("load", downloadJSAtOnload, false); 
    else if (window.attachEvent) 
     window.attachEvent("onload", downloadJSAtOnload); 
    else window.onload = downloadJSAtOnload; 
</script> 

Questo rimuove lo script composito generato e genera un nuovo prima del tag di chiusura del corpo, questo porta il punteggio fino a 95 ma penso che questo sia caricato troppo tardi in quanto stiamo ricevendo un sacco di errori della console:

ReferenceError: Sys is not defined

WebForm_InitCallback is not defined

Che indica che il gestore di script è danneggiato, esiste un modo per ottenere questo risultato?

+0

Quale versione di ACT usi? Hai provato ad aggiornare a quello più recente e utilizzare [Bundling] (https://github.com/DevExpress/AjaxControlToolkit/wiki/How-to-use-bundling-and-CDN)? –

+0

@MikhailTymchuk Attualmente sto usando il bundling come puoi vedere, ma il problema è che lo script del bundle generato appare nella parte superiore della pagina ed è contrassegnato come blocco del rendering – DGibbs

risposta

0

Im utilizzando il controllo Ajax Toolkit versione 15.1.4.0, in cui si utilizza ScriptManager invece di ToolkitScriptManager ma ci si può solo impostare LoadScriptsBeforeUI="False" e rende poco prima </form>.

+0

sposta la maggior parte degli script verso il basso ma nel mio caso ha causato alcuni problemi con altri script inline quindi questo potrebbe non essere infallibile, ma puoi almeno provarlo e vedere se funziona nel tuo caso – Peter

+0

Temo di non usare 'ScriptManager', il mio esempio mostra che sto usando' < ajaxToolkit: ToolkitScriptManager /> 'e ho già impostato' LoadScriptsBeforeUI'. – DGibbs

+0

@DGibbs mi dispiace non aver notato 'LoadScriptsBeforeUI' nel codice. – Peter