Dex*_*Dex 15 jquery list dynamic
我有两个彼此相邻的有序列表.
当我从一个列表中取出一个节点时,我想按字母顺序将其插入到另一个列表中.问题是,我想只取出一个元素并将其放回另一个列表而不刷新整个列表.
奇怪的是,当我插入右边的列表时,它工作正常,但当我插回到左侧的列表中时,顺序永远不会正确.
我也尝试将所有内容读入一个数组并在那里进行排序,以防万一()方法没有按照它们显示的顺序返回内容,但我仍然得到相同的结果.
这是我的jQuery:
function moveNode(node, to_list, order_by){
rightful_index = 1;
$(to_list)
.children()
.each(function(){
var ordering_field = (order_by == "A") ? "ingredient_display" : "local_counter";
var compA = $(node).attr(ordering_field).toUpperCase();
var compB = $(this).attr(ordering_field).toUpperCase();
var C = ((compA > compB) ? 1 : 0);
if( C == 1 ){
rightful_index++;
}
});
if(rightful_index > $(to_list).children().length){
$(node).fadeOut("fast", function(){
$(to_list).append($(node));
$(node).fadeIn("fast");
});
}else{
$(node).fadeOut("fast", function(){
$(to_list + " li:nth-child(" + rightful_index + ")").before($(node));
$(node).fadeIn("fast");
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的html的样子:
<ol>
<li ingredient_display="Enriched Pasta" ingredient_id="101635" local_counter="1">
<span class="rank">1</span>
<span class="rounded-corners">
<span class="plus_sign"> + </span>
<div class="ingredient">Enriched Pasta</div>
<span class="minus_sign"> - </span>
</span>
</li>
</ol>
Run Code Online (Sandbox Code Playgroud)
Bra*_*ord 29
我创建了一个带有工作代码的jsFiddle来解决这个问题.我在这里也包含了代码,以防jsFiddle在遥远的未来垮掉:
<ol class="ingredientList">
<li class="ingredient">Apples</li>
<li class="ingredient">Carrots</li>
<li class="ingredient">Clams</li>
<li class="ingredient">Oysters</li>
<li class="ingredient">Wheat</li>
</ol>
<ol class="ingredientList">
<li class="ingredient">Barley</li>
<li class="ingredient">Eggs</li>
<li class="ingredient">Millet</li>
<li class="ingredient">Oranges</li>
<li class="ingredient">Olives</li>
</ol>?
Run Code Online (Sandbox Code Playgroud)
和jQuery:
$(".ingredient").click(function(){
var element = $(this);
var added = false;
var targetList = $(this).parent().siblings(".ingredientList")[0];
$(this).fadeOut("fast", function() {
$(".ingredient", targetList).each(function(){
if ($(this).text() > $(element).text()) {
$(element).insertBefore($(this)).fadeIn("fast");
added = true;
return false;
}
});
if(!added) $(element).appendTo($(targetList)).fadeIn("fast");
});
});?
Run Code Online (Sandbox Code Playgroud)
为了简洁起见,我删除了HTML,因此您需要修改我的代码以匹配您的代码.此外,如果您打算使用用户定义的属性(不是有效的HTML而且任何浏览器都没有正式支持......虽然它也不会伤害任何东西......可能),我建议在它们前面添加"数据 - "符合HTML5自定义数据属性规范.所以"ingredient_id"将成为"data-ingredient_id".虽然目前任何浏览器都不支持这一点,因为HTML5还没有最终确定,但它比定义自己的属性更安全,更健壮.完成HTML5后,您的属性将得到完全支持.
编辑 - 正如John在评论中指出的那样,如果你需要支持UTF-8字符,这将不起作用.在这种情况下,您需要使用String.prototype.localeCompare()(请确保根据文档检查浏览器是否支持它).所以代码看起来像这样:
$(".ingredient").click(function(){
var element = $(this);
var added = false;
var targetList = $(this).parent().siblings(".ingredientList")[0];
$(this).fadeOut("fast", function() {
$(".ingredient", targetList).each(function(){
if ($(this).text().localeCompare($(element).text()) > 0) {
$(element).insertBefore($(this)).fadeIn("fast");
added = true;
return false;
}
});
if(!added) $(element).appendTo($(targetList)).fadeIn("fast");
});
});
Run Code Online (Sandbox Code Playgroud)