Я не думаю, что это на самом деле ваша проблема, но похоже, что вы делаете дополнительный вызов метода для регистра и check_ allowable_moves
return {
register_map: function(ob) { map = ob; },
register_piece: function(ob) {
ob.config.tracker = this;
register_draggable(ob);
},
register_draggable: function(ob) { register_draggable(ob); },
check_allowable_moves: function(location, jqPiece, ob) { check_allowable_moves(location, jqPiece, ob); }
}
можно сократить до
return {
register_map: function(ob) { map = ob; },
register_piece: function(ob) {
ob.config.tracker = this;
register_draggable(ob);
},
register_draggable: register_draggable,
check_allowable_moves: check_allowable_moves
}
Также
Вы делаете двойной поиск здесь:
function remove_allowable_moves() {
$('.allowable').droppable('destroy');
$('.allowable').removeClass('allowable');
}
должно быть
function remove_allowable_moves() {
$('.allowable').droppable('destroy')
.removeClass('allowable');
}
Также
Какова цель синтаксического анализа и int в float? Сними parseFloat.
var x = parseInt(locs[1]);
var y = parseInt(locs[2]);
var x_min = parseFloat(x)-2;
var y_min = parseFloat(y)-2;
Наконец
Почему вы перерегистрируетесь как перетаскиваемый по капле? Это может быть причиной, если вы зарегистрировали перетаскиваемый объект несколько раз и уничтожили его только один раз.
jqCell.droppable({ accept: '#'+jqPiece.attr('id'),
drop: function(ev, ui) {
ob.config.jqLocation = $(this);
register_draggable(ob); // why this?
}
});
Другие мысли
Еще одна вещь, которую я не знаю, поможет ли это вашей производительности, но это может очистить ваш код. селектор jquery допускает запятые вместо
$('#coord-1-1').doStuff();
$('#coord-1-2').doStuff();
$('#coord-1-3').doStuff();
вы могли бы сделать
$('#coord-1-1, #coord-1-2, #coord-1-3').doStuff();
так что ваш цикл будет связан только с генерацией строки селектора, и тогда вы сможете выполнить свою операцию над всем множеством.
ИМО чище инициат
вместо
var map = new Map('content');
var piece1 = new Piece(map);
var piece2 = new Piece(map);
var tracker = new Tracker;
tracker.register_map(map);
map.render();
piece1.render('coord-4-4', '1');
piece2.render('coord-1-1', '2');
tracker.register_piece(piece1);
tracker.register_piece(piece2);
Хотелось бы увидеть
$(document).ready(function() {
$('#content').MapGame({
pieces : { '1' : 'coord-4-4', '2' : 'coord-1-1' }
});
});
Теперь реализация этого является продолжением того, что у вас есть сейчас, но при создании компонента для jQuery мне нравится начинать с простого init и работать с ним. Вот одна из главных целей jQuery - спрятать все ненужные вещи от пользователя и просто позволить им раскрутиться и легко скопировать ваш плагин.