В jQuery, как вернуть перетаскиваемый вызов ajax call?
Я хочу, чтобы draggable возвращался в исходное положение, если вызов ajax при удалении возвращает сбой. Вот код, который я представляю себе. Это нормально, если перетаскиваемый объект лежит в droppable, пока выполняется вызов ajax...
<script type="text/javascript">
jQuery(document).ready($){
$("#dragMe").draggable();
$("#dropHere").droppable({
drop: function(){
// make ajax call here. check if it returns success.
// make draggable to return to its old position on failure.
}
});
}
</script>
<div id="dragMe">DragMe</div>
<div id="dropHere">DropHere</div>
Ответы
Ответ 1
Спасибо за ваш повтор @Fran Verona.
Я решил это так:
<script type="text/javascript">
jQuery(document).ready($){
$("#dragMe").draggable({
start: function(){
$(this).data("origPosition",$(this).position());
}
});
$("#dropHere").droppable({
drop: function(){
//make ajax call or whatever validation here. check if it returns success.
//returns result = true/false for success/failure;
if(!result){ //failed
ui.draggable.animate(ui.draggable.data().origPosition,"slow");
return;
}
//handling for success..
}
});
}
</script>
<div id="dragMe">DragMe</div>
<div id="dropHere">DropHere</div>
Требуется избежать любых новых глобальных переменных, а также количество переменных было непредсказуемым, так как многие перетаскивания могут произойти во время первого, т.е. до того, как 1-й вызов вернется.!
BTW, для тех, кто ищет тот же ответ, . Data() не работает на всех элементах, я не уверен в jQuery.data(), хотя..
Дай мне знать, если кто-нибудь найдет в этом что-то неправильное!:)
Ответ 2
Я смотрел в сети по тому же перетаскиваемому вопросу сегодня утром.
Решение NikhilWanpal работает, но иногда позиция возврата неверна в моем случае, возможно, потому что мои перетаскиваемые элементы содержатся в прокручиваемом контейнере.
Я нашел эту статью, в которой объясняется, как реализовать очень полезную недокументированную функцию: jQuery UI Draggable Revert Callback.
Проверьте свой ответ в этом обратном вызове (если это возможно для вас) и верните "ИСТИНА" для отмены или "FASLE" для подтверждения новой позиции.
$(".peg").draggable(
{
revert: function(socketObj)
{
//if false then no socket object drop occurred.
if(socketObj === false)
{
//revert the peg by returning true
return true;
}
else
{
//socket object was returned,
//we can perform additional checks here if we like
//alert(socketObj.attr('id')); would work fine
//return false so that the peg does not revert
return false;
}
},
snap: '.socketInner',
snapMode: 'inner',
snapTolerance: 35,
distance: 8,
stack: { group: 'pegs', min:50 },
stop: function()
{
draggedOutOfSocket = false;
alert('stop');
}
} );
Хороший день
Ответ 3
Если вы не используете друг друга с левым или верхним позиционированием на перетаскиваемых элементах, это так же просто, как сброс этих свойств css после выключения ошибки ajax:
drop_elems.droppable({
drop: function(event, ui) {
$.ajax(url, {
error: function(x, t, e) {
ui.draggable.css({top: 0, left: 0});
},
});
}
});
Ответ 4
Попробуйте сохранить исходную позицию, прежде чем приступать к ее перетаскиванию и восстановлению, если сбрасываются капли. Вы можете сохранить исходное положение следующим образом:
var dragposition = '';
$('#divdrag').draggable({
// options...
start: function(event,ui){
dragposition = ui.position;
}
});
$("#dropHere").droppable({
drop: function(){
$.ajax({
url: 'myurl.php',
data: 'html',
async: true,
error: function(){
$('#divdrag').css({
'left': dragposition.left,
'top': dragposition.top
});
}
});
}
});
Ответ 5
Reset так. он позволяет анимировать свойство top и left в исходное положение
$("#dropHere").droppable({
drop: function(){
if(!result){ //failed
ui.draggable.animate(ui.draggable.data("ui-draggable").originalPosition,"slow");
}
else{ //instructions for success}
}
});