#jquery #jquery-plugins #javascript-namespaces
#jquery #jquery-плагины #javascript-пространства имен
Вопрос:
Я новичок в написании плагинов jQuery, поэтому я немного не уверен, как это сделать. Плагин предназначен для отображения меток в виде подсказок внутри текста и ввода пароля. Это довольно просто — в фокусе элемента метка скрыта. Также при загрузке документа он проверяет, автоматически ли браузер заполнил какие-либо формы полей — если да, то метка скрыта. Проблема, с которой я сталкиваюсь, заключается в автозаполнении других полей. Чтобы решить эту проблему, я пытаюсь привязать функцию к событиям onblur и keyup элемента, чтобы выполнять цикл по другим элементам формы и определять, были ли они автоматически завершены.
Вот аннотированный код.
(function( $ ){
$.fn.innerLabels = function( ) {
return this.each(function() {
var $this = $(this);
// Initialise all form elements with class
$this.each(function() {
var lngth = $(this).val().length;
if(lngth > 0){
$(this).parent().children('label').hide();
}else{
$(this).parent().children('label').show();
};
});
// onfocus event - clears label
$this.focus(function() {
$this.parent().children('label').hide();
});
// onblur/keyup event re-enstates label if length of value is zero or hides if autocompleted.
$this.bind("blur keyup",function() {
// check all fields in case of autocomplete <- this is the problem
$(this).each(function() {
var lngth = $(this).val().length;
//alert(lngth);
if(lngth > 0){
$(this).parent().children('label').hide();
}else{
$(this).parent().children('label').show();
};
});
});
});
};
})( jQuery );
Это запускается при выполнении этого.
$(document).ready(function(){
$('.txtbox').innerLabels();
});
.txtbox — это класс, который я добавляю для формирования текстовых полей и полей пароля, в которых я хочу это использовать.
Я думаю, что это проблема области видимости. Последний $ (this).проблема в каждом из них. Вместо того, чтобы выполнять цикл по всем элементам с классом .txtbox, он выполняет цикл по значению входных данных, в которых происходит событие. Я не хочу добавлять имя класса к подключаемому модулю, потому что это добавит дополнительный код и сделает его менее гибким.
Любой совет по этому поводу был бы оценен.
Приветствия
Грег
Ответ №1:
Просто взглянув на ваш код, кажется, что вы пытаетесь снова выполнить код инициализации при размытии. Так ли это? Если это так, преобразуйте этот общий код в функцию и просто вызовите его из вашего обработчика событий:
(function($) {
$.fn.innerLabels = function() {
var $self = this;
var hideElements = function() {
$self.each(function() {
var lngth = $(this).val().length;
if (lngth > 0) {
$(this).parent().children('label').hide();
} else {
$(this).parent().children('label').show();
};
});
};
hideElements();
return $self.focus(function() {
$(this).parent().children("label").hide();
}).bind("blur keyup", hideElements);
};
})(jQuery);
После некоторого рефакторинга я также не увидел необходимости в .each
вызове (в return
инструкции), поскольку назначение обработчиков событий будет работать для каждого элемента в наборе сопоставленных элементов.
Надеюсь, это то, что вам было нужно.
Комментарии:
1. Это именно то, что я искал — спасибо! Я думал, что ему нужен некоторый рефакторинг, но я не думал о том, чтобы просто вызвать одну функцию. Я думаю, это то, что происходит, когда вы начинаете с чего-то, а затем добавляете к этому больше. Изначально это было просто использование
.focus()
andblur()
, но поскольку мы используемkeyup()
, нет необходимости использовать.focus()
Оператор return был просто потому, что я следовал руководству по подключению jQuery и я действительно не знал, что я делаю! 🙂2. @shadylane: Нет проблем! Рад, что смог помочь. Иногда для этого просто требуется вторая пара глаз.
Ответ №2:
В jquery вы можете выбрать братьев и сестер с помощью функции next()
$(this).next()
выберет следующий.
Комментарии:
1. Спасибо, но это было не совсем то, что я искал. Текстовые входные данные вложены в какую-то другую разметку. В событиях ‘keyup ()’ или ‘blur ()’ я хотел, чтобы функция проверяла все элементы формы, чтобы увидеть, были ли какие-либо из них автоматически заполнены. Проверьте ответ Эндрю Уитакера ниже.