1

Safari で dom の並べ替えを使用すると問題が発生します。基本的に dom アイテムは移動しません。注文は Chrome と Firefox で機能します。私の唯一の問題は Safari です。これは私が使用しているコードです:

var hovered = d3.select(this)[0][0]['__data__']['properties']['name'];
g.selectAll("path").sort(function(a, b) {
  return (a.properties.name == hovered ? 1 : 0);;
});

これを使用しているのは、コードの後半で、ホバーされたパスでスケーリングを行っているためです。dom ツリーで最後でない場合は、その後にあるパスの背後に表示されます。

この問題に関するヘルプは素晴らしいでしょう。

4

1 に答える 1

2

問題は、 Array.sortの有効なコンパレーターを実装していないことです。コンパレータは、 a がbの前にある場合は 0 未満の数値を返し、 a がbの後にある場合は 0 より大きい数値を返し、 abの相対的な順序を気にしない場合は0 を返す必要があります。

ホバーした名前を前面に移動する場合は、次のようなものが必要です。

function order(a, b) {
  return (a.properties.name == hovered) - (b.properties.name == hovered);
}

Safari と Firefox で順序付けが機能する理由は、コンパレーターが 0 を返したときに順序を保持して、安定した並べ替えアルゴリズムを使用しているためです。ブラウザ固有の動作。(本当に安定した並べ替えが必要な場合は、それをコンパレーターに組み込むことができますが、前の順序をキャッシュする必要があります。)

とはいえ、すべての要素を並べ替えるよりも、ホバー時に特定のノードを前面に移動する方が高速です。

path.on("mouseover", function() {
  this.parentNode.appendChild(this);
});

これを頻繁に行う場合は、 moveToFrontメソッドを定義することもできます。

于 2013-04-23T15:42:36.933 に答える