2016-05-16 3 views
7

В настоящее время я работаю над улучшением одного из наших сайтов. Оценка баллов по показам PageSpeed, в настоящий момент мы колеблются около 90, мы хотели бы прорваться в середину 90-х, если возможно ,Перемещение сценариев инструментария Ajax в нижней части страницы

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

Я использую следующий, чтобы объединить наши скрипты в один файл .js, чтобы свести к минимуму запросов:

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

Есть ли способ установить либо defer или async на CompositeScript тег, который получает выход? Или любой другой способ переместить это в нижнюю часть страницы?

Я попытался следующие:

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); 
} 

, а затем вручную включить ссылку на сценарий в нижней части страницы:

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

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

ReferenceError: Sys is not defined

WebForm_InitCallback is not defined

Что означает, что диспетчер скриптов сломан, есть ли способ достичь этого?

+0

Какую версию ACT вы используете? Вы пытались перейти на последнюю версию и использовать [Bundling] (https://github.com/DevExpress/AjaxControlToolkit/wiki/How-to-use-bundling-and-CDN)? –

+0

@MikhailTymchuk В настоящее время я использую связывание, но проблема заключается в том, что сгенерированный скрипт сложения появляется в верхней части страницы и помечен как блокировка визуализации – DGibbs

ответ

0

Im использованием Ajax управления инструментарий версии 15.1.4.0, где вы используете ScriptManager вместо ToolkitScriptManager но вы можете просто установить LoadScriptsBeforeUI="False" и визуализирует как раз перед </form>.

+0

, он перемещает большинство скриптов на нижнюю часть, но в моем случае это вызвало некоторые проблемы с другими встроенными скриптами, так что это может быть несовместимо, но вы можете попробовать его и посмотреть, работает ли оно в вашем случае – Peter

+0

Я боюсь, что я не использую 'ScriptManager', мой пример показывает, что я использую' < ajaxToolkit: ToolkitScriptManager /> ', и я уже установил' LoadScriptsBeforeUI' тоже. – DGibbs

+0

@DGibbs извините, не заметил 'LoadScriptsBeforeUI' в вашем коде. – Peter

Смежные вопросы