JQuery - набор пользовательских функций
Мне интересно, как связать свои пользовательские функции и поддерживать контекст 'this'.
Пример:
$.fn.foo = function() {
var html = '<div class="foo"></div>';
if ($(this).hasClass(somthing) {
$(this).prepend(html);
}
}
$.fn.bar = function() {
var html = '<h3>bar</h3>';
$(this).find('.foo').prepend(html);
}
$('body').foo().bar();
Когда я пытаюсь использовать этот код, я получаю TypeError: не могу прочитать строку свойств undefined
Ответы
Ответ 1
Вам нужно вернуть текущий контекст элемента, т.е. this
из вашего пользовательского метода.
$.fn.foo = function() {
var html = '<div class="foo"></div>';
if ($(this).hasClass('somthing')) {
$(this).prepend(html);
}
return this; //The magic statement
}
$.fn.bar = function() {
var html = '<h3>bar</h3>';
$(this).find('.foo').prepend(html);
return this; //The magic statement
}
$('body').addClass('somthing').foo().bar();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Ответ 2
Возврат this
:
$.fn.foo = function() {
var html = '<div class="foo"></div>';
if ($(this).hasClass(somthing) {
$(this).prepend(html);
}
return this;
};
$.fn.bar = function() {
var html = '<h3>bar</h3>';
$(this).find('.foo').prepend(html);
return this;
};
$('body').foo().bar();
Ответ 3
Функция расширения jQuery может быть тем, что вы ищете. Это позволяет вам создавать разделенный запятыми список функций, которые вы можете использовать в цепочечных выражениях
jQuery.fn.extend({
check: function() {return this.each(function() { this.checked = true; });} ,
uncheck: function() {return this.each(function() { this.checked = false; });
}})
Использование: это проверяет все флажки:
$( "input[type='checkbox']" ).check();
(пример извлечен из https://api.jquery.com/jquery.fn.extend/)