Asp.net IE8标准模式JQuery不合逻辑

Asp.net IE8标准模式JQuery不合逻辑,asp.net,jquery,dom,internet-explorer-8,Asp.net,Jquery,Dom,Internet Explorer 8,我有一个JQuery(使用jQuery1.4.2)问题,它只在IE8的标准模式下出现在一个特定的DOM元素上,而在其他几乎相同的DOM元素上没有。下面是一个最好的例子来说明为什么它毫无意义: $('span.error:visible')[0].style.display 上面的代码返回“none”,除非我患有某种脑动脉瘤,否则如果JQuery或IE8中没有bug,这是不可能的。这仅在标准模式下的IE8中发生,不在任何其他浏览器或IE8兼容模式下发生。它找到的范围实际上是一个ASP.net验证

我有一个JQuery(使用jQuery1.4.2)问题,它只在IE8的标准模式下出现在一个特定的DOM元素上,而在其他几乎相同的DOM元素上没有。下面是一个最好的例子来说明为什么它毫无意义:

$('span.error:visible')[0].style.display
上面的代码返回“none”,除非我患有某种脑动脉瘤,否则如果JQuery或IE8中没有bug,这是不可能的。这仅在标准模式下的IE8中发生,不在任何其他浏览器或IE8兼容模式下发生。它找到的范围实际上是一个ASP.net验证控件,因此我只能控制它向浏览器呈现的内容。当我使用IE8开发者工具栏检查DOM并从DOM复制HTML时,它给出了以下信息:

<SPAN style="DISPLAY: none; COLOR: red" 
id=ctl00_cphContentBody_mnMainMiddleNames_ebvMiddleName1 class=error
controltovalidate="ctl00_cphContentBody_mnMainMiddleNames_txtMiddleName0"
errormessage="JQuery should not find this" display="Dynamic" validationGroup="MiddleNames"
isvalid="true" validationexpression="[A-Za-z][A-Za-z '\-]*[A-Za-z]*">JQuery should not
find this</SPAN>
<span id="ctl00_cphContentBody_mnMainMiddleNames_ebvMiddleName1" class="error"
style="color:Red;display:none;">JQuery should not find this</span>
JQuery不应该
找到这个
如果我只是做一个查看源代码并复制粘贴它,我会得到以下结果:

<SPAN style="DISPLAY: none; COLOR: red" 
id=ctl00_cphContentBody_mnMainMiddleNames_ebvMiddleName1 class=error
controltovalidate="ctl00_cphContentBody_mnMainMiddleNames_txtMiddleName0"
errormessage="JQuery should not find this" display="Dynamic" validationGroup="MiddleNames"
isvalid="true" validationexpression="[A-Za-z][A-Za-z '\-]*[A-Za-z]*">JQuery should not
find this</SPAN>
<span id="ctl00_cphContentBody_mnMainMiddleNames_ebvMiddleName1" class="error"
style="color:Red;display:none;">JQuery should not find this</span>
JQuery不应找到此
如果我创建一个简单的HTML文件,其中只包含上述HTML图片中的任何一个,那么
$('span.error:visible')
找不到跨度,我无法发布代码来重现此问题。但是在实际的asp.net页面中,如果我运行
$('span.error:visible')[0].style.display
则返回“无”,如果我运行
$('span.error:visible').text()
则返回“JQuery不应” 找到这个”

tl;dr How can
$('span.error:visible')[0]。style.display
返回“无”

编辑以回答Nicks的评论

$('span.error:visible')[0]。offsetWidth
返回3
$('span.error:visible')[0]。远视返回22

这是令人费解的,我在Jquery网站上找到了以下内容

在jQuery 1.3.2中,元素是可见的 如果其浏览器报告了偏移网络宽度或 越界大于0

元素不可见,但根据上面的JQuery,它认为是可见的

这一变化意味着什么?这意味着 如果元素的CSS显示是 “无”,或其任何父/祖先 元素的显示为“无”,或者 元素的宽度为0,元素的 高度为0时,将创建一个元素 据报道是隐藏的


因此,上述观点是错误的。显示为“无”,但offsetWidth和offsetHeight不为零。

我想知道这是否与可见与隐藏有关:

可见性:隐藏隐藏元素,但仍会占用布局中的空间

显示:无从文档中完全删除元素。它不占用任何空间,即使源代码中仍然有它的HTML

(来自)

以下内容给了你什么

$('span.error:not(:hidden')[0].style.display


您还可以通过使用IE8开发工具(F12)更详细地查看CSS。

这似乎是一个浏览器错误,尽管jQuery是否应该处理它肯定是一个争论。实际上是相反的,它检查元素是否有一个
0
用于
offsetHeight
offsetWidth
(例如,隐藏被定义为“在页面中不使用空间”)


IE不应该允许
display:none
具有
offsetWidth
offsetWidth
,因此问题的根源就在那里。jquery应该为此添加处理吗?也许是这样,已经有一个bug文件,可能正是您的问题。

怎么办
$('span.error:visible')[0]。offsetWidth
$('span.error:visible')[0]。OfftheSight
提供给您?这种情况每次都会发生?还是间歇性的?如前所述,跨度是由asp.net验证控件生成的。您可以将此“动态”和“静态”设置为显示模式。动态设置显示:无,控件不会占用“静态”页面上的空间设置可见性:隐藏,并占用空间。此控件处于动态模式,当我在IE dev toolbar display=none中检查CSS时,可见性未设置。