Sort(a,b) 在 Dojo.dnd.source 中不起作用

Posted

技术标签:

【中文标题】Sort(a,b) 在 Dojo.dnd.source 中不起作用【英文标题】:Sort(a,b) does not work in Dojo.dnd.source 【发布时间】:2014-12-17 16:02:04 【问题描述】:

我尝试在用户将元素放在目标容器上后对数据进行排序,这是排序事件

......
var elements_container= dojo.dnd.Source("elements_container");
dojo.byId("elements_container").innerhtml = '';

... // add elements into container...

function sortDnD()
    // actually full class name is ".element dojoDndItem" to query
    dojo.query(".element",  dojo.byId("elements_container")).sort(
        function( a,b )   
            // fire bug debugging cursor skip this section
            var divs_a = dojo.query('> div.sequence', a)
            var diValue_a = divs_a[0].innerHTML;
            var divs_b = dojo.query('> div.sequence', b)
            var diValue_b = divs_b[0].innerHTML;
                return (divs_a == divs_b ? 0 : (a.divs_a > b.divs_b ? 1 : -1));
        
    ).forEach(// fire bug debugging cursor move to this section
        function(a, idx)  
            dojo.byId("element_container").insertBefore(a, dojo.byId("elements_container").childNodes[idx]);  
    );

dojo.byId("elements_container") 是 dojo dnd 源。我可以保证容器中有几个元素...

我正在使用dojo1.6,有趣的是当我通过firebug调试时,它看起来是

function( a,b )   
    ....

从未执行过,也没有收到任何错误消息;调试光标在function( a,b ) 之后移动到.forEach,但.forEach 方法的主体运行没有任何问题。看起来排序函数根本没有响应。

更新

这是调用上述排序函数的代码

dojo.connect( source_container, "onDndDrop", function( source, nodes, copy, target ) 
    nodes.forEach(function(node) 
         sortDnD();
    );
);

更新2

我改变之后

dojo.query(".element",  dojo.byId("elements_container")).sort(

dojo.query(".element",  elements_container).sort(

道场给出:

TypeError: root.getElementsByClassName is not a function
...ag)var ret=_201(0,arr),te,x=0;var tret=root.getElementsByClassName(_235);while(...

这是elements_container的dom数据

node: div#elements_container.container.dnd-list.dojoDndContainer.dojoDndSource.dojoDndTarget
childrenNodes: NodeList[div#dojoUnique23.element.dojoDndItem, div#dojoUnique24.element.dojoDndItem, .....

【问题讨论】:

你是如何调用 sortDnD() 的?我在您的代码中看不到对它的调用。 @Philippe 谢谢。更新帖子就好了,触发onDndDrop事件监听是一个很简单的功能,可以通过fire运行bug没有问题 您的回调从未被执行的事实表明您的 dojo.query 调用返回一个空数组。你能把你在firebug中看到的dom结构贴上来吗? @Philippe 根据您的要求再次更新,现在我有了一些新发现.. 我认为你应该使用 dojo.query(".element.dojoDndItem", "elements_container").sort(... 【参考方案1】:

排序中的回调没有被调用的原因是你的查询选择器返回一个空数组(因此你没有什么可以排序的)。

请改用以下内容:

dojo.query(".element.dojoDndItem", "elements_container").sort(

请注意,最初您的选择器是“.element .dojoDndItem”,这意味着“查找所有具有类 dojoDndItem 的节点,它们是具有类元素的节点的子节点”。这里两个类都在同一个节点,所以需要去掉空格,让选择器为“.element.dojoDndItem”。

【讨论】:

以上是关于Sort(a,b) 在 Dojo.dnd.source 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

js sort() 数字排序 不太理解

javascript sort方法和比较函数

es6 sort 排序

Sort(a,b) 在 Dojo.dnd.source 中不起作用

JS - Array.prototype.sort(compare)

MATLAB学习七:数组比较sort