🎁Free Shipping on Orders Over $59🎉
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
1 / 8
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
Microfiber Cleaning Rag
44% OFF
Fnkus

Microfiber Cleaning Rag

$4.99 $8.99
0 sold
QTY
Qty

🔥BUY 5 GET 5 FREE🔥

🔥BUY 10 GET 10 FREE🔥

😮Make your kitchen spotless?
👍🏻👍🏻This microfiber cleaning rag can be super absorbent and dry quickly, strong decontamination, easy to clean. And use them everyday to enjoy your cleaning.

High Quality

Using double-layer coral fleece, it is safe and non-toxic, the cleaning effect is more efficient, and the oil removal ability is strong.

Scratch-free

Super soft and non-abrasive cleaning cloth will not scratch items, nor will it scrape paint, coatings or other surfaces.

Super Absorbent

Compared with ordinary wipes, the microfiber cleaning cloth has great water absorptionholds 8 Times its weight in liquid and dries fast.

Reusable

It can be reused for hundreds of times and can capture tiny dust and particles, saving a lot of money!

Widely Used

Great for cleaning kitchenware, car, window, mirror cloths and other household cleaning tasks.

Package Includes: 1*Microfiber Cleaning Rag

Material: Microfiber

Color: Color: Green, Blue, Pink(Random Color)

Size: 25×25cm

Package Includes: 1/5/10/20 × Microfiber Cleaning Rag 

NOTE

Due to manual measurements, please allow slight measurement deviations.

Due to the different display and lighting effects, the actual color of the item may be slightly different from the color displayed on the picture.

const TAG = 'spz-custom-painter-button-animation'; const MAX_ITERATION_COUNT = 99999999; const SITE = (window.C_SETTINGS && window.C_SETTINGS.routes && window.C_SETTINGS.routes.root) || ''; const ADD_TO_CART_ANIMATION_SETTING = `${SITE}/api/marketing_atmosphere_app/add_to_cart_btn_animation/setting`; class SpzCustomPainterButtonAnimation extends SPZ.BaseElement { /**@override */ static deferredMount() { return false; } /** @param {!SpzElement} element */ constructor(element) { super(element); /** @private {!../../src/service/xhr-impl.Xhr} */ this.xhr_ = SPZServices.xhrFor(this.win); /** @private {Object} */ this.data_ = null; /** @private {Element} */ this.addToCartButton_ = null; /** @private {boolean} */ this.productAvailable_ = true; /** @private {number} */ this.timerId_ = null; /** @private {number} */ this.animationExecutionCount_ = 0; /** @private {boolean} */ this.selectedVariantAvailable_ = true; /** @private {number} */ this.delay_ = 5000; /** @private {number} */ this.iterationCount_ = 5; /** @private {string} */ this.animationClass_ = ''; } /** @override */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** @override */ buildCallback() { this.productAvailable_ = this.element.hasAttribute('product-available'); this.selectedVariantAvailable_ = this.element.hasAttribute('selected-variant-available'); } /** @override */ mountCallback() { this.render_(); } /** @private */ render_() { if (!this.productAvailable_) { return; } this.fetch_().then((data) => { if (!data) { return; } this.data_ = data; this.animationClass_ = `painter-${data.animation_name}-animation`; this.iterationCount_ = data.animation_iteration_count === 'infinite' ? MAX_ITERATION_COUNT : data.animation_iteration_count; const animationDuration = 1; const animationDelay = data.animation_delay || 5; this.delay_ = (animationDuration + animationDelay) * 1000; this.handleButtonEffect_(); }); } /** * @param {JsonObject} data * @return {(null|Object)} * @private */ parseJson_(data) { try { return JSON.parse(data); } catch (e) { return null; } } /** * @return {Promise} * @private */ fetch_() { return this.xhr_.fetchJson(ADD_TO_CART_ANIMATION_SETTING).then((data) => { if (!data || !data.enabled) { return null; } return this.parseJson_(data.detail); }); } /** @private */ getAddToCartButton_() { this.addToCartButton_ = SPZCore.Dom.scopedQuerySelector( document.body, '[data-section-type="product"] [role="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product"] [data-click="addToCart"]' ); } /** @private */ restartAnimation_() { this.addToCartButton_.classList.remove(this.animationClass_); this.addToCartButton_./* OK */ offsetWidth; this.addToCartButton_.classList.add(this.animationClass_); this.animationExecutionCount_++; } /** @private */ clearTimer_() { this.win.clearInterval(this.timerId_); this.timerId_ = null; } /** @private */ setupTimer_() { this.timerId_ = this.win.setInterval(() => { this.restartAnimation_(); if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); this.clearTimer_(); } }, this.delay_); } /** @private */ restartTimer_() { if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); return; } this.setupTimer_(); } /** @private */ listenVariantChange_() { SPZUtils.Event.listen(self.document, 'dj.variantChange', (e) => { const selectedVariant = e.detail && e.detail.selected; if (!selectedVariant) { return; } const {available} = selectedVariant; if (this.selectedVariantAvailable_ !== available) { this.selectedVariantAvailable_ = available; this.clearTimer_(); if (available) { this.restartTimer_(); } } }); } /** @private */ removeAnimationClass_() { this.win.setTimeout(() => { this.addToCartButton_.classList.remove(this.animationClass_); }, 1000); } /** @private */ handleButtonEffect_() { this.getAddToCartButton_(); if (!this.addToCartButton_) { return; } if (this.selectedVariantAvailable_) { ++this.animationExecutionCount_; this.addToCartButton_.classList.add(this.animationClass_); if (this.iterationCount_ === 1) { this.removeAnimationClass_(); return; } this.setupTimer_(); } this.listenVariantChange_(); } } SPZ.defineElement(TAG, SpzCustomPainterButtonAnimation);