如何从option标签提取特定文本?实现自定义国家码选择器仅显示区号
解决方案
要实现自定义下拉选择器仅显示国家电话区号,核心是从选项文本中提取出+开头的区号部分,替换选中区域的显示内容。具体修改如下:
1. 添加区号提取工具函数
新增专门的提取函数,通过正则匹配文本中的区号序列:
// 提取国家区号 function extractCountryCode(text) { // 匹配+开头的数字序列,兼容带/不带括号的格式 const match = text.match(/\+\d+/); return match ? match[0] : text; // 匹配失败时返回原文本作为兜底 }
2. 修改初始化默认选中内容
在createCustomDropdown函数中,初始化选中元素时调用提取函数:
// 原代码:selected.textContent = optionsArr[0].textContent; selected.textContent = extractCountryCode(optionsArr[0].textContent);
3. 修改选中选项时的显示逻辑
在setSelected函数中,将完整文本替换为提取后的区号:
// 原代码:selected.textContent = label; selected.textContent = extractCountryCode(label);
完整修改后的JS代码
// Get dropdowns and form const dropdowns = document.querySelectorAll('[data-dropdown]'); const form = document.querySelector('form'); // 提取国家区号 function extractCountryCode(text) { // 匹配+开头的数字序列,兼容带/不带括号的格式 const match = text.match(/\+\d+/); return match ? match[0] : text; // 匹配失败时返回原文本作为兜底 } // Check if dropdowns exist on page if(dropdowns.length > 0) { // Loop through dropdowns and create custom dropdown for each select element dropdowns.forEach(dropdown => { createCustomDropdown(dropdown); }); } // Check if form element exist on page if(form !== null) { // When form is submitted console log the value of the select field form.addEventListener('submit', (e) => { e.preventDefault(); console.log('Selected country:', form.querySelector('[name="country"]').value); }); } // Create custom dropdown function createCustomDropdown(dropdown) { // Get all options and convert them from nodelist to array const options = dropdown.querySelectorAll('option'); const optionsArr = Array.prototype.slice.call(options); // Create custom dropdown element and add class dropdown to it // Insert it in the DOM after the select field const customDropdown = document.createElement('div'); customDropdown.classList.add('dropdown'); dropdown.insertAdjacentElement('afterend', customDropdown); // Create element for selected option // Add class to this element, text from the first option in select field and append it to custom dropdown const selected = document.createElement('div'); selected.classList.add('dropdown__selected'); // 修改:提取区号作为初始显示内容 selected.textContent = extractCountryCode(optionsArr[0].textContent); customDropdown.appendChild(selected); // Create element for dropdown menu, add class to it and append it to custom dropdown // Add click event to selected element to toggle dropdown menu const menu = document.createElement('div'); menu.classList.add('dropdown__menu'); customDropdown.appendChild(menu); selected.addEventListener('click', toggleDropdown.bind(menu)); // Create serach input element // Add class, type and placeholder to this element and append it to menu element const search = document.createElement('input'); search.placeholder = 'Search...'; search.type = 'text'; search.classList.add('dropdown__menu_search'); menu.appendChild(search); // Create wrapper element for menu items, add class to it and append to menu element const menuItemsWrapper = document.createElement('div'); menuItemsWrapper.classList.add('dropdown__menu_items'); menu.appendChild(menuItemsWrapper); // Loop through all options and create custom option for each option and append it to items wrapper element // Add click event for each custom option to set clicked option as selected option optionsArr.forEach(option => { const item = document.createElement('div'); item.classList.add('dropdown__menu_item'); item.dataset.value = option.value; item.textContent = option.textContent; menuItemsWrapper.appendChild(item); item.addEventListener('click', setSelected.bind(item, selected, dropdown, menu)); }); // Add selected class to first custom option menuItemsWrapper.querySelector('div').classList.add('selected'); // Add input event to search input element to filter items // Add click event to document element to close custom dropdown if clicked outside of it // Hide original dropdown(select) search.addEventListener('input', filterItems.bind(search, optionsArr, menu)); document.addEventListener('click', closeIfClickedOutside.bind(customDropdown, menu)); dropdown.style.display = 'none'; } // Toggle dropdown function toggleDropdown() { // Check if dropdown is opened and if it is close it, otherwise open it and focus search input if(this.offsetParent !== null) { this.style.display = 'none'; }else { this.style.display = 'block'; this.querySelector('input').focus(); } } // Set selected option function setSelected(selected, dropdown, menu) { // Get value and label from clicked custom option const value = this.dataset.value; const label = this.textContent; // Change the text on selected element // 修改:提取区号显示 selected.textContent = extractCountryCode(label); dropdown.value = value; // Close the menu // Reset search input value // Remove selected class from previously selected option and show all divs if they were filtered // Add selected class to clicked option menu.style.display = 'none'; menu.querySelector('input').value = ''; menu.querySelectorAll('div').forEach(div => { if(div.classList.contains('selected')) { div.classList.remove('selected'); } if(div.offsetParent === null) { div.style.display = 'block'; } }); this.classList.add('selected'); } // Filter items function filterItems(itemsArr, menu) { // Get all custom options // Get the value of search input and convert it to all lowercase characters // Get filtered items // Get the indexes of filtered items const customOptions = menu.querySelectorAll('.dropdown__menu_items div'); const value = this.value.toLowerCase(); const filteredItems = itemsArr.filter(item => item.value.toLowerCase().includes(value)); const indexesArr = filteredItems.map(item => itemsArr.indexOf(item)); // Check if option is not inside indexes array and hide it and if it is inside indexes array and it is hidden show it itemsArr.forEach(option => { if(!indexesArr.includes(itemsArr.indexOf(option))) { customOptions[itemsArr.indexOf(option)].style.display = 'none'; }else { if(customOptions[itemsArr.indexOf(option)].offsetParent === null) { customOptions[itemsArr.indexOf(option)].style.display = 'block'; } } }); } // Close dropdown if clicked outside dropdown element function closeIfClickedOutside(menu, e) { if(e.target.closest('.dropdown') === null && e.target !== this && menu.offsetParent !== null) { menu.style.display = 'none'; } }
额外说明
- 正则表达式
/\+\d+/可匹配所有+开头的数字序列,兼容选项文本中带括号(如(+93))或不带括号(如+93)的格式 - 函数加入兜底逻辑,匹配失败时返回原文本,避免出现空白显示
- 下拉菜单仍保留完整的“国家名称+国家码”显示,不影响用户选择时的识别
内容的提问来源于stack exchange,提问作者Gupa Dutta
相关产品推荐
相关产品推荐

