Ваш метод stickyfloat()
предполагает много вещей, например, всегда вызывается для объекта jQuery, который содержит хотя бы один элемент, или у этого элемента всегда есть родительский элемент. Например, рассмотрим следующий код:
var $obj = this;
// ...
var startOffset = $obj.parent().offset().top;
Если объект jQuery, для которого вызывается ваш метод, пуст или если его первый элемент не имеет родителя (метод был вызван $("html")
), код завершится ошибкой, поскольку parent().offset()
будет null
.
Если вы хотите, чтобы ваш метод был более устойчивым, вы не должны предполагать что-либо об объекте, для которого он вызывается. Хороший первый шаг - сделать метод цепным, который всегда будет полезен для ваших пользователей и избавит от первой проблемы. рекомендуемый способ сделать это:
$.fn.stickyfloat = function(options, lockBottom) {
return this.each(function() {
var $obj = $(this);
// The rest of your code.
});
};
Поскольку код теперь выполняется последовательно для каждого элемента (если есть) через анонимную функцию, проверка существования родительского элемента может быть решена путем возврата на раннем этапе:
var $obj = $(this);
var $parent = $obj.parent();
if (!$parent.length) {
return; // No parent, continue with next element, if any.
}
// Parent element is safe to use.
var parentPaddingTop = parseInt($parent.css('padding-top'));
var startOffset = $parent.offset().top;