Skip to content

Instantly share code, notes, and snippets.

@a-ignatov-parc
Created May 12, 2012 04:04
Show Gist options
  • Save a-ignatov-parc/2664063 to your computer and use it in GitHub Desktop.
Save a-ignatov-parc/2664063 to your computer and use it in GitHub Desktop.
$.extend($.Autocompleter.prototype, {
position: function() {
var offset = this.dom.$elem.offset();
this.dom.$results.css({
bottom: Plca.view.partials.$body.height() - offset.top,
left: offset.left
});
},
cloneFunc: function(func) {
var temp = function() {
return func.apply(this, arguments);
};
for (key in func) {
temp[key] = func[key];
}
return temp;
},
createTempFunc: function() {
if (this.tempShowResults && typeof(this.tempShowResults) === 'function') {
return NO;
} else {
this.tempShowResults = this.cloneFunc($.Autocompleter.prototype.showResults);
}
}
});
$.Autocompleter.prototype.createTempFunc();
$.Autocompleter.prototype.showResults = function(results, filter) {
// Вызываем оригинальное отображение
this.tempShowResults(results, filter);
if (this.options.afterShowingResult && typeof(this.options.afterShowingResult) === 'function') {
this.options.afterShowingResult.call(this, results, filter);
}
};
// Метод position нельзя изменять у глобального объекта так как это измененеие не расширяет старый
// функционал, а полностью его заменяет следовательно из-за этого могут возникнуть проблемы с
// элементами где требуется стандартный функционал.
// Такие методы нужно переопределять локально на месте инициализации библиотеки, благо эта
// библиотека такое позволяет делать
//
// Для расширения метода в прототипе объекта с сохранением старого функционала нужно использовать
// самовызывающуюся анонимную функцию с передачей в качестве аргумента ссылки на старый метод
$.Autocompleter.prototype.showResults = (function(fn) {
return function() {
fn.apply(this, arguments); // Вызываем оригинальный метод с передачей в него всех аргументов переданные при вызове нового метода showResults
// typeof сделает проверку на существование метода afterShowingResult, так как если он не будет
// существовать, то вернется "undefined", что уже не попадает под условие равенства с "function"
if (typeof(this.options.afterShowingResult) === 'function') {
this.options.afterShowingResult.apply(this, arguments); // Так же вызываем метод через apply чтоб можно было передать весь список аргументов не заботясь о их количестве или порядке
}
}
})($.Autocompleter.prototype.showResults);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment