原因
问题的根源不在 jEditable 中,而在于它用于创建选择下拉列表的 JSON 是单个对象。JavaScript 将对象属性视为未排序的。这是 jEditable 1.7.1 中的关键代码(从第 492 行开始):
/* If it is string assume it is json. */
if (String == data.constructor) {
eval ('var json = ' + data);
} else {
/* Otherwise assume it is a hash already. */
var json = data;
}
for (var key in json) {
// starts looping through the object properties
通常,这for (var key in json)
应该按照创建顺序循环遍历 JSON 属性。相反,它们以数字(“字母”)顺序循环。
修复
有很多方法可以解决这个问题,但最简单的是通过我通过 Google 搜索在 Pastebin 上找到的匿名创作的 jEditable 插件。将其粘贴到一个新的 JavaScript 文件中,并在jEditable之后将其加载到您的 HTML 文件中:
<script src="/js/jquery.jeditable.min.js"></script>
<script src="/js/jquery.jeditable.plugins.js"></script>
此外,json.php
必须更改文件。而不是将 JSON 作为对象返回,如下所示:
{"0":"Select driver...", "48":"Ashley Solis", "43":"Casey Segal", // etc.
它应该将 JSON 作为线性数组返回,如下所示:
[" Select driver...||0","Ashley Solis||48","Casey Segal||43", // etc.
请注意在字符串“Select driver...”的开头使用空格,以确保将其排序到第一个位置。无需更改其他 JavaScript,前提是json.php
它没有在其他任何地方使用。
插件
这是我在 Pastebin 上找到的完整 jEditable 插件:
// type: select (based on 1.7.1, added feature: sorted options)
$.editable.addInputType("select", {
element: function (settings, original) {
var select = $('<select />');
$(this).append(select);
return (select);
},
content: function (data, settings, original) {
/* If it is string assume it is json. */
if (String == data.constructor) {
eval('var json = ' + data);
} else {
/* Otherwise assume it is a hash already. */
var json = data;
}
var aData = [];
for (var key in json) {
if (!json.hasOwnProperty(key)) {
continue;
}
if ('selected' == key) {
continue;
}
aData.push(json[key] + "||" + key);
}
// Sort
aData.sort();
// Create
for (var key in aData) {
var aDataSplit = aData[key].split("||");
var option = $('<option />').val(aDataSplit[1]).append(aDataSplit[0]);
$('select', this).append(option);
}
/* Loop option again to set selected. IE needed this... */
$('select', this).children().each(function () {
if ($(this).val() == json['selected'] || $(this).text() == $.trim(original.revert)) {
$(this).attr('selected', 'selected');
}
});
}
});