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; } 
Has Text
$( '#myobject' ).click(function(){ alert($(this).css('width') + "\n" + $(this).width()); }); //Always alerts "224px [newline] 224" //Expected to alert "14em [newline] 224"

这些基于像素的返回值几乎完全无用,因为我需要根据CSS中的实际内容进行计算。 例如,我想对元素的left位置进行数学运算,但我不能,因为它会保留返回的像素值,这在基于em的设计中毫无价值。

有没有办法从jQuery中的CSS中获取实际值?
这是一个jQuery错误,还是我错过了什么?

这是一个jsfiddle: http : //jsfiddle.net/yAnFL/1/ 。


解析度

显然,这是预期的结果。
我决定使用这个插件为我做转换。
在jQuery设计中,取消对CSS的控制似乎是一个糟糕的选择。

这不是您的问题的完整答案,但它可能是一个解决em值的工作解决方案。 我从这里改编了这个function。 这是更新的小提琴。

 $.fn.emWidth = function(){ var wpx = this.width(); var temp = $('
').css({ width:'1em', position: 'absolute' }); this.append(temp); var oneEm = temp.width(); temp.remove(); var value = wpx/oneEm; return Math.round(value*100)/100; };

在jQuery手册中说明:

.css(width)和.width()之间的区别在于后者返回无单位像素值(例如,400),而前者返回单位完整的值(例如,400px)。

似乎.css()的行为在版本1.3中已更改,或者至少它似乎来自错误跟踪器 。

我也试图找到一个好的(不是hacky)解决方案,但我还没有。

也在SO上 。

正如其他人所说,jQuery现在使用钩子来拦截某些css属性的评估。 这是一个通用的解决方案,可以让你获得css并绕过这些钩子。

 $.fn.hooklessCSS = function(name) { var hooks = $.cssHooks; $.cssHooks = {}; var ret = $(this).css(name); $.cssHooks = hooks; return ret; } 

这在新版本的jQuery中确实存在问题。 如果这对您来说是一项重要function,您可以尝试降级到1.4.2,它仍在正常工作。

资料来源: http ://api.jquery.com/css/上的评论

jQuery现在对某些.css()请求,特别是widthheight使用cssHooksfunction。

因此, width()函数和.css('width')有时会运行相同的代码。

如果您定义内联样式,那么您可以使用document.getElementById(“myObj”)。style.width来检索内联样式中定义的值

http://jsfiddle.net/yAnFL/14/

我不知道如何从外部工作表中获取值。

jQuery总是*以像素为单位返回宽度,例如宽度。 也许您可以借用此pxem转换工具中的代码来帮助您获得所需的值。

看起来1.4.2是最新版本,它仍将以指定的度量单位返回$(this).css('width')但看起来只有在元素标记的style属性中指定了宽度 。 如果它在一个单独的CSS声明中,就像你的例子一样,它仍然以像素为单位返回。

$(this).width()仍为像素。

(*版本1.4.3及更高版本)