2009-03-02 5 views

ответ

1

Невозможно обнаружить это с помощью Javascript, поскольку это чистый атрибут CSS, который не связан ни с каким объектом или функцией в Javascript. Лучшее, что я могу вам сказать, это проверить here на довольно хороший список совместимости и использовать CSS для создания обходного пути.

+0

@Alan H .: Привет! Я не знаю вас, но я ценю вашу конструктивную критику в ответ! Я также с нетерпением жду вашего ответа на этот вопрос, в котором вы покажете нам, как это сделать. Ты собираешься показать нам путь, верно? :) –

+1

http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting На самом деле Кристофер Свейзи предлагает способ обнаружить его с помощью JS в своем ответе ниже. И по крайней мере Алан Х написал, что, по его мнению, проблема в вашем ответе. Я получаю сводные ответы на старые ответы без этой роскоши. – Boldewyn

+0

@Boldewyn: Я бы подумал, что статья, на которую вы ссылаетесь, и ответ Кристофера Свейзи ниже, оба являются обходными способами (* хорошие * обходные пути, но обходные пути, тем не менее). Я по-прежнему считаю, что нет «чистого» способа обнаружения поддержки браузера для конкретной функции CSS. Кроме того, я бы вряд ли назвал комментарий Алана роскошью. :) –

7

Согласно QuirksMode charts, только основные браузеры не поддерживающие inline-block являются IE6 и 7. (Ну, они поддерживают его, но только для элементов, которые имеют нативную display тип inline.) Я только предполагаю, что это поддерживается а затем примените обходной путь для IE6/7 через conditional comments.

. (Примечание: я игнорирую отсутствие Firefox 2 по поддержке inline-block и предполагая, что подавляющее большинство пользователей повышен до FF3, но недолгой прибегая к помощи не раскопать все номера, чтобы поддержать это YMMV.)

Если вы определяете поддержку JavaScript, это ваш единственный вариант, однако вам придется отказаться от нюхания агента пользователя. Класс YAHOO.env.ua от YUI library - это удобный фрагмент кода, который вы можете копировать и использовать. (Это лицензия BSD, не зависит от других частей библиотеки YUI и составляет только около 25-30 строк без комментариев)

+0

Просто проверял статистику на моем веб-сайте, и они, похоже, поддерживают ваше предположение, что большинство пользователей FF обновлены до FF 3. И ИМО - это хорошая идея для будущего дизайна. –

12

Ну, вот что вы можете сделать, если хотите сделать это, просто изучив бавхи браузера w/javascript, а не нюхание агента пользователя:

Настройте тестовый сценарий и сценарий управления. С, скажем, в следующем составе:

  • сНу
    • ДИВ ж/контент "тест"
    • ДИВ ж/содержимого "test2"

Вставьте один экземпляр в документ с двумя внутренними разделителями, установленными в встроенный блок, и вставьте другую копию в документ с двумя внутренними разделителями, установленными для блокировки. Если браузер поддерживает встроенный блок, то содержащиеся divs будут иметь разную высоту.

Альтернативный ответ:

Вы также можете использовать getComputedStyle, чтобы увидеть, как браузер обрабатывает CSS заданного элемента. Итак, теоретически вы можете добавить элемент с «display: inline-block», а затем проверить вычисленныйStyle, чтобы узнать, выжил ли он. Только проблема: IE не поддерживает getComputedStyle. Вместо этого он имеет currentStyle. Я не знаю, работает ли currentStyle одинаково (по-видимому, он работает аналогично поведению, которое мы хотим: игнорируя «недопустимые» значения).

+1

Я просто проверил это (через [@Alan H's] (http://stackoverflow.com/a/5049711/2688) [jsFiddle] (http://jsfiddle.net/JvTBZ/)), а 'currentStyle' показывает' inline -block' для элементов, где он не поддерживается (т.е. 'div' в IE 6 и 7) – bdukes

+0

Ваш другой тест действительно работает (по крайней мере, в чистой комнате jsFiddle): http://jsfiddle.net/bdukes/cHUps/5/ – bdukes

3

К слову: существует a neat way для реализации кросс-браузерных встроенных блоков в IE6 +, FF2 +, Opera и WebKit с использованием CSS. (Недействительный CSS, но все еще только CSS.)

2

Christopher Swasey - это совершенно правильно.

Я создал демонстрационную версию jsFiddle его техники на http://ajh.us/test-inline-block.

Код по существу:

var div = document.createElement('div'); 
div.style.cssText = 'display:inline-block'; 

// need to do this or else document.defaultView doesn't know about it 
$('body').append(div); 
// that was jQuery. It’s possible to do without, naturally 

var results = false; 

if (div.currentStyle) { 
    results = (div.currentStyle['display'] === 'inline-block'); 
} else if (window.getComputedStyle) { 
    results = document.defaultView.getComputedStyle(div,null).getPropertyValue('display')=== 'inline-block'; 
} 

//clean up 
$(div).remove(); 

alert('display: inline-block support: '+results); 

Пожалуйста, обратите внимание, это точно такой же метод работает также для обнаружения поддержки display: run-in.

+0

Используя эту технику, мои машины IE 6 и 7 говорят, что они поддерживают 'inline-block' на' div', когда на самом деле оба они отображают его как элемент 'block'. – bdukes