Skip to content

Commit 724f615

Browse files
Core: renderer_base hasClass method needs rework(fixes 1330) (DevExpress#30473)
1 parent 23bdf4e commit 724f615

File tree

2 files changed

+60
-13
lines changed

2 files changed

+60
-13
lines changed

packages/devextreme/js/__internal/core/m_renderer_base.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
/* eslint-disable guard-for-in */
2-
/* eslint-disable no-restricted-syntax */
3-
/* eslint-disable prefer-arrow-callback */
4-
/* eslint-disable object-shorthand */
51
import domAdapter from '@js/core/dom_adapter';
62
import { cleanDataRecursive, data as elementData, removeData } from '@js/core/element_data';
73
import { isTablePart, parseHTML } from '@js/core/utils/html_parser';
@@ -146,18 +142,17 @@ initRender.prototype.removeClass = function (className) {
146142
return this.toggleClass(className, false);
147143
};
148144

149-
initRender.prototype.hasClass = function (className) {
150-
if (!this[0] || this[0].className === undefined) return false;
151-
145+
initRender.prototype.hasClass = function (className: string) {
152146
const classNames = className.split(' ');
153-
for (let i = 0; i < classNames.length; i++) {
154-
if (this[0].classList) {
155-
if (this[0].classList.contains(classNames[i])) return true;
156-
} else { // IE9
157-
const className = isString(this[0].className) ? this[0].className : domAdapter.getAttribute(this[0], 'class');
158-
if ((className || '').split(' ').indexOf(classNames[i]) >= 0) return true;
147+
148+
for (let i = 0; i < this.length; i++) {
149+
if (!this[i] || !this[i].className) continue;
150+
151+
for (let j = 0; j < classNames.length; j++) {
152+
if (this[i].classList.contains(classNames[j])) return true;
159153
}
160154
}
155+
161156
return false;
162157
};
163158

packages/devextreme/testing/tests/DevExpress.core/renderer.tests.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,58 @@ QUnit.test('class should be removed from SVG', function(assert) {
202202
assert.notOk(element.hasClass('someClass'));
203203
});
204204

205+
QUnit.module('hasClass method');
206+
207+
QUnit.test('should return true if element has class', function(assert) {
208+
const element = renderer('<div>');
209+
element.addClass('someClass');
210+
211+
assert.ok(element.hasClass('someClass'));
212+
});
213+
214+
QUnit.test('should return false if element has not class', function(assert) {
215+
const element = renderer('<div>');
216+
217+
assert.notOk(element.hasClass('someClass'));
218+
});
219+
220+
QUnit.test('should return true if element has multiple classes', function(assert) {
221+
const element = renderer('<div>');
222+
element.addClass('someClass someClass2');
223+
224+
assert.ok(element.hasClass('someClass'));
225+
assert.ok(element.hasClass('someClass2'));
226+
assert.notOk(element.hasClass('someClass3'));
227+
});
228+
229+
QUnit.test('should return true if one of element has class', function(assert) {
230+
const fixture = document.getElementById('qunit-fixture');
231+
232+
const $wrapper = renderer('<div>').html('<div class="one two">1</div><div class="two three">2</div>');
233+
234+
const $allInnerElements = $wrapper.find('div');
235+
236+
fixture.appendChild($allInnerElements.get(0));
237+
238+
assert.ok($allInnerElements.hasClass('one'));
239+
assert.ok($allInnerElements.hasClass('two'));
240+
assert.ok($allInnerElements.hasClass('three'));
241+
assert.notOk($allInnerElements.hasClass('five'));
242+
});
243+
244+
QUnit.test('should return false if elements collection is empty', function(assert) {
245+
246+
const $wrapper = renderer('<div>').html('<div class="one two">1</div><div class="two three">2</div>');
247+
248+
const $allInnerElements = $wrapper.find('h1');
249+
250+
assert.notOk($allInnerElements.hasClass('one'));
251+
assert.notOk($allInnerElements.hasClass('two'));
252+
assert.notOk($allInnerElements.hasClass('three'));
253+
assert.notOk($allInnerElements.hasClass('five'));
254+
});
255+
256+
205257
QUnit.module('width and height methods');
206258

207259
QUnit.test('width and height should take into consideration borders and paddings if box-sizing is border-box', function(assert) {

0 commit comments

Comments
 (0)