【问题标题】:Getting unexpected results when refining DOM selection优化 DOM 选择时得到意想不到的结果
【发布时间】:2013-06-02 00:08:43
【问题描述】:

我有一个非常奇怪的行为,当我尝试获取某些 div 元素的文本时,我在链接多个 jQuery 函数时得到了所有以前的“匹配项”。

这是我的代码:

var rows = $("tr");
    var groups = [];
    for (var i = 0;i<rows.length;i++){
        if(rows.eq(i).html().toString().match(/TV/i)){
            groups += rows.eq(i).find(":first-child div").text();
        }
    }
    console.log(groups);

现在我期望的输出只是匹配表行的第一个子项中包含的 div 中包含的文本。 我确实在控制台中得到了这个结果,但在此之前我得到了所有tr的文本,所有匹配的tr.eq(i)),所有td(:first-childtd),所有divs 然后在输出的最后一位我得到包含在第一个 div 中的文本。

所以groups 持有所有东西,就像我会做这样的事情:

groups += rows.eq(i)
groups += rows.eq(i).find(":first-child")
groups += rows.eq(i).find("div")
groups += rows.eq(i).find("div").text();

我对 jQuery 还很陌生,只使用了标准的 JavaScript 选择器,其中 getElementById("myID").getElementsByTagName("div")[0].innerHTML 只会给我 myID 中第一个 divinnerHTML,没有别的。

为什么会发生这种情况,我怎样才能得到我真正想要的东西?

【问题讨论】:

  • 第一:有没有可能解决你的问题?第二:如果groups是一个数组,它应该是groups.push(value)而不是groups += value
  • 它在 node.js 中运行,如标签中所述,因此很遗憾不可能使用小提琴。 .push 确实如此。我之前没有将它声明为数组并留下了+=。虽然我仍然得到同样奇怪的结果。
  • 不可能有node.js的HTML输出,就像浏览器中的源代码一样? (我还没用过node.js)
  • HTML 输出到底是什么意思?我现在确实用 console.log() 得到了我的输出。不过,发布该输出会相当痛苦,它有几千行。
  • 我编辑了这个问题。也许现在我的问题更清楚了。

标签: jquery node.js jsdom


【解决方案1】:

在浏览了您的代码之后,我想我终于找到了您的问题。这很难说,因为我们看不到 DOM 输出。

无论如何,使用.find(':first-child div') 将获得 tr 中的每个第一个孩子。

例子:

td
-tr <-- Is :first-child (of td)
--div <-- is also :first-child and :first-child div (will get the text of this div)
---div <-- is also :first-child and :first-child div (will get the text of this div)
-tr
--div Is :first-child (of tr)
---div <-- is also :first-child and :first-child div (will get the text of this div)

尝试改用这个:

groups.push(rows.eq(i).children(":first-child").find('div').text());

希望它有所帮助(实际上是您的问题)!

【讨论】:

  • 可悲的是仍然是同样奇怪的问题:/但对你来说是一个赞成票,无论哪种方式都有帮助。发布任何输出都很难,因为它真的很长并且包含个人信息,我犹豫发布。我现在通过在每次循环运行时删除数组的前 2 个条目来解决我的问题。这些首先包含站点上 td 中所有 div 的文本,然后是一个大字符串格式的结果,然后是我想要的仅匹配元素文本的过滤结果。
  • 你的问题真的很奇怪啊啊啊,只要能解决就OK了!但是你的代码正在“工作”,所以它可能是一个 DOM 问题......
【解决方案2】:

jQuery 可以为你循环...

$.each($("tr"), function($index, jsObj)
{
    $jQueryObj = $(jsObj);
    /* ... */
});

.each 的替代用法:

$("tr").each(function($index, jsObj)
{
    /* etc */
});

我也相信有像.has(":content('TV')") 这样的功能,但我目前还不能 100% 确定。

【讨论】:

  • 澄清一下,$.each(arg,func()) 适用于您没有 jQuery 数组对象的情况。做$.each($("tr")...) 两次$ (这很糟糕)。另外(只是指出),jsObj 可以通过this 访问,但是这样我们的方式是一样的,只是个人喜好。
  • 我不知道为什么,但是在 .each 函数中使用 this 时遇到了 ajax json 数据的一些问题,而上述方法在所有情况下都可以正常工作。为了避免混合使用两种方法(可读性等),我决定简单地继续使用...(index, obj),因为它根本不会给我带来这些问题。 (使用 jQuery 1.9.1 遇到过,不知道是不是 bug)
  • 有 .content() 函数,但它区分大小写,我需要不区分大小写的匹配。另外我不太确定这对我的问题有什么帮助,这不只是 for 循环的替代方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2023-04-08
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多