These Reggae-inspired U•BASS® strings offer the same tone and playing experience as our more traditional Road Toad Pahoehoe U•BASS® Strings. Infused with fun and personality, each U•BASS® string in this set is a different color: Black (E), Green (A), Yellow (D), and Red (G).
Fits all rubber-stringed Kala U•BASS® Instruments*
Includes 4 U•BASS® strings: EADG
Designed for the traditional bass tuning (EADG)
Suitable for 20“ - 21" Scale
Manufactured from a Proprietary Polyurethane Mixture
*For use on Round Wound U•BASS® setups, the instrument will needa new, compatible nutto accommodate these strings. A nut swap should be performed by an experienced instrument technician.
**Modifications performed by the user will void the manufacturer warranty. Please also note that Kala is not responsible for damages to instruments caused by new string installments.
Had them before, tried something different, decided to go back to Dreads.
JJ
John J.
Verified Buyer
I recommend this product
Rated 5 out of 5 stars
3 years ago
Love ‘em!
This was the first time I’ve ever changed the strings on my Kala bass. I was a little apprehensive. The strings went on surprisingly easy (I watched the Kala video first, which helped). Since I use the bass in a Hawaiian Ukulele band the Rasta colors work and look great!
DY
Duane Y.
Verified Buyer
I recommend this product
Rated 5 out of 5 stars
3 years ago
UBass
I like them very much after I got used to playing that type of strings that come with the Ubass.
One or more of the items in your cart is a recurring or deferred purchase. By continuing, I agree to the cancellation policy and authorize you to charge my payment method at the prices, frequency and dates listed on this page until my order is fulfilled or I cancel, if permitted.
,
* OR add it as a snippet and render it on checkout pages.
* For Shopify Plus: add to checkout.liquid as well.
*/
(function () {
'use strict';
// ---------------------------------------------------------------------------
// 1. BLOCK KNOWN EXTENSION postMessage CHANNELS
// Extensions communicate via window.postMessage — intercept and drop theirs.
// ---------------------------------------------------------------------------
const BLOCKED_MESSAGE_PATTERNS = [
/honey/i,
/joinhoney/i,
/capital.?one.?shopping/i,
/wikibuy/i,
/retailmenot/i,
/coupon.?cabi/i,
/piggy/i,
/karma/i,
/rakuten/i,
/ibotta/i,
/cently/i,
/coupert/i,
/avast/i,
/priceblink/i,
/dealnews/i,
/savings\.com/i,
/promo\.com/i,
];
const _originalAddEventListener = window.addEventListener.bind(window);
const _originalPostMessage = window.postMessage.bind(window);
// Intercept incoming postMessages from extensions
window.addEventListener = function (type, listener, options) {
if (type === 'message') {
const wrappedListener = function (event) {
try {
const data = typeof event.data === 'string' ? event.data : JSON.stringify(event.data || '');
if (BLOCKED_MESSAGE_PATTERNS.some((p) => p.test(data))) {
console.debug('[CouponBlocker] Blocked postMessage from coupon extension.');
return; // Drop the message
}
} catch (_) {}
listener.call(this, event);
};
return _originalAddEventListener(type, wrappedListener, options);
}
return _originalAddEventListener(type, listener, options);
};
// ---------------------------------------------------------------------------
// 2. BLOCK EXTENSION-INJECTED DOM ELEMENTS
// Extensions inject buttons, iframes, and overlays — remove them on sight.
// ---------------------------------------------------------------------------
const BLOCKED_SELECTORS = [
// Honey
'[id*="honey"]',
'[class*="honey"]',
'[data-honey]',
'iframe[src*="honey"]',
// Capital One Shopping / Wikibuy
'[id*="wikibuy"]',
'[class*="wikibuy"]',
'[id*="capitalone"]',
'[class*="capital-one"]',
'iframe[src*="wikibuy"]',
'iframe[src*="capitalone"]',
// RetailMeNot / Coupons.com
'[id*="retailmenot"]',
'[class*="retailmenot"]',
'[id*="rmn-"]',
// Rakuten
'[id*="rakuten"]',
'[class*="rakuten"]',
'iframe[src*="rakuten"]',
// Piggy
'[id*="piggy"]',
'[class*="piggy"]',
// Karma
'[id*="karma-"]',
'[class*="karma-extension"]',
// Coupert
'[id*="coupert"]',
'[class*="coupert"]',
// Generic patterns
'iframe[src*="coupon"]',
'[class*="ext-coupon"]',
'[id*="ext-coupon"]',
];
function removeBlockedElements() {
BLOCKED_SELECTORS.forEach((selector) => {
document.querySelectorAll(selector).forEach((el) => {
console.debug('[CouponBlocker] Removed injected element:', el);
el.remove();
});
});
}
// Run immediately and watch for future injections
removeBlockedElements();
const domObserver = new MutationObserver(() => {
removeBlockedElements();
});
domObserver.observe(document.documentElement, {
childList: true,
subtree: true,
});
// ---------------------------------------------------------------------------
// 3. GUARD THE DISCOUNT INPUT FIELD
// Prevent extensions from programmatically filling and submitting the
// discount code field. Only allow real user input (keyboard events).
// ---------------------------------------------------------------------------
const DISCOUNT_SELECTORS = [
'input[name="discount"]',
'input[placeholder*="discount" i]',
'input[placeholder*="coupon" i]',
'input[placeholder*="promo" i]',
'input[id*="discount" i]',
'input[id*="coupon" i]',
'#checkout_reduction_code',
'#discount-code',
];
function guardDiscountInput(input) {
if (input._couponGuarded) return;
input._couponGuarded = true;
let lastRealValue = input.value;
let isHumanTyping = false;
// Track genuine keyboard interaction
input.addEventListener('keydown', () => { isHumanTyping = true; }, true);
input.addEventListener('keyup', () => { isHumanTyping = false; }, true);
// Use a native setter override to catch programmatic .value = '...' changes
const nativeInputDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(input, 'value', {
get: function () {
return nativeInputDescriptor.get.call(this);
},
set: function (val) {
if (!isHumanTyping && val !== lastRealValue) {
console.debug('[CouponBlocker] Blocked programmatic discount field change.');
return; // Silently ignore extension-driven value changes
}
lastRealValue = val;
nativeInputDescriptor.set.call(this, val);
},
configurable: true,
});
// Block programmatic form submission triggered by extensions
const form = input.closest('form');
if (form) {
form.addEventListener('submit', function (e) {
if (!isHumanTyping && input.value && input.value !== lastRealValue) {
console.debug('[CouponBlocker] Blocked programmatic form submission.');
e.preventDefault();
e.stopImmediatePropagation();
}
}, true);
}
}
function guardAllDiscountInputs() {
DISCOUNT_SELECTORS.forEach((sel) => {
document.querySelectorAll(sel).forEach(guardDiscountInput);
});
}
// Guard inputs now and watch for dynamically rendered checkout fields
guardAllDiscountInputs();
const inputObserver = new MutationObserver(() => {
guardAllDiscountInputs();
});
inputObserver.observe(document.documentElement, {
childList: true,
subtree: true,
});
console.log('[CouponBlocker] Active — coupon extensions are blocked on this page.');
})();