自定义Select选项样式实现URL自动跳转需求求助
解决方案
问题根源在于W3Schools的自定义select脚本会隐藏原生<select>和<option>元素,改用DIV模拟下拉结构,你之前针对原生select的change事件监听自然失效,必须直接给模拟的DIV选项绑定跳转逻辑。
修改步骤
- 在生成模拟选项的循环代码中,把原生
<option>的data-url属性同步到对应的DIV元素上 - 在选项DIV的点击事件里,读取存储的
data-url并执行页面跳转
修改后的完整脚本示例
// 基于W3Schools自定义select脚本修改 var x, i, j, l, ll, selElmnt, a, b, c; x = document.getElementsByClassName("custom-select"); l = x.length; for (i = 0; i < l; i++) { selElmnt = x[i].getElementsByTagName("select")[0]; ll = selElmnt.length; // 创建选中状态的模拟容器 a = document.createElement("DIV"); a.setAttribute("class", "select-selected"); a.innerHTML = selElmnt.options[selElmnt.selectedIndex].innerHTML; x[i].appendChild(a); // 创建下拉选项列表容器 b = document.createElement("DIV"); b.setAttribute("class", "select-items select-hide"); for (j = 0; j < ll; j++) { // 创建单个模拟选项DIV c = document.createElement("DIV"); c.innerHTML = selElmnt.options[j].innerHTML; // 关键:同步原生option的data-url到模拟DIV c.setAttribute("data-url", selElmnt.options[j].getAttribute("data-url") || ""); c.addEventListener("click", function(e) { // 保留原有的选中状态同步逻辑 var y, i, k, s, h, sl, yl; s = this.parentNode.parentNode.getElementsByTagName("select")[0]; sl = s.length; h = this.parentNode.previousSibling; for (i = 0; i < sl; i++) { if (s.options[i].innerHTML == this.innerHTML) { s.selectedIndex = i; h.innerHTML = this.innerHTML; y = this.parentNode.getElementsByClassName("same-as-selected"); yl = y.length; for (k = 0; k < yl; k++) { y[k].removeAttribute("class"); } this.setAttribute("class", "same-as-selected"); break; } } h.click(); // 新增跳转逻辑 var targetUrl = this.getAttribute("data-url"); if (targetUrl) { window.location.href = targetUrl; } }); b.appendChild(c); } x[i].appendChild(b); a.addEventListener("click", function(e) { e.stopPropagation(); closeAllSelect(this); this.nextSibling.classList.toggle("select-hide"); this.classList.toggle("select-arrow-active"); }); } function closeAllSelect(elmnt) { var x, y, i, xl, yl, arrNo = []; x = document.getElementsByClassName("select-items"); y = document.getElementsByClassName("select-selected"); xl = x.length; yl = y.length; for (i = 0; i < yl; i++) { if (elmnt == y[i]) { arrNo.push(i) } else { y[i].classList.remove("select-arrow-active"); } } for (i = 0; i < xl; i++) { if (arrNo.indexOf(i)) { x[i].classList.add("select-hide"); } } } document.addEventListener("click", closeAllSelect);
注意事项
- 确保原生
<option>带有合法的data-url属性,示例:<option data-url="/target-page">目标页面</option> - 不需要跳转的选项可以不设置
data-url,脚本会自动忽略空值
内容的提问来源于stack exchange,提问作者Steph G
相关产品推荐
相关产品推荐

