问题:在IE8中包含选择器

时间:2010-01-13 23:45:57

标签: jquery internet-explorer-8

我正在使用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>

2 个答案:

答案 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;可能会慢一点,但可能是一个合适的工作。