コーディングとデバッグのスキルを向上させるための提案
jQueryプラグインはそのように使用されることは想定されていないため、更新されたコード(関数の欠如を解決したoverlaps
)は失敗しています。この種の問題を解決しようとする前に、 jQuery プラグインの作成について読んだり、JavaScript のデバッグについてできる限り読んでみてください。
debugger
ブレークポイントを設定した後 (またはコード内でステートメントを使用した後)、コンソールで次のすべてを実行して、デバッグ機能を開発してみてください。
- 関連するコードを段階的に再生する
- 変数の値を確認する
- スタックトレースをたどる
- コンソールにコマンドを配置して、そのコンテキストでコードがどのように動作するかを確認します
たとえば、この問題を解決するために、コンソールに jQueryを使用しました。
> $(".Assemble_station") // this returned elements with [visibility:hidden] so I tried:
> $(".Assemble_station:visible") // but I got the same results, so I ended up using:
> $(".taskNameItem").remove() // then I checked again:
> $(".Assemble_station") // and now the results are different :)
これらはすべて、コードを変更することなくコンソールで実行されました。したがって、コードがブレークポイントにあるときにコンソールにコマンドを入力することで、本当に多くのことを学ぶことができます。ただし、jsFiddle では、コンソールの下部にあるドロップダウンを使用し<top frame>
て、フレームからフレームに変更することを忘れないでください。result
コード内の実際の問題
jQuery プラグインに変更overlaps
する際の問題は、jQuery プラグインが同時に多くの項目で呼び出される可能性があることです。そのため、プラグインとして適切に動作するように適合させることは困難であり、元のバージョンを使用することをお勧めします.
ただし、元の関数を使用する際の問題は、通常の HTML 要素で機能することですが、要素はそれほど単純ではありません (パーツを非表示にし、コンテナーには位置があり、コンテンツにはサイズがあるため)。getPosition
そのため、内部の関数をハックしてoverlaps
、奇妙な HTML で機能させる必要がありました。
var overlaps = (function () {
function getPositions( elem ) {
var obj = $( elem );
var pos = obj.position();
//HACK: weird HTML force me to use its first child's dimensions
var child = obj.children(":first-child");
var width = child.width();
var height = child.height();
return [ [ pos.left, pos.left + width ], [ pos.top, pos.top + height ] ];
}
overlaps
関数の使用方法に関するこの新しいコードを見てください(2 番目each
の では、firstobj だけでなく、以前のループで既にテスト済みの他のすべてのオブジェクトも、i1 + 1
開始点として使用して削除しました)。
var stations = $('.Assemble_station');
stations.each(function(i1, firstobj) {
stations.slice(i1 + 1).each(function(i2, secondobj) {
if(overlaps(firstobj, secondobj)) {
var obj1 = $(firstobj);
var obj2 = $(secondobj);
var objToMove = obj1.position().left >= obj2.position().left ? obj1 : obj2;
var newTop = objToMove.position().top + 18;
objToMove.css("top", newTop + 'px');
}
});
});
あなたの他の問題は、ページ上のいくつかの要素が を共有していることID
です。要素に id を与える場合、その要素はページ全体でその id を持つ唯一の要素でなければなりません。この基本的な HTML の前提に従わない場合、jQuery は期待どおりに動作しません。タイトルと黄色のバーを (非表示にするのではなく) 削除して (ID でオブジェクトを取得する前に) 修正したので、衝突検出に干渉しません。
完全なソリューション
ここで私の jsFiddle で遊ぶことができます: http://jsfiddle.net/protron/NxWxU/8/