I'm trying to set up a way that I can customize the look of a dropdown menu. I'm limited in what I can do with css, so I'd like to hide the "select" element and instead show an unordered list that will work the same way:
start with this:
<td>
<select name="scope">
<option value="days">Days</option>
<option value="weeks">Weeks</option>
<option value="months">Months</option>
<option value="years">Years</option>
</select>
</td>
- <td>
- <select name="scope">
- <option value="days">Days</option>
- <option value="weeks">Weeks</option>
- <option value="months">Months</option>
- <option value="years">Years</option>
- </select>
- </td>
-
use javascript to do this:
<td>
<select name="scope" style="display: none;">
<option value="days">Days</option>
<option value="weeks">Weeks</option>
<option value="months">Months</option>
<option value="years">Years</option>
</select>
<ul>
<li>Days</li>
<li>Weeks</li>
<li>Months</li>
<li>Years</li>
</ul>
</td>
- <td>
- <select name="scope" style="display: none;">
- <option value="days">Days</option>
- <option value="weeks">Weeks</option>
- <option value="months">Months</option>
- <option value="years">Years</option>
- </select>
- <ul>
- <li>Days</li>
- <li>Weeks</li>
- <li>Months</li>
- <li>Years</li>
- </ul>
- </td>
-
What I'm getting instead is this:
<td>
<select name="scope" style="display: none;">
<option value="days">Days</option>
<option value="weeks">Weeks</option>
<option value="months">Months</option>
<option value="years">Years</option>
</select>
<ul>
<li>Days</li>
<li></li>
<li>Weeks</li>
<li></li>
<li>Months</li>
<li></li>
<li>Years</li>
<li></li>
</ul>
</td>
- <td>
- <select name="scope" style="display: none;">
- <option value="days">Days</option>
- <option value="weeks">Weeks</option>
- <option value="months">Months</option>
- <option value="years">Years</option>
- </select>
- <ul>
- <li>Days</li>
- <li></li>
- <li>Weeks</li>
- <li></li>
- <li>Months</li>
- <li></li>
- <li>Years</li>
- <li></li>
- </ul>
- </td>
-
Here's the javascript code I'm using:
$("select")
.css({
display : "none",
})
.parent()
.append( function(index, html) {
var opts = $(this).children('select').children('option');
var ar = "";
for(i=0;i<opts.length;i++){
ar = ar+"<li>"+$(opts[i]).text()+"<li>";
}
ar = "<ul>"+ar+"</ul>";
return ar;
})
.children("select")
.children('option')
.first()
.attr("selected","selected");
-
- $("select")
- .css({
- display : "none",
- })
- .parent()
- .append( function(index, html) {
- var opts = $(this).children('select').children('option');
- var ar = "";
- for(i=0;i<opts.length;i++){
- ar = ar+"<li>"+$(opts[i]).text()+"<li>";
- }
- ar = "<ul>"+ar+"</ul>";
- return ar;
- })
- .children("select")
- .children('option')
- .first()
- .attr("selected","selected");
-
I realize it's not the cleanest code in the world...javascript isn't my strong-suit. I'm sure the amount of selectors and DOM traversal I'm doing will make people cringe...but, I'd like to know where I'm going wrong with my for loop. Why am I getting extra empty list-items?
Use your words like arrows to shoot toward your goal.