【发布时间】:2016-04-23 16:53:31
【问题描述】:
我想按价格对表格进行排序,但价格可能出现在字符串中:
例如:Starting from $75、today only: $25、$100 等
唯一不变的模式是排序后的值旁边总是有$ 符号。
起初,我尝试使用tablesorter jquery 插件,添加了自定义解析器并到达this fiddle。
但是为了使用这种方法,我似乎必须启用用户稍后自行对表格进行排序的选项,这是我不想要的。否则,如果我将所有排序器设置为 false,我将无法使用自定义 money 解析器对其进行排序。
然后,我开始使用隐藏输入,它只包含我想要排序的数值。我不知道这是否是一个好习惯,而且它还要求我将它作为附加行添加到每个相关单元格,我宁愿通过,如this fiddle。
然后我意识到可能根本没有必要使用tablesorter 插件,因为我可以用更少的代码达到这个结果,就像在this fiddle 中一样,这是我当前的代码。
当前代码:
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())
但它不起作用。
另外,一般来说,如果你能想出一个更好的方法来做我想做的事情,而不必使用隐藏的输入,请告诉我。这是可接受的做法吗?通常我只看到表单中使用的输入。
【问题讨论】:
标签: javascript jquery html sorting tablesorter