Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с Drag&Drop для новых eлементов (https://javascript.ru/forum/misc/21173-pomogite-s-drag-drop-dlya-novykh-elementov.html)

ansi19 31.08.2011 14:14

Помогите с Drag&Drop для новых eлементов
 
У меня есть два Span блока, куда я перетаскиваю текст. Кнопка Add добавляет новые Span блоки, но в них не удается перетаскивать текст. Помогите понять почему не работает Drag&Drop для новых блоков.
Первый файл jsp:
<script type="text/javascript" src="../js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="../js/jquery-ui-1.8.custom.min.js"></script>
<script type="text/javascript" src="../js/init.js"></script> 
 
<style>
.textBlock {
        color: white;
        font-weight: bold;
        background-color: #0F3764;
        border-bottom: 2px solid #0F3764;
        border: solid 1px #cecece;
        width: auto;
        position: static;
        margin: 1px 2px 1px 2px;
        padding: auto;
        text-align: center;
}
.folgt {
        border: 2px solid #0F3764;
        margin: 1px 2px 1px 2px;
        padding: auto;
        height: 20px;
        width: 130;
        background-color: #rrr;
        text-align: center;
}
.dropHere {
        background-color: #000000;
}
 
</style>
 
<span class="textBlock">Text1</span>
<span class="textBlock">Text2</span>
<span class="textBlock">Text3</span>
<span class="textBlock">Text4</span>
 
  <script language="JavaScript" type="text/javascript">
     var textId = 2;
 
     function addInput(btn)
     {
          var container = btn.parentElement;
          var div = document.createElement("div");         
          div.id = "div" + textId;         
          var first = document.createElement("<span class=\"folgt\">" + textId + "</span>");
          var middle = document.createElement("<span class=\"folgt\">" + textId + "</span>");         
          var btn = document.createElement("INPUT");
 
          btn.type = "button";
          btn.value = "Delete";
          btn.onclick = new Function("document.getElementById(\"" + div.id + "\").removeNode(true);");
 
          div.appendChild(first);
          div.appendChild(middle);
         
 
          div.innerHTML += "&nbsp;";
          div.appendChild(btn);
          container.appendChild(div);
          textId++;
     }
     
     </script>
     
     <form action="page2.jsp" method="POST">
          <span class="folgt"></span><span class="folgt"></span> 
            <input type="button" value="Add" onclick="addInput(this);">
            <br />
            
     </form>

--------------------------------------------
для перетаскивания я использую плагин jQuery
---------------------------------------------

$(function() {
        $( '.drag' ).draggable({ helper:'clone' });
    $('.textBlock').draggable({
        helper:'clone'
    });
 
    $('.folgt').droppable({
        hoverClass: 'dropHere'
        ,drop: function(event, ui) {
            $(this).append($( '<span>' +  ui.draggable.html()+ '</span>'));
        }
    });
 
});

Подскажите, что я не так делаю?:help:

ваый 31.08.2011 16:11

http://stackoverflow.com/questions/1...ng-live-events
решение в первом ответе, и в последующих тоже.

ansi19 31.08.2011 18:20

А можно немного подробней, я не очень хорошо владею английским. Как мне код
(function ($) {
	   $.fn.liveDraggable = function (opts) {
	      this.live("mouseover", function() {
	         if (!$(this).data("init")) {
	            $(this).data("init", true).draggable(opts);
	         }
	      });
	   };
	}(jQuery));

адаптировать под свой пример.

ваый 31.08.2011 18:26

Вместо $element.draggable использовать liveDraggable

ansi19 31.08.2011 18:34

пробовала, все равно не работает :(

ваый 31.08.2011 19:18

Я только что проверил: работает. Что-то не так делаете. Показывайте код.

ansi19 31.08.2011 19:49

я заменяю Draggable на liveDraggable, вот код:
(function ($) { 
	$.fn.liveDraggable = function (opts) { 
		this.live("mousemove", function() { 
			$(this).draggable(opts); 
			}); 
		}; 
		}(jQuery));

$(function() {
	$( '.drag' ).liveDraggable({ helper:'clone' });
    $('.textBlock').liveDraggable({
        helper:'clone'
    });
    $('.folgt').droppable({
        hoverClass: 'dropHere'
        ,drop: function(event, ui) {
            $(this).append($( '<span>' +  ui.draggable.html()+ '</span>'));
        }
    });
});

для первых элементов срабатывает, для тех что появляются после нажатия кнопки, нет.

ваый 31.08.2011 23:47

А стоп, я невнимателен. У вас же нужно чтобы live вешались на droppable, а не draggable. Чего молчите?
Два варианта.

1. По аналогии использовать liveDroppable:
$.fn.liveDroppable = function (opts) {
    this.live("mouseenter", function() {
        if (!$(this).data("init")) {
            $(this).data("init", true).droppable(opts);
        }
    });
};

2. После того, как вы создаете новые span, вызывайте для них опять инициализацию droppable:
$('.folgt').droppable({
    hoverClass: 'dropHere',
    drop: function(event, ui) {
        $(this).append($( '<span>' +  ui.draggable.html()+ '</span>'));
    }
});

ansi19 01.09.2011 12:44

Спасибо за помощь! я сделала вот так:
(function ($) { 
	$.fn.liveDroppable = function (opts) { 
		this.live("mousemove", function() { 
			$(this).droppable(opts); 
			}); 
		}; 
		}(jQuery));

$(function() {
	$( '.drag' ).draggable({ helper:'clone' });
    $('.textBlock').draggable({
        helper:'clone'
    });
    $('.folgt').liveDroppable({
        hoverClass: 'dropHere'
        ,drop: function(event, ui) {
            $(this).append($( '<span>' +  ui.draggable.html()+ '</span>'));
        }
    });
});

Но проблема теперь в том, что все перетаскивается со второй попытки, может подскажите, что дает такую задержку. :-?


Часовой пояс GMT +3, время: 02:57.