2010-11-05 11 views
12

У меня есть таблица стилей, которая определяет ширину по умолчанию для изображений. Когда я читаю стиль ширины изображения с помощью jQuery width(), он возвращает правую ширину. Он также возвращает ту же ширину, когда я звоню css("width"). Но если в таблице стилей нет ширины, функция css("width") также вернет вычисленное значение width(), но не скажет undefined или auto или что-то в этом роде.jQuery/Javascript css ("width")/проверить, определен ли стиль в css?

Любые идеи, как я мог узнать, является ли стиль кодом CSS или нет?

Решение работает для меня кросс-браузера. Спасибо всем за помощь:

$(this).addClass("default_width_check"); 
var width = ($(this).width() == 12345) ? 'none-defined' : $(this).width(); 
var height = ($(this).height() == 12345) ? 'none-defined' : $(this).height(); 
$(this).removeClass("default_width_check"); 

.default_width_check { 
    width: 12345; 
} 
+0

интересный вопрос. Интересно, зачем вам это нужно? – Stefanvds

+1

Я думаю, что это поведение определено в спецификации HTML: Атрибут width элемента устанавливается на фактическую ширину элемента, если не указан. Tricky, интересно узнать, появляется ли какое-либо решение. –

+0

У меня есть CMS, которая имеет строгие определения для изображения и размера текста. Однако размер изображения определяется в css для каждого изображения в каждом специальном шаблоне, используемом CMS. Если администратор просматривает изображение, я хочу показать ширину и высоту, определенные в css, чтобы пользователь знал, как обрезать/масштабировать изображение. – i3rutus

ответ

11

У меня есть обходной путь идея, что мощи работы.

Определить класс с именем default_widthперед всеми другими таблицами стилей:

.default_width { width: 1787px } 
/* An arbitrary value unlikely to be an image's width, but not too large 
    in case the browser reserves memory for it */ 

, чтобы выяснить, имеет ли изображение набор ширина:

  • Clone его в JQuery: element = $("#img").clone()

  • дают клонированный элемент класс default_width: element.addClass("default_width")

  • Если его ширина составляет 1787px, то она не имеет ширины - или, конечно, имеет ширину 1787px, что является единственным случаем, когда этот метод не будет работать.

Я не совсем уверен, будет ли это работать, но это возможно. Редактирование: Как отмечает @bobince в комментариях, вам нужно будет вставить элемент в DOM для всех классов, которые будут применяться правильно, чтобы сделать правильный расчет ширины.

+0

, который отлично работает. – i3rutus

+1

Хм ... интересный взлом! Я думаю, вам придется изменить элемент на месте, однако, чтобы убедиться, что к нему применяются все те же правила. Все в порядке, вы можете «addClass», измерить и сразу «removeClass», не форсируя перерисовку. К сожалению, селектор классов имеет более высокую специфичность, чем селектор элементов, поэтому, если ширина была задана с помощью селектора элементов, это переопределит его и решит, что ширина не установлена. На самом деле я не вижу никакого способа обойти это, так как не существует декларации '! Unimportant' ... – bobince

+0

@ bobince Хорошая мысль о том, чтобы сделать это на месте! Более высокая специфичность - это недостаток, правда. Скорее всего, это не проблема в данном случае, потому что 'width' не будет установлен глобально для всех' img's, но все же. Я не вижу способа обойти это, однако, возиться с классом 'default_width' (например, сузить его, чтобы соответствовать конкретному атрибуту) будет только сделать его * больше * конкретным. –

0

Вы можете использовать image.style.width (изображение должно быть вашим элементом). Это возвращает пустую строку, если она не определена в CSS.

+0

Испытано только в FF3.6 и IE8. Но это должно сработать. –

+2

Я так не думаю: это вернет пустую строку, если свойство 'style' не было установлено, но не будет распознавать набор параметров в произвольном классе в таблице стилей. Я рад, что вы исправлены, но я в этом уверен. –

+0

Вы правы :) –

0

Вы можете проверить стиль style.cssText элемента, если определена ширина;

<img id="pic" style="width:20px;" src="http://sstatic.net/ads/img/careers-ad-header-so.png" /> 

var pic = document.getElementById('pic'); 
alert(pic.style.cssText); 

Но обратите внимание на следующие стили

border-width: 10px; 
width: 10px; 

вы должны только соответствовать ширине не пограничную ширину.

+2

Это не относится к свойствам, установленным в классах, правда? –

+0

Ты прямо там Пекка! он не будет работать с шириной, определенной на классах css, это будет работать только с встроенным css. – jerjer

7

Нет, метод getComputedStyle(), от которого зависит функция jQuery css(), не может различать ширину, вычисленную из auto, и явные ширины. Вы не можете сказать, было ли что-то задано в таблице стилей, только из прямой строки style="width: ..." (что отражено в свойстве .style.width элемента).

currentStyle работает по-разному и предоставит вам auto, однако это нестандартное расширение IE.

Если вы действительно хотели работать это, вы могли бы перебрать document.styleSheets, чтение каждого из своих заявлений, получение селектора, и запрашивая его, чтобы увидеть ли соответствует вашей целевой элемент, то видит, если он содержит width правила , Это, однако, было бы медленным и не совсем забавным, тем более, что стиль IESheet DOM отличается от других браузеров. (И это еще не справится с псевдо-элементами и псевдо-классами, как :hover.)

+0

+1 - С переписыванием jQuery 1.4.3 CSS это действительно должно было быть выставлено (обходит крючки), чтобы быть немного более удобным, поскольку весь код там. –

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