Два одинаковых сценария на одной странице
Есть скрипт для изменения внешнего вида элементов форм: checkbox; radio; select, плюс к нему CSS.
Он работает только для одного элемента формы на одной странице. К примеру, на странице нужно изменить два или больше выпадающих списка. Что я делал: дублировал скрипт для второго списка <script type="text/javascript" src="JavaScript/style_forms.js"></script> <script type="text/javascript" src="JavaScript/style_forms-2.js"></script> два разных CSS span.select {стиль для первого списка} span.select-2 {стиль для второго списка} в самом скрипте изменил все .className == "styled" на .className == "styled-2" Результат - работает только последний элемент. Подскажите, что нужно ещё изменить? |
Цитата:
Дублирование не выход, если у вас будет 10 таких селектов, вы 10 скриптов сделаете? Вы не показали ни кода, ни примера, как мы вам можем помочь, попробовать угадать? |
Цитата:
var checkboxHeight = "25"; var radioHeight = "25"; var selectWidth = "229"; /* Нет потребности изменять что - нибудь после этого */ document.write('<style type="text/css">input.styled { display: none; } select.styled { position: relative; width: ' + selectWidth + 'px; opacity: 0; filter: alpha(opacity=0); z-index: 5; }</style>'); var Custom = { init: function() { var inputs = document.getElementsByTagName("input"), span = Array(), textnode, option, active; for(a = 0; a < inputs.length; a++) { if((inputs[a].type == "checkbox" || inputs[a].type == "radio") && inputs[a].className == "styled") { span[a] = document.createElement("span"); span[a].className = inputs[a].type; if(inputs[a].checked == true) { if(inputs[a].type == "checkbox") { position = "0 -" + (checkboxHeight*2) + "px"; span[a].style.backgroundPosition = position; } else { position = "0 -" + (radioHeight*2) + "px"; span[a].style.backgroundPosition = position; } } inputs[a].parentNode.insertBefore(span[a], inputs[a]); inputs[a].onchange = Custom.clear; span[a].onmousedown = Custom.pushed; span[a].onmouseup = Custom.check; document.onmouseup = Custom.clear; } } inputs = document.getElementsByTagName("select"); for(a = 0; a < inputs.length; a++) { if(inputs[a].className == "styled") { option = inputs[a].getElementsByTagName("option"); active = option[0].childNodes[0].nodeValue; textnode = document.createTextNode(active); for(b = 0; b < option.length; b++) { if(option[b].selected == true) { textnode = document.createTextNode(option[b].childNodes[0].nodeValue); } } span[a] = document.createElement("span"); span[a].className = "select"; span[a].id = "select" + inputs[a].name; span[a].appendChild(textnode); inputs[a].parentNode.insertBefore(span[a], inputs[a]); inputs[a].onchange = Custom.choose; } } }, pushed: function() { element = this.nextSibling; if(element.checked == true && element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight*3 + "px"; } else if(element.checked == true && element.type == "radio") { this.style.backgroundPosition = "0 -" + radioHeight*3 + "px"; } else if(element.checked != true && element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight + "px"; } else { this.style.backgroundPosition = "0 -" + radioHeight + "px"; } }, check: function() { element = this.nextSibling; if(element.checked == true && element.type == "checkbox") { this.style.backgroundPosition = "0 0"; element.checked = false; } else { if(element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight*2 + "px"; } else { this.style.backgroundPosition = "0 -" + radioHeight*2 + "px"; group = this.nextSibling.name; inputs = document.getElementsByTagName("input"); for(a = 0; a < inputs.length; a++) { if(inputs[a].name == group && inputs[a] != this.nextSibling) { inputs[a].previousSibling.style.backgroundPosition = "0 0"; } } } element.checked = true; } }, clear: function() { inputs = document.getElementsByTagName("input"); for(var b = 0; b < inputs.length; b++) { if(inputs[b].type == "checkbox" && inputs[b].checked == true && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 -" + checkboxHeight*2 + "px"; } else if(inputs[b].type == "checkbox" && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 0"; } else if(inputs[b].type == "radio" && inputs[b].checked == true && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 -" + radioHeight*2 + "px"; } else if(inputs[b].type == "radio" && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 0"; } } }, choose: function() { option = this.getElementsByTagName("option"); for(d = 0; d < option.length; d++) { if(option[d].selected == true) { document.getElementById("select" + this.name).childNodes[0].nodeValue = option[d].childNodes[0].nodeValue; } } } } window.onload = Custom.init; span.select { width: 229px; height: 24px; line-height: 21px; font-family: Arial; font-size: 12px; background-image: url(../images/background_select.png); background-color: #FFFFFF; background-repeat: no-repeat; overflow: hidden; position: absolute; margin-top: -2px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; } |
Работает ваш скрипт нормально с несколькими select на странице, просто нужно обязательно задавать уникальное значение атрибута name:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <style type="text/css"> span.select { width: 229px; height: 24px; line-height: 21px; font-family: Arial; font-size: 12px; background-image: url(../images/background_select.png); background-color: #FFFFFF; background-repeat: no-repeat; overflow: hidden; position: absolute; margin-top: -2px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; } #selectselect1 { border: 1px solid #f00; } #selectselect2 { border: 1px solid #0f0; } #selectselect3 { border: 1px solid #00f; } </style> <script type="text/javascript"> var checkboxHeight = "25"; var radioHeight = "25"; var selectWidth = "229"; document.write('<style type="text/css">input.styled { display: none; } select.styled { position: relative; width: ' + selectWidth + 'px; opacity: 0; filter: alpha(opacity=0); z-index: 5; }</style>'); var Custom = { init: function() { var inputs = document.getElementsByTagName("input"), span = Array(), textnode, option, active; for(a = 0; a < inputs.length; a++) { if((inputs[a].type == "checkbox" || inputs[a].type == "radio") && inputs[a].className == "styled") { span[a] = document.createElement("span"); span[a].className = inputs[a].type; if(inputs[a].checked == true) { if(inputs[a].type == "checkbox") { position = "0 -" + (checkboxHeight*2) + "px"; span[a].style.backgroundPosition = position; } else { position = "0 -" + (radioHeight*2) + "px"; span[a].style.backgroundPosition = position; } } inputs[a].parentNode.insertBefore(span[a], inputs[a]); inputs[a].onchange = Custom.clear; span[a].onmousedown = Custom.pushed; span[a].onmouseup = Custom.check; document.onmouseup = Custom.clear; } } inputs = document.getElementsByTagName("select"); for(a = 0; a < inputs.length; a++) { if(inputs[a].className == "styled") { option = inputs[a].getElementsByTagName("option"); active = option[0].childNodes[0].nodeValue; textnode = document.createTextNode(active); for(b = 0; b < option.length; b++) { if(option[b].selected == true) { textnode = document.createTextNode(option[b].childNodes[0].nodeValue); } } span[a] = document.createElement("span"); span[a].className = "select"; span[a].id = "select" + inputs[a].name; span[a].appendChild(textnode); inputs[a].parentNode.insertBefore(span[a], inputs[a]); inputs[a].onchange = Custom.choose; } } }, pushed: function() { element = this.nextSibling; if(element.checked == true && element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight*3 + "px"; } else if(element.checked == true && element.type == "radio") { this.style.backgroundPosition = "0 -" + radioHeight*3 + "px"; } else if(element.checked != true && element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight + "px"; } else { this.style.backgroundPosition = "0 -" + radioHeight + "px"; } }, check: function() { element = this.nextSibling; if(element.checked == true && element.type == "checkbox") { this.style.backgroundPosition = "0 0"; element.checked = false; } else { if(element.type == "checkbox") { this.style.backgroundPosition = "0 -" + checkboxHeight*2 + "px"; } else { this.style.backgroundPosition = "0 -" + radioHeight*2 + "px"; group = this.nextSibling.name; inputs = document.getElementsByTagName("input"); for(a = 0; a < inputs.length; a++) { if(inputs[a].name == group && inputs[a] != this.nextSibling) { inputs[a].previousSibling.style.backgroundPosition = "0 0"; } } } element.checked = true; } }, clear: function() { inputs = document.getElementsByTagName("input"); for(var b = 0; b < inputs.length; b++) { if(inputs[b].type == "checkbox" && inputs[b].checked == true && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 -" + checkboxHeight*2 + "px"; } else if(inputs[b].type == "checkbox" && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 0"; } else if(inputs[b].type == "radio" && inputs[b].checked == true && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 -" + radioHeight*2 + "px"; } else if(inputs[b].type == "radio" && inputs[b].className == "styled") { inputs[b].previousSibling.style.backgroundPosition = "0 0"; } } }, choose: function() { option = this.getElementsByTagName("option"); for(d = 0; d < option.length; d++) { if(option[d].selected == true) { document.getElementById("select" + this.name).childNodes[0].nodeValue = option[d].childNodes[0].nodeValue; } } } }; window.onload = function() { Custom.init(); }; </script> </head> <body> <div> <form action=""> <fieldset> <legend>Form Caption</legend> <div> <label for="select1">Select1:</label> <select id="select1" name="select1" class="styled"> <option>option1</option> <option>option2</option> <option>option3</option> </select> </div> <div> <label for="select2">Select2:</label> <select id="select2" name="select2" class="styled"> <option>option1</option> <option>option2</option> <option>option3</option> </select> </div> <div> <label for="select3">Select3:</label> <select id="select3" name="select3" class="styled"> <option>option1</option> <option>option2</option> <option>option3</option> </select> </div> </fieldset> </form> </div> </body> </html> |
Да, так он работает, но мне нужно для каждого Select задать свой стиль.
|
Ясно, значит вообще поленились разобраться в коде.
У вас есть сточка: document.getElementById("select" + this.name).childNodes[0].nodeValue = option[d].childNodes[0].nodeValue; Следовательно каждый <select> заменяется на элемент имя идентификатора которого состоит из приставки select и значения атрибута name каждого элемента <select>. Значит к каждому отдельному <select> можно добавить стили в CSS: #selectselect1 { border: 1px solid #f00; } #selectselect2 { border: 1px solid #0f0; } #selectselect3 { border: 1px solid #00f; } Пример выше поправил. |
Octane, спасибо за участие, но проблему я решил.
Дело в том, что в самих скриптах устанавливается размер (для каждого) в переменной var selectWidth = "123";, и скрипта нужно два. Всё так как я и делал только дело было в <body onload="Custom.init();Cust.init();"> Решение подобной проблемы англ.яз. http://www.dynamicdrive.com/forums/a...hp/t-7886.html |
Зачем 2 скрипта, я же показал, как в CSS задавать стили для кажного select…
|
Часовой пояс GMT +3, время: 15:47. |