20 мая 2009 г.

Загрузка по требованию и jQuery

Несмотря на то, что необходимо минимизировать количество http-запросов, иногда (или часто, в зависимости от задачи) бывает полезно загружать часть «тяжелого» функционала только тогда, когда он действительно понадобится на странице.

У jQuery есть механизм, позволяющий осуществить это — $.getScript, однако, он обладает рядом недостатков:

  • не запоминаются уже загруженные или загружаемые в данный момент скрипты, при повторном запросе опять идет их загрузка.
  • нельзя указать сразу несколько скриптов
  • выключен кэш (к каждому урлу насильно приписываются параметры типа ?_=1242843920520). Зачем это было так жестко сделано, для меня осталось загадкой.
  • у коллбэка нельзя задать контекст (это вообще болезнь коллбэков jQuery, хотя, как недавно рассказал Азат, разработчиками уже делаются шаги в этом направлении).

Я написал небольшой плагин, лишенный вышеперечисленных недостатков:

$.requireScript(url, callback, [context], [options])

Cкачать и попробовать можно с code.google.

2 комментария:

Nagash комментирует...

Полезная штука, сам подобное как то писал.

Только без колбак ф-ии не работает почему то. Исправил, внеся в плагин изменение:
if(!callback) callback = function(){};

Andrew Gurylyov комментирует...

Дмитрий, у меня к вам вопрос. Среди последних комментариев на хабре к этой же статье написано, цитирую "Существует xLazyLoader, который собираются интегрировать в jQuery Core". По приведённой в этом комментарии ссылке находится roadmap jQuery версии 1.4. А на дворе нынче версия 1.7, в которой уже произошло множество изменений. Мне интересно, Дмитрий, у меня к вам вопрос. Среди последних комментариев на хабре к этой же статье написано, цитирую "Существует xLazyLoader, который собираются интегрировать в jQuery Core". По приведённой в этом комментарии ссылке находится roadmap jQuery версии 1.4. А на дворе нынче версия 1.7, в которой уже произошло множество изменений. Мне интересно, не внесли ли они этот xLazyLoader в Core?не внесли ли они этот xLazyLoader в Core?