Как определить наличие медиа-запросов с помощью Modernizr

Я пытаюсь определить, присутствуют ли медиа-запросы с помощью Modernizr 2, а затем загружаю в response.js, если это необходимо.

Я поместил это в свой файл script.js...

Modernizr.load({
  test: Modernizr.mq,
  yep : '',
  nope: 'mylibs/respond.js'
});

Что я делаю неправильно? Я действительно удивлен, что на сайте Modernizr нет примера того, как это сделать с помощью Media Queries. Вот версия Modernizr, которую я использую...

http://www.modernizr.com/download/#-backgroundsize-borderradius-boxshadow-iepp-respond-mq-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load


person SparrwHawk    schedule 18.09.2011    source источник
comment
Кстати, я загружаю Modernizr перед своим script.js на всякий случай, если кому-то интересно.   -  person SparrwHawk    schedule 18.09.2011
comment
Вам не нужен пустой yep.   -  person Félix Saparelli    schedule 28.09.2011


Ответы (2)


Это потому, что !!Modernizr.mq === true всегда... вы тестируете не то, что нужно!

Согласно документам:

Если браузер вообще не поддерживает медиа-запросы (например, oldIE), mq() всегда будет возвращать false.

Но это: Modernizr.mq() тоже false! Вы должны на самом деле проверить что-то. Здесь вам нужно ключевое слово all (или only all, как предлагает Пол):

Modernizr.load({
  test: Modernizr.mq('only all'),
  nope: 'polyfill.js'
});

Однако все пользовательские сборки Modernizr 2.0.x с mq включают respond.js. , поэтому вам никогда не нужно тестировать это, за исключением случаев, когда вместо этого вы хотите загрузить другой полифилл. В этом случае вам нужно будет отключить/удалить response.js из вашей сборки.

Модернизр 2.5.x

С появлением Modernizr 2.5.x вышеизложенное больше не соответствует действительности. В сокращенном журнале изменений указано следующее:

Мы больше не включаем Respond.js в сборщик, потому что это создавало конфликты сбоев в IE8. Если вам по-прежнему требуется Respond.js в вашем проекте, просто включите его вручную.

Это означает, что Modernizr.mq('only all') теперь может возвращать false...

person Félix Saparelli    schedule 28.09.2011
comment
Спасибо, Феликс, сегодня вечером попробую. - person SparrwHawk; 28.09.2011
comment
'only all' немного лучше. Я бы порекомендовал это. - person Paul Irish; 28.09.2011
comment
Гах, все еще не могу заставить это работать, ребята :-( ‹!-- Весь JavaScript внизу для быстрой загрузки страницы, за исключением Modernizr, который позволяет обнаруживать элементы и функции HTML5 --› ‹script type=text/javascript src= ‹?php bloginfo('template_url'); ?›/js/libs/modernizr-2.0.6.min.js› ‹/script› ‹script type=text/javascript› Modernizr.load({ test: Modernizr.mq( 'только все'), nope: 'js/polyfills/respond.js' }); ‹/script› - person SparrwHawk; 29.09.2011
comment
до сих пор не понимаю, как форматировать код в этом тесте кода комментариев? - person SparrwHawk; 29.09.2011
comment
Разве Modernizr не включает в себя response.js? То есть не нужно было его загружать? Для комментариев вы должны использовать `backticks`. - person Félix Saparelli; 30.09.2011
comment
Хм, а Modernizr «условно» загружает response.js или просто включает его? - person SparrwHawk; 30.09.2011
comment
Значение @SparrwHawk Modernizr.mq('only all') означает, что текущая страница поддерживает метод .mq() и соответствует 'only all'. Он не сообщает вам, поддерживает ли текущая страница медиазапросы изначально. Просто используйте сборку Modernizr, которая включает в себя response.js. - person ryanve; 12.01.2012
comment
@ryanve Все пользовательские сборки с mq включают response.js, за исключением случаев, когда вы явно отключили его. - person Félix Saparelli; 14.01.2012

Только что заметил, что этот вывод сделан в комментариях к ответу Феликса - я оставляю свой ответ здесь на случай, если он поможет другим посетителям, которые, как и я, не поняли его.

Не уверен, что это все еще проблема, но если вы загружаете Modernizr v2.0.6, вам не нужно запускать этот тест. Просто добавив его на свою страницу, вы должны автоматически запустить response.js, и ваши медиа-запросы должны начать работать.

Я тоже ломал голову над этим, так как в IE8 я продолжал получать «true»!! Плохо объяснено на сайте Modernizr, но упоминается в http://html5boilerplate.com/ (первый пример)

person Stuart Burrows    schedule 10.10.2011
comment
+1 Верно, я думал, что это было довольно ясно ... но опять же, это было после прочтения исходников Modernizr. Исходник читать хорошо. - person Félix Saparelli; 11.10.2011