Я - исправление обезьяны некоторые Перемещаемые code* jQuery.
Цель состоит в том, чтобы не изменять файлы первоисточника и исправить динамично одну из внутренних функций.
Функция _generatePosition
объявляется как это:
(function($) {
$.widget("ui.draggable", $.ui.mouse, {
...
_generatePosition: function(event) {
...
}
}
})(jQuery);
Действительно ли возможно достигнуть динамической замены его?
*Таким образом, это вычисляет привязывающуюся сетку относительно вершины родительского элемента а не относительно вершины перетаскиваемого элемента. Посмотрите здесь для получения дополнительной информации.
Вы можете управлять отдельными экземплярами:
.draggable().data("draggable")._generatePosition = function() {};
Или изменять прототип, влияя на все экземпляры:
$.ui.draggable.prototype._generatePosition = function() {};
Отредактируйте комментарии ниже: Кажется, вы можете редактировать их (после последней перезаписи виджета), но я бы все равно держался подальше. Вот пример базового метода , вы можете изменить оттуда, если хотите, но имейте в виду, что может и, вероятно, сломает в будущем выпуске. Также никакие «наследники» виджета не получат эти изменения, не уверен, что это проблема.
Что касается причины, отказ в доступе на самом деле не является причиной (не в данном случае). В таких случаях с библиотекой лучше быть чистым, чем отказывать вам в доступе, или , потому что библиотека может захотеть изменить архитектуру позже, и все равно сломать как можно меньше людей, когда они это сделают ... позволяя вам только доступ к «общедоступным» членам своего кода дает авторам большую гибкость в изменении всего, что «частное».
Показательный пример: jQuery UI 1.8 переместил большой объем кода в служебную программу position , что позволило очистить частный код, чего вы не видели, поскольку все это было частным до того, как это позволило довольно большая оптимизация / сокращение кода, не ломая людей налево и направо.
Вы можете изменить их, но только на основе каждого элемента, насколько я знаю. Но вы можете легко создать свою собственную обертку $.fn.draggable, и просто вызвать оригинальную обертку и выполнить следующее: draggableElement.data('draggable')._generatePosition = fn
$.ui.draggable.prototype._generatePosition = fn