【问题标题】:Creating Javascript object from JQuery object从 JQuery 对象创建 Javascript 对象
【发布时间】:2009-11-25 01:43:20
【问题描述】:

目前我正在对以下代码进行单元测试:

if ($(selectedElement).innerText == 'blah')
{
    // do something
}

其中 selectedElement 是从 UI 中选择的锚对象。

在我的测试代码中,我创建了一个 DOM 结构,该结构的锚点位于适当的位置以供选择。这里的问题是,由于 selectedElement 本来是一个 javascript 对象,所以我需要将我从 DOM 结构(它是一个 JQuery 对象)中得到的锚转换为上述条件。

我尝试了以下方法,但没有成功:

// DOM structure using HtmlDoc
/*:DOC += <span id='testSpan' class='testSpanClass'><a href='#' id='selectedElem'>blah</a></span> */
selectedElement = $('#selectedElem')[0];

我的目标是能够使用普通的 Javascript 对象来满足条件,并且还能够将其切换回 jQuery 对象来满足函数后面的条件。但如果有更好的方法,我会试一试。

有人对如何解决这个问题有任何想法吗?

编辑:是否有不需要更改代码的解决方案? selectedElement 实际上是一个全局变量。

谢谢。

【问题讨论】:

  • +1 用于对代码进行单元测试 :)
  • $(selectedElement).innerText 是无效代码.. $(selectedElement) 是一个包装的对象集/数组.. innerText 不是那个属性.. 使用 $(selectedElement).text( )

标签: javascript jquery unit-testing


【解决方案1】:

我不确定您在测试什么浏览器,但innerText 是一个仅限 IE 的属性。由于您已经在使用 jQuery,我建议您只需在所选元素上调用 .text() 方法,如下所示:

selectedElement = $('#selectedElem')[0]; // Get DOM element

if ($(selectedElement).text() == 'blah')
{
    // do something
}

你获取 DOM 对象的方法很好: $('#selectedElem')[0] 或 $('#selectedElem').get(0) 是等价的,但第一个在大循环中更快.

【讨论】:

  • 不幸的是它没有用。另外,我会避免更改代码,因为 selectedElement 是一个也在其他地方使用的全局变量(如问题中所更新)。
  • 什么不起作用? (我更新了我的代码以反映不更改全局变量)。如果你有一个有效的 DOM 元素,$(el).text() 将返回 innerText 可以这么说。
  • 如果我不允许更改“innerText”怎么办?
  • innerText 是仅限 Internet Explorer 的属性。它只适用于 IE,其他浏览器有不同的属性。我认为 Firefox 有textContent。你的意思是不能改变值还是不能改变属性的用途?
  • 我必须使用表达式 $(selectedElement).innerText。这是我不允许修改的源代码。
【解决方案2】:

jQuery 的 get 方法返回该 jQuery 对象的原始 DOM 元素。 我想也许你需要使用$('#selectedElem').get(0)

【讨论】:

    【解决方案3】:

    你可以使用 jquery 的 .html() 吗?

    if ($(selectedElement).html() == 'blah')
    {
        // do something
    }
    

    否则,无需更改代码:

    var selectedElement = $('#selectedElem')[0];
    
    if (selectedElement.innerHTML == 'blah')
    {
        // do something
    }
    

    【讨论】:

    • .html() 不等同于.innerText.text() 会是他们想要的。
    • 经过快速测试以确保它似乎可以正常工作。但我的理解是 .html() 适用于 html 标签之间的任何内容。
    • 如果我可以更改代码,是的,这很完美。如果我无法更改代码怎么办?无论如何要编写测试以实际进入条件?
    • 嘿尼克,你是对的,在这种情况下它们是一样的。但如果有任何子元素,结果就会不同。
    • @BeraCim 试试我的编辑。 @dcneiner 是的,它会返回锚标签之间的所有内容。我只是习惯于使用innerHTML(就像在我的编辑中一样)处理这个而不是未定义的innerText,所以我想到了.html()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多