按隐藏输入对表进行排序
Table sorting by hidden input
我想按价格对表格进行排序,但价格可能出现在字符串中:
例如:Starting from $75
、today only: $25
、$100
等。
唯一的常量模式是排序值旁边始终$
符号。
起初,我尝试使用 tablesorter
jquery 插件,添加了一个自定义解析器并达到了这个小提琴。
但是为了使用这种方法,似乎我必须让用户选择稍后自行对表进行排序,这是我不想要的。否则,如果我将所有排序器设置为 false
,我无法使用自定义money
解析器对其进行排序。
开始使用隐藏输入,该输入将仅包含我想要排序的数值。我不知道这是否是一种好的做法,而且它需要我将其作为附加行添加到每个相关单元格中,我宁愿通过,就像在这个小提琴中一样。
然后我意识到可能根本不需要使用tablesorter
插件,因为我可以用更少的代码获得这个结果,就像在这个小提琴中一样,这是我当前的代码。
当前代码:
.JS:
function sortNum(a, b) {
var aVal = 1 * $(a).find("input[name='price']").val();
var bVal = 1 * $(b).find("input[name='price']").val();
if(aVal == 0)
return 1;
else if(bVal == 0)
return -1;
else
return aVal < bVal ? -1 : 1;
}
function sortTheTable(){
$(function() {
var elems = $.makeArray($('tr:has(.sort)').remove())
elems.sort(sortNum);
console.log(elems);
$("#sortme").append($(elems));
});
}
sortTheTable();
.HTML:
<table id="sortme">
<tr>
<th>name</td>
<th>price</td>
</tr>
<tr>
<td>a</td>
<td class="sort">Only 5 <input type="hidden" name="price" value="5"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">$3 <input type="hidden" name="price" value="3"/></td>
</tr>
<tr>
<td>c</td>
<td class="sort">$8 <input type="hidden" name="price" value="8"/></td>
</tr>
<tr>
<td>c</td>
<td class="sort">0 <input type="hidden" name="price" value="0"/></td>
</tr>
<tr>
<td>h</td>
<td class="sort">2 <input type="hidden" name="price" value="2"/></td>
</tr>
<tr>
<td>p</td>
<td class="sort">6 <input type="hidden" name="price" value="6"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">20 <input type="hidden" name="price" value="20"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">0 <input type="hidden" name="price" value="0"/></td>
</tr>
</table>
主要问题:
如何使代码仅对具有隐藏输入的行进行排序(或您建议使代码尽可能更好的任何更好的做法),而不是按具有class="sort"
的单元格进行排序(我不想使用此类)。
我尝试切换:
var elems = $.makeArray($('tr:has(.sort)').remove())
到:
var elems = $.makeArray($('tr:has(input[name='price'])').remove())
但它不起作用。
另外,一般来说,如果你能想出一个更好的方法来做我正在尝试做的事情,而不必使用隐藏的输入,请告诉我。这是一种可以接受的做法吗?通常我只看到表单中使用的输入。
在尝试$('tr:has(input[name="price"])')
时仅选择具有隐藏input
tr
元素,并将sortNum
函数更改为:
function sortNum(a, b) {
var aVal = 1 * $(a).find("input[name='price']").val();
var bVal = 1 * $(b).find("input[name='price']").val();
return aVal - bVal;
}
这应该可以正常工作:JSFiddle
您在 Array.sort 中使用的比较函数sortNum
错误,如文档所述:
如果提供了比较函数,则对数组元素进行排序 根据比较函数的返回值。如果 a 和 b 是 然后比较两个要素:
- 如果
compareFunction(a, b)
小于 0,则排序a
到比b
低的索引,即 a 排在第一位。- 如果
compareFunction(a, b)
返回 0,则保持a
和b
彼此不变,但相对于所有不同的 元素。- 如果
compareFunction(a, b)
大于 0,则b
排序为低于a
的索引。- 当给定一对特定的元素
a
并b
作为其两个参数时,compareFunction(a, b)
必须始终返回相同的值。如果 返回不一致的结果,则未定义排序顺序。
但是您的函数不遵守此规则。例如,如果a = b
则返回1
0
的插入,因为它们是相等的。
我的建议仅使用 jQuery 和 js 排序来最小化代码并加快速度是:
$(function () {
$('#sortme tr:has(input[name="price"])').sort(function(a, b) {
return 1 * $(a).find("input[name='price']").val() - 1 * $(b).find("input[name='price']").val();
}).appendTo('#sortme');
});
<script src="http://code.jquery.com/jquery-1.11.3.js"></script>
<table id="sortme">
<tr>
<th>name</td>
<th>price</td>
</tr>
<tr>
<td>a</td>
<td class="sort">Only 5 <input type="hidden" name="price" value="5"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">$3 <input type="hidden" name="price" value="3"/></td>
</tr>
<tr>
<td>c</td>
<td class="sort">$8 <input type="hidden" name="price" value="8"/></td>
</tr>
<tr>
<td>c</td>
<td class="sort">0 <input type="hidden" name="price" value="0"/></td>
</tr>
<tr>
<td>h</td>
<td class="sort">2 <input type="hidden" name="price" value="2"/></td>
</tr>
<tr>
<td>p</td>
<td class="sort">6 <input type="hidden" name="price" value="6"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">20 <input type="hidden" name="price" value="20"/></td>
</tr>
<tr>
<td>b</td>
<td class="sort">0 <input type="hidden" name="price" value="0"/></td>
</tr>
</table>
- jQuery可排序与溢出:隐藏;在两个列表之间
- 按嵌套的隐藏输入值对
- 元素进行排序
- 可排序的 rubaxa 隐藏浮动幽灵,但不是实际行
- 按隐藏输入对表进行排序
- Ajax排序服务器端,是iSortCol_0考虑隐藏列
- 在jQuery上更新Div隐藏字段可排序拖放更新
- 根据过滤器和搜索栏重新排序和隐藏图片
- 为什么columnDefs在重新排序或隐藏在ng网格中后不进行修改
- Jquery,过滤和隐藏元素,如何排序这些"元素到底
- jQuery数据表-按隐藏列排序日期
- 可排序列表以更新隐藏的输入
- 禁用对引导表中隐藏列的排序
- 如何禁用隐藏搜索表行在表排序器插件
- 如何在代码隐藏中对动态创建的gridview进行排序
- 如果Dgrid的id以数字开头,则Dgrid列调整大小,隐藏,重新排序属性会产生错误
- jQuery tablesorter -从排序器/过滤器中隐藏特定的表内容
- 检索已排序handsontable实例中的隐藏标头
- 隐藏行的表排序问题
- jQuery UI可排序:用新位置更新每个项目的隐藏输入值
- 保存排序顺序隐藏字段与可排序的jQuery插件