我在<c:out>
- 标记中有一个无序(通过jsp <select>
- 标签动态生成)选项列表。
标记渲染后,我使用简单的JavaScript函数重新排序。
如果我使用onClick
- 元素的<select>
- 事件处理程序,我将在网页上获取/查看有序列表。如果我将该函数附加到我的onLoaded
- 事件处理程序,则会调用该函数并且调试器会显示正确的值,但我的option
- 元素的结果顺序未排序。
如果我在带有普通<script>
- 标记的dom元素之后添加方法调用,则会发生相同的行为。
限制
onClick
- 处理程序不是探测器解决方案JavaScript来源
function sortSelectById(elementId) {
var list = document.getElementById(elementId);
var options = []
for(var i = 0; i < list.length; i++) {
options[i] = [];
options[i][0] = list.options[i].text;
options[i][1] = list.options[i].value;
options[i][2] = list.options[i].selected;
}
options.sort();
for (var i = 0; i < options.length; i++) {
list.options[i].text = options[i][0];
list.options[i].value = options[i][1];
list.options[i].selected = options[i][2];
}
return;
}
答案 0 :(得分:2)
您遇到的问题是由二维数组引起的。需要准确地告诉JavaScript要排序的内容。
我们通过将compareFunction
传递给Array.prototype.sort()来完成此操作。
以下是一个例子:
function compareFunction(a, b) {
if (a[0] === b[0]) {
return 0;
}
else {
return (a[0] < b[0]) ? -1 : 1;
}
}
function sortSelectById(elementId) {
var list = document.getElementById(elementId);
var options = []
for (var i = 0; i < list.length; i++) {
options[i] = [];
options[i][0] = list.options[i].text;
options[i][1] = list.options[i].value;
options[i][2] = list.options[i].selected;
}
options.sort(compareFunction);
for (var i = 0; i < options.length; i++) {
list.options[i].text = options[i][0];
list.options[i].value = options[i][1];
list.options[i].selected = options[i][2];
}
document.getElementById("select").selectedIndex = 0;
return;
}
sortSelectById("select");
&#13;
<select id="select">
<option>Banana</option>
<option>Apple</option>
<option>Orange</option>
<option>Grape</option>
</select>
&#13;
compareFunction来自this answer
答案 1 :(得分:0)
感谢您的帮助。 “问题”非常简单,但却是不同的错误。
body
,并将其附加到根window
元素以下代码适用于我的方案
/* Required by the compatibility requirement for IE8 and older */
function sortStatus() {
sortSelectById('elem_id') ;
// sort other fields...
}
if (window.addEventListener) {
window.addEventListener('load', sortStatus, false);
}
else if (window.attachEvent) {
window.attachEvent('onload', sortStatus);
}
<强>更新强>
感谢@Howard Renollet!带有额外编码器的尖端非常整洁,效果很好!