Я пытаюсь создать функцию отмены/повтора для jQueryUI .draggable
на данный момент у меня есть функция, но не работает, как ожидают, вот мой несильно:Undo & Redo функция не работает, как ожидают
$(document).ready(function() {
$('.editable').draggable({
stop: stopHandlerDrag,
start: startHandlerDrag
});
});
var historyApp = {
stackStyle: [],
stackId: [],
counter: -1,
add: function(style, id) {
++this.counter;
this.stackStyle[this.counter] = style;
this.stackId[this.counter] = id;
this.doSomethingWith(style, id);
// delete anything forward of the counter
this.stackStyle.splice(this.counter + 1);
},
undo: function() {
--this.counter;
this.doSomethingWith(this.stackStyle[this.counter], this.stackId[this.counter]);
},
redo: function() {
++this.counter;
this.doSomethingWith(this.stackStyle[this.counter], this.stackId[this.counter]);
},
doSomethingWith: function(style, id) {
//Check if make buttons undo/redo disabled or enabled
if (this.counter <= -1) {
$('#undo').addClass('disabled');
$('#redo').removeClass('disabled');
return;
} else {
$('#undo').removeClass('disabled');
}
if (this.counter == this.stackStyle.length) {
$('#redo').addClass('disabled');
$('#undo').removeClass('disabled');
return;
} else {
$('#redo').removeClass('disabled');
}
console.log(style + ' - ' + id);
//Apply history style
$('#' + id).attr('style', style);
console.log(this.counter + ' - ' + this.stackStyle.length);
}
};
//Stop Handler Drag
function stopHandlerDrag(event, ui) {
console.log('stop drag');
var style = $(ui.helper).attr('style');
var id = $(ui.helper).attr('id');
historyApp.add(style, id);
}
//Star Handler Drag
function startHandlerDrag(event, ui) {
console.log('start drag');
var style = $(ui.helper).attr('style');
var id = $(ui.helper).attr('id');
historyApp.add(style, id);
//Dettach all events
$('#' + id).draggable("option", "revert", false);
//reassign stop events
$('#' + id).draggable({
stop: stopHandlerDrag,
start: ''
});
}
//Click Events For Redo and Undo
$(document).on('click', '#redo', function() {
historyApp.redo();
});
$(document).on('click', '#undo', function() {
historyApp.undo();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js"></script>
<span id="undo" class="btn btn-sm btn-success disable">Undo</span>
<span id="redo" class="btn btn-sm btn-danger disable ">Redo</span>
<p id="P1" class="editable" style="left: auto; top:auto;">Drag #1</<p>
<p id="P2" class="editable" style="left: auto; top:auto;">Drag #2</<p>
<p id="P3" class="editable" style="left: auto; top:auto;">Drag #3</<p>
а вот Working code demo
Теперь проблема в том, что, например, если вы запустите мой код и перетаскивать элементы в следующем порядке (Drag # 1, Drag # 2, 3 Drag #) , а затем нажмите на undo
иногда вам придется дважды щелкнуть, а затем, если вы перетащите этот порядок и щелкните по undo
, чтобы восстановить все элементы, как в начале, а затем drag elements #1 and #2 and then click on undo
, вы заметите, что только элемент № 1 вернется к нему так что мой вопрос в том, что я делаю неправильно, и как я могу это решить? Я думаю, что, может быть, мой счетчик неправильно или что-то не так с моим варом historyApp
С этим мне нужно нажать только один раз, чтобы выполнить мою функцию отмены, но другая проблема есть, перетащите элементы в следующем порядке: # 1, # 2, # 3, нажмите кнопку отмены, чтобы поместить элементы в его начало, а затем перетащите элементы # 1 и # 2, а затем нажмите кнопку отмены, вы увидите, что только элемент # 1 перемещен в его место –
@MiguelFlores, я отредактировал функции 'add',' undo' и 'redo 'для лучшей обработки на' counter' в массивах состояний. –