A customizable input component with left and right icons, supporting various configurations and event handling.
```javascript
const iconInput = (targetElement, options = {}) => {
const settings = {
leftIcon: null,
rightIcon: null,
placeholder: 'Enter text...',
onInput: () => {},
onChange: () => {},
...options
};
const container = document.createElement('div');
container.className = 'icon-input-container';
const input = document.createElement('input');
input.type = 'text';
input.placeholder = settings.placeholder;
input.addEventListener('input', settings.onInput);
input.addEventListener('change', settings.onChange);
if (settings.leftIcon) {
const leftIcon = document.createElement('span');
leftIcon.className = 'icon left-icon';
leftIcon.innerHTML = settings.leftIcon;
container.appendChild(leftIcon);
}
container.appendChild(input);
if (settings.rightIcon) {
const rightIcon = document.createElement('span');
rightIcon.className = 'icon right-icon';
rightIcon.innerHTML = settings.rightIcon;
container.appendChild(rightIcon);
}
targetElement.appendChild(container);
return {
update: (newOptions) => {
if (newOptions.leftIcon !== undefined) {
const leftIcon = container.querySelector('.left-icon');
if (leftIcon) leftIcon.innerHTML = newOptions.leftIcon;
}
if (newOptions.rightIcon !== undefined) {
const rightIcon = container.querySelector('.right-icon');
if (rightIcon) rightIcon.innerHTML = newOptions.rightIcon;
}
if (newOptions.placeholder !== undefined) {
input.placeholder = newOptions.placeholder;
}
},
destroy: () => {
container.remove();
}
};
};
// Example usage:
// iconInput(document.body, {
// leftIcon: '๐',
// rightIcon: 'โ๏ธ',
// placeholder: 'Search...',
// onInput: (e) => console.log(e.target.value)
// });
```
### Common Adaptations:
1. **Change Icons Dynamically**:
```javascript
const inputInstance = iconInput(document.body, { leftIcon: '๐' });
inputInstance.update({ leftIcon: '๐' });
```
2. **Add Custom Styles**:
```javascript
iconInput(document.body, {
leftIcon: '๐',
rightIcon: 'โ๏ธ',
placeholder: 'Search...',
onInput: (e) => console.log(e.target.value)
});
// Add CSS:
// .icon-input-container { display: flex; align-items: center; }
// .icon { margin: 0 8px; }
```
3. **Handle Icon Clicks**:
```javascript
iconInput(document.body, {
leftIcon: '๐',
rightIcon: 'โ๏ธ',
onInput: (e) => console.log(e.target.value),
onChange: (e) => console.log('Changed:', e.target.value)
});
// Add event listeners to icons using querySelector
```