Функция jQuery.css() не возвращает ожидаемые значения
Хорошо, я искал документы jQuery (кому-то, кому нужно было поддерживать), я искал SO, и я искал Google. Я не могу найти ответ на этот вопрос.
В словах
В прошлом я помню, как jQuery работал следующим образом:
$('#myObj').width()
возвращает вычисленную ширину #myObj
.
$('#myObj').css('width')
возвращает ширину, поскольку она вводится в таблицу стилей CSS.
Теперь любой пакет jQuery, который я использую, возвращает то же самое число независимо от того, какой метод я использую.
$('#myObj').width()
возвращает вычисленную ширину #myObj
как целое число (float?).
$('#myObj').css('width')
возвращает вычисленную ширину #myObj
как строку с px
в конце.
В псевдокоде
#myobject{
width: 14em;
height: 14em;
}
<div id="myobject">Has Text</div>
<script type="text/javascript">
$( '#myobject' ).click(function(){
alert($(this).css('width') + "\n" + $(this).width());
});
</script>
//Always alerts "224px [newline] 224"
//Expected to alert "14em [newline] 224"
Эти значения возврата на основе пикселя почти полностью бесполезны, так как мне нужно делать вычисления, основанные на том, что на самом деле в CSS. Например, я хочу сделать математику в позиции left
элемента, но я не могу, потому что он сохраняет возвращаемые значения пикселей, которые бесполезны в проекте em
.
Есть ли способ получить фактические значения из CSS в jQuery?
Является ли это ошибкой jQuery, или я что-то упускаю?
Здесь jsfiddle: http://jsfiddle.net/yAnFL/1/.
Решение
По-видимому, это намеченный результат.
Я решил использовать этот плагин, чтобы делать конверсии для меня.
Убрать контроль над CSS представляется плохой выбор в дизайне jQuery.
Ответы
Ответ 1
Это не полный ответ на ваш вопрос, но это может быть рабочее решение для каплирования значений em. Я применил эту функцию от здесь. И здесь - обновленная скрипка.
$.fn.emWidth = function(){
var wpx = this.width();
var temp = $('<div />').css({
width:'1em',
position: 'absolute'
});
this.append(temp);
var oneEm = temp.width();
temp.remove();
var value = wpx/oneEm;
return Math.round(value*100)/100;
};
Ответ 2
В руководстве jQuery указано:
Разница между .css(width) и .width() состоит в том, что последний возвращает единичное значение пикселя (например, 400), а первый возвращает значение с единицами нетронутыми (например, 400px).
Похоже, что поведение .css() было изменено в версии 1.3, или, по крайней мере, похоже на это из отслеживания ошибок.
Я тоже пытался найти хорошее (а не хакерское) решение, но пока еще не удалось.
Также на SO.
Ответ 3
Как уже отмечали некоторые другие, jQuery теперь использует перехватчики для перехвата некоторых свойств css. Вот общее решение, которое позволяет вам css и обходить эти крючки.
$.fn.hooklessCSS = function(name) {
var hooks = $.cssHooks;
$.cssHooks = {};
var ret = $(this).css(name);
$.cssHooks = hooks;
return ret;
}
Ответ 4
Это действительно проблема в новых версиях jQuery. Если это важная функция для вас, вы можете попробовать понизить до 1.4.2, где она все еще работает правильно.
Источник: Комментарии http://api.jquery.com/css/
Ответ 5
jQuery всегда * возвращает размеры, такие как ширина в единицах пикселей. Возможно, вы можете взять код из этого px в em инструмент преобразования, чтобы помочь вам получить значение, которое вы хотите.
Похоже, что 1.4.2 является самой последней версией, которая все равно вернет $(this).css('width')
в свою назначенную единицу измерения, но, похоже, только в том случае, если ширина назначена в атрибуте style тега элемента. Если это в отдельном объявлении CSS, таком как ваш пример, оно возвращается как пиксели.
$(this).width()
остается в пикселях.
(* в версиях 1.4.3 и более поздних)
Ответ 6
jQuery теперь использует функцию cssHooks
для определенных .css()
запросов, width
и height
в частности.
Таким образом, функция width()
и .css('width')
проходят через один и тот же код.
Ответ 7
если вы определяете стиль inline, вы можете использовать document.getElementById( "myObj" ). style.width для получения значения, как оно определено в встроенном стиле
http://jsfiddle.net/yAnFL/14/
Я не уверен, как захватить значение с внешнего листа.