• ベストアンサー

jQuery UIでドラッグ制限

my--の回答

  • my--
  • ベストアンサー率89% (91/102)
回答No.1

var Obj = {  startPositionList: [], // ドラッグ開始位置オブジェクト保持配列  overlapJudgment: function(dragElement) {   var dragX = dragElement.offsetLeft;   var dragY = dragElement.offsetTop;   var dragWidth = dragElement.offsetWidth;   var dragHeight = dragElement.offsetHeight;   var dialogElementList = $('.ui-dialog'); // dialog要素リスト   // dialog要素リスト走査   for (var i = 0, l = dialogElementList.length; i < l; i++) {    var targetElement = dialogElementList[i];    if (targetElement === dragElement) continue; // ドラッグ要素は対象外    var left = targetElement.offsetLeft;    var top = targetElement.offsetTop;    var areaX = { min: left - dragWidth, max: left + targetElement.offsetWidth };    var areaY = { min: top - dragHeight, max: top + targetElement.offsetHeight };    // 重なり判定    if (dragX > areaX.min && areaX.max > dragX && dragY > areaY.min && areaY.max > dragY) {     return true;    }   }   return false;  },  makeStopCallback: function(n) {   return function() {    var elem = this.parentNode; // ドラッグ要素    if (Obj.overlapJudgment(elem)) { // 重なり判定     var startPosition = Obj.startPositionList[n];     // ドラッグ開始位置へ戻す     elem.style.left = startPosition.left + 'px';     elem.style.top = startPosition.top + 'px';     //$(elem).animate({ left: startPosition.left + 'px', top: startPosition.top + 'px' });    }   };  },  makeStartCallback: function(n) {   return function() {    var elem = this.parentNode; // ドラッグ要素    Obj.startPositionList[n] = { left: elem.offsetLeft, top: elem.offsetTop }; // ドラッグ開始位置オブジェクト保持   };  } }; $(function() {  $( "#dialog0" ).dialog({   dragStart: Obj.makeStartCallback(0),   dragStop: Obj.makeStopCallback(0)  });  $( "#dialog1" ).dialog({   dragStart: Obj.makeStartCallback(1),   dragStop: Obj.makeStopCallback(1)  });  $( "#dialog2" ).dialog({   dragStart: Obj.makeStartCallback(2),   dragStop: Obj.makeStopCallback(2)  }); }); 動くコード(良し悪しは置いといて)を読んでみるのが早いと思います。 簡単なコメントしか付けてませんけど、読んでみましょう。

sainte
質問者

補足

このままコピーペーストして実行しましたが、意図したように動かないようです。 しかし、プログラムの理論は理解できましたが、私の質問で示したものと違っています。 私はドラッグ終了時に判定したいのではなく、ドラッグ中に判定したいのです。 ただし、ドラッグ中に頂いた例のような動作をさせてもダイアログがちらつくだけです。

関連するQ&A

  • jqueryのUI「dialog」内でPHPの動的

    jqueryのUI「dialog」を使って PHPを表示する画面を作成しました。 この「dialog」内で PHPの動作をさせたい(DB参照や、ページ移動) ですが、「dialog」内で <a href="xxxx.php?id=1">などとすると ページ自体が移動してしまいます。 「dialog」内で動く方法はありませんか?

  • jQuery UIのdraggableについて

    こちらでは初めて質問させていただきます。 よろしくお願いします。 現在、jQuery UI の draggable を使用してWebブラウザ上での ドラッグ&ドロップを実装中なのですが、 期待通りに動作させることが出来ません。 <script></script> …… (1) <html> <head> <script type="text/javascript" src="jQuery/jquery-1.3.2.js"></script> <script type="text/javascript" src="jQuery/jquery-ui-1.7.2/development-bundle/ui/ui.core.js"></script> <script type="text/javascript" src="jQuery/jquery-ui-1.7.2/development-bundle/ui/ui.draggable.js"></script> <style> #a { height:100px; width:300px; overflow:scroll; border:solid 1px Black; } #b { width:60px; height:40px; background:lime; position:absolute; top:10px; left:50px } #c { width:60px; height:40px; background:lime; position:absolute; top:60px; left:50px } </style> <script type="text/javascript"> $j = jQuery.noConflict(); $j(function($) { $('#b').draggable(); }); $j(function($) { $('#c').draggable(); }); </script> </head> <body> <div id="a"> <span id="b">Drag Element1</span> <span id="c">Drag Element2</span> </div> </body> </html> ドラッグ対象は複数存在するため、ドラッグ対象を<div>エリア内で スクロール(必須です)させています。 ドラッグ対象を<div>エリア外にドラッグしたいのですが、 <div>エリア内しかドラッグできません。 ((1)の記述がないと、ドラッグ対象が<div>エリア内でスクロール しませんでした。???) どなたか、よきアドバイスをお願いします。

  • jQueryのUIのDialogでページ遷移

    jQueryのUIのDialogを使用してログイン画面を作成しています。 http://stacktrace.jp/jquery/ui/widgets/dialog.html 何とかjQueryのUIのDialogを使用してログイン画面を表示する事ができましたが... 下記がソースコードです。 $(document).ready(function(){   $("#dialog:ui-dialog").dialog("destroy");   $("#dialog-form").dialog({     autoOpen: false,     height: "auto",     width: 350,     modal: true,     buttons: {       "ログイン": function() {         ↑       ここに記述         ↓       }     }   }); $("#dialog-form").dialog("open"); }); <DIV id="dialog-form" title="ログイン"> <FORM method="post" action="login.php"> <FIELDSET> <LABEL for="username">ユーザ名</LABEL> <INPUT type="text" name="txtUsername" id="username" class="text ui-widget-content ui-corner-all" /> <LABEL for="password">パスワード</LABEL> <INPUT type="password" name="txtPassword" id="password" value="" class="text ui-widget-content ui-corner-all" /> </FIELDSET> </FORM> </DIV> 行いたい事は下記の通りです。 1.各テキストボックスの入力チェック 2.OKの場合はページ遷移(login.php)して  ※login.htmlで入力された値(ユーザ名、パスワード)をlogin.phpに受け渡す。 3.入力エラーの場合はエラーダイアログを表示。  エラーダイアログのOKボタンをクリックして再度、ログイン入力。 箇条書きで申し訳ありませんがどのように記述すればいいのでしょうか。 また上記の処理を実現するのに参考になるサイトがありましたら教えて下さい。 情けないんですがここ1週間、これで悩んでいます。 藁をもつかむ思いで... 些細な事でも何でも構いませんので宜しくお願いします。

  • jQuery UI - Tabs

    jQuery UI - Tabsについて質問です。 jQuery UI - Tabsのrotateを利用して、自動的にタブが切り替わり、アクティブなタブの色が変わるといったプログラムを作成しました。 選択されたタブの色をCSSに直接記述してある時は、自動的にアクティブなタブの色が切り替わるのですが、"選択されたタブ.css("#555555")"というよプログラム上で指定した場合は正しく色が切り替わりません。 プログラム上で色を指定した場合でも、正しく色が切り替わるようにするにはどのようにしたらよいでしょうか。 お分かりの方がいらっしゃいましたら、ご教示願います。

  • jQueryで質問です。

    jQueryで質問です。 オブジェクトA、Bがあるとします。 Aをドラッグすると、mousedownかdragstartの段階で要素がBに置き換わってドラッグさせるような動きは可能でしょうか。 作成中のソースを記載します。 <html> <head> <title>test</title> <script type="text/javascript" src="./jquery.min.js"></script> <script type="text/javascript" src="./ui/jquery.ui.core.js"></script> <script type="text/javascript" src="./ui/jquery.ui.widget.js"></script> <script type="text/javascript" src="./ui/jquery.ui.mouse.js"></script> <script type="text/javascript" src="./ui/jquery.ui.draggable.js"></script> <script type="text/javascript" src="./ui/jquery.ui.droppable.js"></script> <script type="text/javascript"> $(function(){ obj1 = $("#box"); obj2 = $('<div style="width:200px;height:200px;background:red;">B</div>'); obj1 .mousedown( function(){ obj1.replaceWith(obj2); obj2.draggable(); } ); }); </script> </head> <body> <div style="width:200px; height:100px; background: #cccccc;" id="box">A</div> </body> </html> これだと、Aのドラッグを一度解除して、Bをドラッグすると上手くいきますが、1回のモーションでBをドラッグさせたいのです。 宜しくお願いします。

  • なぜjQuery UIを使う時こんなにjsファイルを使うの?

    どうもはじめまして。 早速ですがjQueryについて質問です。 jQuery UIのアコーディオンにしてもtabsにしても、使う時4つも5つもjsファイルを取り込みますよね?これってなぜなんでしょうか? 単純にコピー&ペーストで一つにまとめることってできないのでしょうか? 知っている方いましたらよろしくお願いします。

  • Jqueryのajax処理

    jQuery.ajax()のsuccess時のコールバック関数からの戻り値ってとれないのでしょうか? 2時間ほど調べてみたのですがわかりませんでした^^; もしご存知の方がいらっしゃいましたらご教授していただけると 嬉しいです。^^

  • jauery ui dialog 読み込んだ外部htmlファイル内での

    jauery ui dialog 読み込んだ外部htmlファイル内でのjqueryの実行 お世話になります。 iwatuturuturu と申します。 jqueryで読み込んだ外部htmlファイル内でのjqueryのセレクターを使用した装飾等ができません。 [index.html]にてjqueryのloadを使用し、同じ階層内の[text.html]のファイルを読み、それをjQuery uiを使用したdialogで表示させています。 読み込まれたdialog内の要素に装飾を行ないたいと考えておりますが、下記のソースにあります[$("p").css("background-color", "red");]が読み込まれたタイミングで、[$("p")]が読み込まれていない為か背景色の変更が行えません。(jqueryを使用し、テーブルの行を一行毎に色付けをしたりしたいのでこのような質問にしました。) loadなどで外部ファイルを読み込んで、読み込まれた要素にjqueryによる装飾や操作を行いたい場合はどのようなやり方があるのでしょうか? 【ソース[index.html]】------------------------ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link type="text/css" href="../css/common/jquery-ui-1.8.4.custom.css" rel="stylesheet" /> <script type="text/javascript" src="../js/jquery.js"></script> <script type="text/javascript" src="../js/jquery-ui.js"></script> <script type="text/javascript"> $(function(){ $("button").click(function(){ /* dialogを読み込む領域を作成 */ $("body").append("<div id='dialog_window'></div>"); /* loadで外部htmlファイルの読み込み */ $("div#dialog_window").load("text.html"); /* loadで読み込まれたhtmlファイルをdialogとして表示 */ $("div#dialog_window").dialog({ autoOpen: true, width: 1100, }); /* dialog内の装飾 */ $("p").css("background-color", "red"); }); }); </script> </head> <body> <button>ウィンドウopen</button> </div> </body> </html> 【ソース[text.html]】------------------------ <p>読み込み完了</p> ------------------------------------ よろしくお願いいたします。

  • jQueryのコールバック関数の実行順序について

    いつもお世話になっております。 jQueryのコールバック関数について質問させて下さい。 jQueryの関数には引数としてコールバック関数を取るものがありますが、これらの実行順序で悩んでいます。 実行順序に関して、呼び出し元関数の実行が完了した後にコールバック関数が実行されるという認識で間違いないでしょうか? 以前、実行順序は保証されないという記述を見たのですが、どこで見たのか失念してしまい、再度読み直す事ができないでいます。 以上の事に関してご教授下さい。 宜しくお願い致します。

    • ベストアンサー
    • AJAX
  • IEのドラッグ&ドロップを制限したい

    はじめまして Webを使ったアプリケーションを作成しています。 複数のウインドウを同時表示するのですが互いに対して ドラッグ&ドロップによるURL遷移はできないようにしたいです。 Web内のオブジェクトについては制限をかけましたが タイトルバーの左上のアイコンをドラッグ&ドロップするとショートカットをドロップしてしまうようで遷移をしてしまいます。 これに制限をかけることは可能でしょうか? よろしくお願い致します。 OS及びIEのバージョン WinNT 4.0 SP6a IE 5.5 SP2