我正在使用jQuery中的以下选择器:
$("div[id^=WebPartWPQ]:has(table.ms-sitedirresultssort) td:contains(' : ')").closest('div')
换句话说:选择ID为WebPartWPQ
的div,其中包含一个类ms-sitedirresultssort
的表,其中td包含文本:
。在这个问题的最后是SharePoint呈现的HTML。
选择器在Firefox 3.5下完美运行,但不在Internet Explorer 8下。我正在使用hide()
函数进行测试。
我已将其缩小到选择器的td:contains(' : ')
部分。在Firebug Lite中运行$("td:contains(' : ')")
会转出一些完整的函数列表,例如无效的函数。所有其他选择器在FB Lite中都能正常工作。
我尝试过使用jQuery 1.3.2和jQuery 1.4rc1但没有成功。这是jQuery中的一个错误,如果有的话,它有一张票(我找不到)?关于如何最好地解决这个问题的任何想法?
HTML:
<div style="" helpmode="1" helplink="/_layouts/help.aspx" allowdelete="false" class="ms-WPBody"
width="100%" id="WebPartWPQ4" haspers="false" webpartid="2ae67b12-82db-4238-8be9-cd4b39cbd15a">
<table cellspacing="0" cellpadding="0" border="0" width="100%" xmlns:crwp="urn:schemas-microsoft-com:CategoryResultsWebPart"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:x="http://www.w3.org/2001/XMLSchema"
class="ms-sitedirresultssort">
<tbody>
<tr>
<td width="100%" />
<td nowrap="">
<a href="#title">Sort by Title </a><span>| </span><a href="#url">Sort by Url </a>
</td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0" border="0" width="100%" xmlns:crwp="urn:schemas-microsoft-com:CategoryResultsWebPart"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:x="http://www.w3.org/2001/XMLSchema"
class="ms-sitedirresultspaging">
<tbody>
<tr>
<td> : </td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0" border="0" width="100%" xmlns:crwp="urn:schemas-microsoft-com:CategoryResultsWebPart"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:x="http://www.w3.org/2001/XMLSchema"
class="ms-sitedirresultsbody" id="table2">
<tbody>
<tr>
<td valign="top">
<img alt="" src="/_layouts/images/lstbulet.gif" />
</td>
<td width="100%" class="ms-sitedirresultstitle">
<a href="http://site/cd10/_layouts/mysite.aspx?Redirect=1">Setup MySite</a>
</td>
</tr>
<tr>
<td />
<td width="100%" class="ms-sitedirresultsurl">
<a dir="ltr" href="http://site/cd10/_layouts/mysite.aspx?Redirect=1">http://site/cd10/_layouts/mysite.aspx?Redirect=1</a>
</td>
</tr>
</tbody>
</table>
</div>
答案 0 :(得分:4)
<td>
:
</td>
在任一浏览器中都不包含:
,因为尾随换行符与空格不同。但是:
<td> : </td>
现在确实在IE和Firefox中提供了不同的结果。 contains
在IE中不匹配,因为它的解析器默默地抛弃了空白,就像IE喜欢做的那样。如果你看一下你看到的innerHTML
:
<TD>: </TD>
不出所料地与选择器不匹配。
所以要小心contains
和空格,因为IE的HTML解析器和以前一样古怪。
我个人试图避免使用非标准的jQuery选择器,如:has
,特别是:contains
,因为它们需要jQuery做很多缓慢的工作。另一方面,标准的CSS2-3选择器可以在具有Selectors-API支持(包括IE8)的较新浏览器中传递给浏览器自己的选择器引擎。
如下:
$('.ms-sitedirresultssort ~ table td').filter(function() {
return this.text().match(/(^|\s):(\s|$)/);
})
~
是任意后续兄弟的CSS3选择器; IE8确实支持它。
答案 1 :(得分:1)
不确定是否是这种情况,但似乎问题可能与空白有关...例如,如果我尝试你提供的html&amp;尝试选择$("td:contains(' : ')")
(在Firefox中),我没有匹配,因为您尝试匹配的td
的内容实际上类似于:<td>\n....:\n.....</td>
({{1}对于空格&amp; .
表示新行)。换句话说,它不包含\n
,因为换行符(虽然可以选择' : '
)。所以它只是一个猜测,但也许IE8在创建它的DOM树时会对原始空白进行一些清理,这意味着你的' :'
选择器没有正确匹配。
所以假设其中' : '
还有td
个&amp;你只需要使用:
td
(用随机空格填充),就可以使用稍微不那么具体的选择器&amp;然后在功能上过滤掉它:
:
不太干净&amp;可能会慢一点,但可能是一个合适的工作。