#javascript #jquery #css #jestjs
#javascript #jquery #css #jestjs
Вопрос:
Я хочу написать некоторый тест для моего проекта JS, который где-то использует селектор jQuery, подобный этому:
$('textarea:visible').each((idx, el) => {
....
})
Но с ним возникли некоторые странные проблемы, и тест не обнаружил видимой текстовой области!
Тестовый файл:
test('renders correctly', () => {
document.body.innerHTML = `
<textarea style="width:100px;height:100px;display:block;opacity:1;visibility:visible;">
Test
</textarea>
`;
console.log($('textarea').val()); // return Test
console.log($('body').is(':hidden')); // return true!
console.log($('textarea').is(':visible')); // return false!
console.log($('textarea:visible').length); // return 0!
....
});
Комментарии:
1.
is(':visible')
нетis('visible')
. Голосование за закрытие из-за опечатки. Также ваша последняя консоль. возвращает журнал1
, а не0
: jsfiddle.net/RoryMcCrossan/10yp4z2x2. @RoryMcCrossan Я отредактировал свой вопрос, но, тем не менее, проблема возникла со мной. И о последнем
console.log
, да, я думаю, что это должно быть 1! но он возвращает 0!3. @RoryMcCrossan обратите внимание, что проблема возникла только в шутку! Так что ваша
jsfiddle
ссылка бессмысленна.4. Если вы добавите
console.log($('textarea').length);
, какое значение вы получите? Обнаруживается ли<textarea>
четность независимо от видимости?
Ответ №1:
Это связано с тем, что начиная с 1.3.2 видимый селектор jQuery определяется тем, занимает ли элемент пространство, а не только его отображаемое значение.
В jQuery 3 видимый псевдоселектор выглядит следующим образом:
jQuery.expr.pseudos.visible = function( elem ) {
return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
};
Таким образом, вы можете переписать getClientReats следующим образом
window.Element.prototype.getClientRects = function() {
var node = this;
while(node) {
if(node === document) {
break;
}
if (!node.style || node.style.display === 'none' || node.style.visibility === 'hidden') {
return [];
}
node = node.parentNode;
}
var self = $(this);
return [{width: self.width(), height: self.height()}];
};