我想得到一个DOM节点的文本内容,但没有被有效隐藏的元素(样式为display:none
)。
我知道DOM textContent
属性和jQuery的text()
方法(我认为它使用了textContent
),但它不尊重display:none
:
var div = $("<div><span style='display:none'>not </span>good</div>");
var text = div.text(); // "not good"
var textContent = div[0].textContent; // "not good"
如何从该div中获取"good"
内容?
我需要测试我的AngularJS指令。我正在使用Jasmine编写测试,我的测试与此类似:
it('should check text ignoring hidden content', function() {
$rootScope.hidden = true;
var template = '<div><span ng-hide="hidden">not </span>good<div>';
var element = $compile(template)($rootScope);
$rootScope.$digest();
console.debug(element.html()); // prints: '<span class="ng-hide" ng-hide="hidden">not </span>good<div></div>'
console.debug(element.text()); // prints: 'not good'
expect(element.text()).toEqual('good'); // oops, that fails :(
});
在我的真实的测试中,我想测试我的自定义指令而不是ng-hide
,但实际的指令与这个问题无关。
我对Jasmine和JavaScript单元测试完全陌生,所以如果这不是正确的方法,请告诉我。
7条答案
按热度按时间kiayqfof1#
需要记住的几点注意事项:你可以使用
clone()
来避免修改原始对象,但是要使用:visible
,元素必须实际上在DOM中。wvmv3b1j2#
如果为样式应用类,如.noDisplay { display:none;}你可以做类似div.find('span. noDisplay').remove()的事情;使用jQuery
daupos2t3#
尝试以下操作。它将只获取“可见”跨度的文本。
v440hwme4#
试试这个
fivyi3re5#
有趣的是,没有人提到另一个属性
innerText
,它“知道样式,不会返回“隐藏”元素的文本”(https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent)。只需将textContent
替换为innerText
,就可以完成一行修复。cngwdvgl6#
你可以使用jquery
remove()
函数并应用于div子元素。在
var div = $("<div><span style='display:none'>not </span>good</div>");
之后添加div.children().remove();
,您将只获得“好”内容omhiaaxx7#
我猜你需要过滤内容,你应该针对
nodeType = 3
,它被分配给TEXT_NODE
。