css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
6 Май
В предыдущих двух статьях мы уже познакомились с базовыми и иерархическими селекторами, узнали многое про базовые фильтры, фильтры контента, visibility-фильтры, фильтры атрибутов, child-фильтры. Теперь заключительная статья, посвященная селекторам jQuery, в которой мы познакомимся с селекторами и фильтрами форм.
возвращает: Array<Element(s)>
Выбираются все элементы input, textarea, select и button.
В приведенном примере выбираются все элементы input.
var allInputs = $(":input");
var formChildren = $("form > *");
$("div").text("Найдено " + allInputs.length +
" элементов input и " +
formChildren.length + " потомков form.")
.css("color", "red");
$("form").submit(function () {
return false;
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа text. См. пример.
var input = $(":text")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=text " + input.length + ".")
.css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа password. См. пример.
var input = $(":password")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=password " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа radio. См. пример.
var input = $(":radio").attr("checked", "checked");
$("div").text("Найдено type=radio " + input.length + ".")
.css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа checkbox. См. пример.
var input = $(":checkbox").attr("checked","checked");
$("div").text("Найдено type=checkbox " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа submit. См. пример.
var input = $(":submit")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=submit " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа image. См. пример.
var input = $(":image")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=image " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа reset. См. пример.
var input = $(":reset")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=reset " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа button. См. пример.
var input = $(":button")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=button " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы input типа file. См. пример.
var input = $(":file")
.css({background:"yellow", border:"3px red solid"});
$("div").text("Найдено type=file " +
input.length + ".").css("color", "red");
$("form").submit(function () { return false; });
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все скрытые элементы или элементы input, имеющие тип «hidden». C этим фильтром мы уже знакомились в разделе Visibility-фильтры. Но поскольку повторение – мать учения, посмотрим на пример еще раз.
// в некоторых браузерах в набор будут включены
//элементы head, title, script и т.д.,
// но как правило набор ограничивается элементом body.
$("span:first").text("Found " +
$(":hidden", document.body).length +
" hidden elements total.");
$("div:hidden").show(3000);
$("span:last").text("Found " +
$("input:hidden").length +
" hidden inputs.");
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы, имеющие активное состояние (enabled). См. пример.
$("input:enabled").val("Этот элемент активен!");
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все элементы, имеющие запрещенное состояние (disabled). См. пример.
$("input:disabled").val("Запрещен к использованию!");
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все отмеченные элементы (checked). См. пример.
function countChecked() {
var n = $("input:checked").length;
$("div").text(n + (n == 1 ? " is" : " are") +
" checked!");
}
countChecked();
$(":checkbox").click(countChecked);
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: Array<Element(s)>
Выбираются все выбранные элементы (selected). В примере при изменении выбора мы получаем текст каждой выбранной опции и записываем его в элемент div.
$("select").change(function () {
var str = "";
$("select option:selected").each(function () {
str += $(this).text() + " ";
});
$("div").text(str);
}).trigger('change');
Откройте пример в отдельном окне и посмотрите исходный код.
Этой статьей мы заканчиваем знакомство с селекторами с jQuery, но в следующих статьях продолжим знакомиться с API этой библиотеки…
Отзывов (24) на «jQuery API: Selectors – селекторы jQuery: селекторы форм и фильтры форм.»
Очень полезный сайт.Единственный в своём роде на котором не одна статья «обо всём», а грамотное расмотрение библиотеки.Спасибо автору.
Будем ждать еще статей.
У меня есть таблица состоящая из 5 столбцов, в последнем столбце чекбоксы. Сверху таблицы кнопка удалить. Смысл я думаю понятен. Я выбираю чекбокс и строка удаляется. Но вот незадача я не могу передать в аякс текст первой ячейки таблицы той строки в котором выбран чекбокс. Я это делаю так
$(«tr.trr input:checked td:first»).each(function() {
f1=$(this).text();
alert(f1); и т.д.
Может кто знает где я допустил ошибку
Ошибка классическая… Я попробую объяснить подробно и понятно. Вот что пишете Вы:
tr.trr input:checked td:first
т.е. сначала в набор попадают все элементы tr, которые имеют класс trr, затем набор уменьшается и в нем остаются только элементы input:checked, а следующим шагом Вы пробуете обратиться к td:first, которых давно в наборе нет, ни одной штуки!
Ниже я приведу пример как будет работать, но это не очень лаконично, зато наглядно демонстрирует «перемещение» по набору элементов jQuery.
$(«#button»).click(function() {
var a1 = $(«tr.trr input:checked»)
.parent()
.parent()
.children(«td:first»)
.text();
alert(a1);
});
Поясняю: сначала так же как и у Вас отбираются отмеченные чекбоксы, которые находятся в строках с классом trr, затем мы должны «подняться» до родителя этого чекбокса (элемента td), потом еще раз «подняться» до родителя элемента td, т.е. до tr и тогда отыскать потомков этой строки, но не всех, а только самого первого.
Этот пример вполне рабочий, но Вашу задачу все-таки лучше решать как-нибудь по-другому. Надеюсь, что сам принцип я смог объяснить подробно…
Спасибо огромное. Теперь я понял принцип.
Вот так с горем пополам доделываю админку своего проекта. Вот только незадача, раньше писал все просто на javascript без всяких библиотек, напрягался с кроссбраузерностью, а теперь с Вашей, а точнее с помощью Вашего сайта начал все переделывать, ну и соответственно есть некоторые непонятки.
Благодарю.
Имеется форма с набором элементов типа:
<form id=»myform»…
…тут разные элементы формы (input, select и т.п.), заверстанные в div-ы…
<div id=»mydiv»…
…тут разные элементы формы (input, select и т.п.), заверстанные в div-ы…
</form…
Далее по событию (к примеру OnChange для <select…) в цикле создаются новые элементы формы (в моем случае группа checkbox-ов) при помощи $(«#mydiv»).append(<»input type=checkbox…. описание<br…»).
Проблема в том, что все эти новые элементы оказываются вне формы и соответственно не отправляются submit-ом формы.
Логически правильно было бы их создавать так $(«#myform»).append(<»input type=checkbox…. описание<br…»). В этом случае все новые чекбоксы становятся детьми формы, но они не видны и не находятся в желаемом <div id=»mydiv»…
Задача в том и заключается, чтобы создать чекбоксы в нужном контейнере и при этом привязать их к форме.
На данный момент решаю извращенным способом через элементы <input type=hidden… дублирующие мои чекбоксы.
Тут скорее дело в том, что те элементы, которые Вы добавляете в DOM по какому-то событию не связаны с событием submit формы, поэтому эти поля не передаются. Либо надо подгружать обработчик события вместе с добавляемыми полями, либо искать немного другое решение. Например, если это возможно, Вашу группу чекбоксов изначально делать скрытой и по событию change для select’а делать ей show().
Есть еще правда плагинчик jQuery Listen, но имхо это не лучшее решение.
Чекбоксы берутся из базы посредством аякса в зависимости от значения в селекте, поэтому предварительно их загружать и скрывать невозможно.
Мое решение, как я уже говорил, через элементы <input type=hidden… дублирующие мои чекбоксы.
Т.е. я в чекбоксах на OnClick вешаю обработчик, который в зависимости от параметра checked либо добавляет путем append к форме hidden-элемент, дублирующий этот чекбокс, либо remove на имеющийся дубликат.
А с событием submit никакой связи не вижу. Т.к. добавленные hidden-ы непосредственно к форме сразу видны форме и отправляются формой без дополнительных вмешательств.
Вот такие неудобства с формами. Как это сделать проще и правильней пока в инете не нашел и сам не придумал. Такое впечатление что эта проблема только у меня существует
Видимо все кто строит формы динамически дальше отправляют их аяксом, а не традиционным способом.
всё-таки не вкурил, как повесить событие на radio
попробовал следующее:
jQuery.fn.extend({
check: function() {
return this.each(function() {
то_что_мне_надо;
});
}
});
на uncheck мне ничего не надо, поэтому убрал этот метод
непонятно, как вызвать дополнение при клике на radio
такое чувство, что тяжело пытаюсь реализовать, и решение где-то на поверхности..
$(':radio').click(function(){ alert('ok!'); });Ну а чтобы что-то выполнять по check/uncheck надо просто получить значение атрибута checked соответствующего radio.
есть форма. подскажите, пожалуйста, как сделать проверку заполнены ли определенные поля или выбраны ли нужные чекбоксы и в зависимости от этого разблокировать или заблокировать кнопку.
по идее, в случае чекбоксов, нужно получать количество отмеченных и если больше 0 то
$(‘#formSubmit’).attr(‘disabled’, »);
в случае текстовых инпутов проверять, отличается ли value от пустого.
Вообще для этого случая есть очень хороший плагин – о нем можно почитать тут:
jQuery Validation – проверка данных в ajax форме
Ну, если по каким-то причинам использование плагина нецелесообразно, тогда Ваша идея в принципе правильна. В случае с чекбоксами можно сделать что-то вроде:
var n = $("#myForm :checkbox:checked").length;связав выполнение этой операции например с кликом по любому чекбоксу формы и выполняя эту проверку при загрузке страницы.
Что касается текстовых инпутов, тоже можно изобразить похожее:
$("#myForm :text").each(function(){ $(this).val(); // значение текущего инпута });т.е. выбираем их, перебираем, для каждого получаем значение… Ну а дальше придумаете, что там и как сделать…
пытаюсь связать показ/скрытие элемента в зависимости от состояния чекбокса в другом элементе. гуглил, много пробовал, успех половинчатый
не понимаю принцип, туплю. прошу помощи
в контейнере #li-1 лежат чекбокс и его лейбл
контейнер #li-2 должен появляться, когда чекбокс отмечен.
$(«#li-1:child»).click(function(){
if ($(«#li-1 input:checked»)) {
$(«#li-2″).slideDown(«fast»);
}
});
при таком коде (ужоснах), если отметить чекбокс, контейнер #li-2 появляется, а вот если добавить что-то вроде
else {
$(«#li-2″).slideUp(«fast»);
}
не работает.
наверное, принцип должен быть иной?
Зачем такие сложные сложности?
$('#li-1 input').click(function(){ if($(this).is(':checked')) { $('#li-2').slideDown(); } else { $('#li-2').slideUp(); } });p.s. под сложностями я подразумевал идентификаторы у элементов li. Наверное можно написать какое-то более общее правило. Просто задумайтесь, что Вы будете делать, когда таких элементов будет не два-три, а хотя бы десяток?
Подскажите как создать динамически несколько полей выбора
Пробовал так:
$(»
12
23
43
456
«).appendTo(«#ser»);
Но что то не создалось ничего
WP «сожрал» часть Вашего кода, но попробую догадаться…
То, что Вы хотите сделать надо было делать примерно так:
$('#ser').append('<em>Методу append передается какой-либо HTML-код в качестве аргумента</em>');в результате в элемент с id=’ser’, после существующего соддержимого будет вставлен элемент em с соответствующим текстом.
Если же содержимое надо заменить, то используйте вместо append() метод html().
Товарищи! Помогите пожалуйста советом. Не могу сообразить и в сети найти ответ на такую штуку. В общем нужно динамически изменить тип input с text на password по событию onFocus. К примеру имеем – Нужно при фокусе сменить тип поля с text на password, чтобы юзер ввел пасс,который будет скрываться звездочками… По onBlur проверить ввел ли пользователь пароль, если нет, то поменять значение атрибута с password на text обратно и вбить value=»Ваш пароль», но это, как говориться, уже дело техники… Вопрос собственно вот в чем – пробовал сделать «в лоб» – .attr(«type», «password») – не прокатывает. Пробовал прямо в HTML – onFocus=»this.type=’password’» – работало везде, кроме поганого IE!!!!!!!! Но прямой вызов не катит, нужно это сделать с JQuery и чтобы кроссбраузерно…. Помогите пож!!!! Оч на Вас надеюсь! Спасибо!!!
Ваш вариант однозначно не прокатит, попробуйте так:
$(«input:text»).focus(function(){
$(this).replaceWith(«<input type=’password’ name=’theField’ />»);
$(«input:password»).focus();
});
т.е. по получению фокуса текстовым инпутом, он заменяется на тип password, а следующей строкой в него фокус передается.
Ну, а по onBlur аналогично…
Понял Вашу мысль… Спасибо большое!!!!!!
Снова трабл =) Теперь не работает blur(). Я по фокусу на импуте делаю replaceWith:
$(”#passw”).focus(function(){
$(this).replaceWith(””);
$(”#passw”).focus();
});
затем:
$(”#passw”).blur(function(){
$(this).replaceWith(””);
});
blur не работает. я так понимаю потому, что мы же новый инпут #passw делаем динамически и блур его не видет. Еще грешил на одинаковый ID в старом инпуте и новом, созданным с помощью replaceWith. Пробовал менять – не прокатило…
В общем задача такая – есть инпут с типом text в котором value=»пароль» Нужно сделать так, чтобы по фокусу на этом инпуте его тип менялся на password, а value на «». При потере фокуса этим инпутом его тип снова менялся на текст, а value=»пароль». Короче хочу сделать форму авторизациия как на яндексе (авторизация в почте слева на странице http://www.yandex.ru).
Чуваки, пожалуйста, если будете писать код, проверьте его у себя сначала…. Заранее благодарю, жду постов!!!
Чуваки, пожалуйста, если будете писать код, проверьте его у себя сначала…. Заранее благодарю, жду постов!!!
Ну, Вы уж прям… Главное не код, а идея…
blur не работает. я так понимаю потому, что мы же новый инпут #passw делаем динамически и блур его не видет.
Правильно понимаете, а я когда писал, запамятовал. live() тут нельзя – он blur не понимает. Значит обработчик надо вешать через bind(). Тогда сработает.
Но радости не принесет – если по blur опять делать replaceWith(), та же фигня будет с новым созданным текстовым инпутом…
Короче – идея моя была плохая наверное…
Можно попробовать проработать идею с одним скрытым инпутом, другим нет, и show/hide им делать. Добавить анимации немножко, чтобы подмена так заметна юзеру не была…
Да, действительно, Вы правы – главное идея… =) Спасибо Gennady, Ваша идея была не плохая, напротив, я немного ее развил и сделал таки, практически то, что описал выше, только еще лучше =) и не такое, как у яндекса…. Еще раз спасибо за помощь, когда все доделаю, обяз покажу, что получилось… =) Всех благ!
Здравствуйте, Геннадий.
Никак не соображу. Требуется по некому событию убрать галку у всех отмеченных checkbox -ов определенного класса. Пробовал разные варианты – но что-то не срабатывает. Подскажите, если не трудно.
$("a").click(function(){ $("input.test:checked").each(function(){ $(this).attr("checked",""); }); return false; });Здесь событие – клик по ссылке. Выбираем все отмеченные input с классом test. Обходим набор с помощью each(callback) для того, чтобы выполнять некоторые действия в контексте каждого элемента. Ну, а действие это – с атрибутом checked.
Обсуждение статьи можно продолжить на форуме jQuery.