Работа с checkbox в jQuery

Решение для нетерпеливых:

<script>
$("input:checkbox").attr("checked","checked"); // устанавливает галочку на все checkbox-ы
$("input:checkbox").removeAttr("checked"); // снимает галочку со всех checkbox-ов
</script>


Далее обо всем по порядку.

Еще раз о селекторах

В первую очередь, при работе с checkbox-ами в jQuery нужно составить правильный селектор. Селектор — это выражение по которому jQuery выбирает необходимые dom-элементы для обработки.
Если селектор будет составлен неправильно, то это приведет к тому, что jQuery захватит не те элементы. В результате на странице может получиться полная каша.

Составляем правильный селектор

Для того, чтобы построить правильный селектор нужно внимательно посмотреть на HTML код с помощью которого создаются элементы checkbox:


<input type="checkbox" value="" name="chbx"/>


Из приведенного кода видно, что как таковой checkbox это элемент input со специальным типом "checkbox".

Так как отдельного элемента «checkbox» не существует, то использование jQuery селектора "$('.checkbox')" бессмысленно — на странице попросту нет таких элементов. Использование другого селектора — "$('.input')", так же не дает положительного результата, потому что на странице может быть множество input-ов с различными типами — кнопки, checkbox-ы, скрытые элементы, файлы и т.д.

Поэтому, правильным будет следующий селектор "$('input[type=checkbox]')", или более сокращенный его вариант "$('[type=checkbox]')". В последнем случае мы опустили слово «input», а это значит, что поиск checkbox-ов будет идти по всем элементам присутствующим на странице (слои, ссылки, параграфы и т.д.), что, конечно, негативно скажется на скорости работы jQuery.

Кроме предложенного варианта существует еще один селектор, который так же находит все checkbox-ы: "$('input:checkbox')" или "$(':checkbox')". Опять же обращаю внимание, что во втором случае поиск будет идти по всем элементам страницы, т.е. фактически по селектору "$('*:checkbox')".

Как отметить все элементы checkbox на странице

Имея правильны селектор, теперь можно перейти к тому как jQuery позволяет обработать необходимые элементы. Например, очень часто нужно отметить все элементы checkbox на странцие. Для этого на checkbox нужно добавить атрибут «checked».

Добавление атрибутов на элементы в jQuery делается с помощью специального метода "attr", а удаление с помощью метода "removeAttr". Работу с этими методами демонстрирует следующий пример:


<!DOCTYPE html>
<html>
<head>
  <style>
  textarea { height:25px; }
  </style>
  <script src="/js/jquery.js"></script>
</head>
<body>
	<form>
    <input type="button" value="Элемент Input c типом 'Button'"/>
    <input type="checkbox" />

    <input type="checkbox" />
    <input type="file" />
    <input type="hidden" />

    <input type="image" />
    <input type="password" />
    <input type="radio" />

    <input type="reset" />
    <input type="submit" />
    <input type="text" />

    <select><option>Option<option/></select>
    <textarea></textarea>
    <button>Button</button>
  </form>

  <div>
  </div>
<script>
$("input:checkbox").attr("checked","checked"); // устанавливает галочку на все checkbox-ы
$("input:checkbox").removeAttr("checked"); // снимает галочку со всех checkbox-ов
</script>
</body>
</html>


На этом хотелось бы закончить, но если появились вопросы или дополнения к статье прошу оставлять их в комментариях.
  • 0
  • 5 марта 2010, 20:19
  • admin
  • 2

Для чего нужен jQuery.fn

Каждый кто сталкивался с написанием собственных плагинов на jQuery задавал вопрос — "В чем различие между объявлением функций через jQuery и jQuery.fn?".

Для того, чтобы ответить на поставленный вопрос приведу два примера.

Пример 1.

jQuery.sayHello = function() {
  alert('Привет! Найдено ' + this.length + 'элементов' );
}

$('div').sayHello(); // ничего не происходит


Пример 2.

jQuery.fn.sayHello = function() {
  alert('Привет! Найдено ' + this.length + 'элементов' );
}

$('div').sayHello(); // Выводит "Привет! найдено ХХ элементов", где ХХ - это количество найденных элементов на странице


Если запустить первый пример, то произойдет одно из двух событий — браузер выдаст ошибку (например, если у Вас установлен FireBug) либо не выдаст ничего. А если запустить второй пример, то на экране появится сообщение о количестве найденных элементов.

Прежде чем делать какие-либо выводы, приведу еще один пример:


jQuery.sayHello = function(elem) {
  alert('Привет! Найдено ' + elem.length + 'элементов' );
}

jQuery.sayHello($('div'));


В данном примере, будет выдано сообщение о количестве найденных объектов.

Думаю теперь у нас достаточно информации, чтобы сделать некоторые выводы:

Вывод 1: Если задать функцию через jQuery.fn, то она будет работать с элементами найденными через функцию $(). Контекст этой функции будет содержать выбранные элементы;

Вывод 2: Если задать функцию через jQuery, то к ней можно обратиться только через глобальный объект jQuery. В таком случае контекст функции будет указывать на глобальный объект window.

Таким образом, если нужно написать плагин, который будет работать только с выбранными объектами, то нужно его создавать в jQuery.fn, а если нам неважно какие элементы страницы были выбраны, то лучше создавать функцию через jQuery.

Подводные камни JavaScript или опасное свойство Semicolon insertion.

Я очень люблю язык JavaScript, на мой взгляд его преимущества с лихвой покрывают многочисленные недостатки. Но чтобы писать хорошие программы на этом языке нужно четко понимать какие опасности в нем таятся.

Одна из них заключается в том, что синтаксис JS не требует обязательного использования точки с запятой для разделения конструкций языка, но при этом на этапе выполнения недостающие символы расставляются автоматически.


Данная особенность, упрощает программирование и в простейших случаях не вызывает никаких проблем. Возьмем следующий код:

var a
var b

Во время выполнения он будет преобразован к следующем виду:

var a;
var b;


И это не приведет к негативным последствиям. Но к сожалению ни один язык в мире не способен читать мысли программиста, поэтому в другой ситуации неудачное преобразование может вызвать появление серьезных ошибок.

Для примера возьмем следующий код:

function a() {
return 
	false;
}

Не трудно догадаться, что в данной ситуации программист хотел чтобы функция возвращала значение «false». Но на самом деле она возвращает значение «undefined». И это вполне закономерно, потому что реально исполняется совсем другой код:

function a() {
return ; // Обратите внимание JS сам доставил «недостающий» знак точки с запятой
	false;
}

Самое простое, что можно сделать для избежания проблем с Semicolon insertion — это не разрывать строки на две подстроки. Но и этого будет недостаточно, для написания абсолютно безопасного кода.

Синтаксис JavaScript очень похож на синтаксис языка «Си». Например, для выделения блоков когда в JS как и в «Си» используются фигурные скобки.

Обычно программисты предпочитают один из двух вариантов оформления.

Первый — это когда открывающая фигурная скобка находится на одном уровне с конструкцией к конторой она относится:
function a() {
	return {
		value: false
	}
}

Второй — когда открывающую скобку помещают на уровень ниже

function a() 
{
	return 
	{
		value: false
	}
}

Не трудно догадаться, что для JavaScript второй вариант пригоден не во всех случаях, в примере выше во время выполнения будет получен следующий код:

function a() 
{
	return ;
	value: 
		false;
}

Обратите внимание, что в этом примере не только прибавились «недостающие» знаки, но и исчезли «лишние» символы фигурных скобок. Поэтому, чтобы избежать проблем в JavaScript, лучше не использовать переносы строк перед открывающей фигурной скобкой.

Конечно, сказанное выше описывает далеко не все возможные ситуации когда Semicolon insertion вызовет проблемы при выполнении кода. Поэтому я приглашаю всех дополнить эту статью своими примерами и мыслями используя для этого комментарии.
  • 0
  • 25 января 2010, 07:19
  • admin
  • 1

ExtJS. Создаем дерево на основе JSON Data

С развитием идей RIA (Rich Internet Application) все чаще стали появляться задачи создать не какой-нибудь там веб-сайт, а вполне себе самостоятельное веб-приложение. Хотя насчет веб-приложения, может я и погорячился. Но вот панель управления для какой-либо задачи просят точно. Основой при выполнении подобных заказов служит построение интерфейса (по возможности приятной и дружелюбной наружности). Почему-то закачику глубоко плевать, на красивый во всех отношениях код, а вот на окошечки с менюшечками нет. Ну коли хочется так тому и быть.

Так как я не сторонник изобретать велосипеды, я решил использовать в своих проектах фреймворк ExtJS. Получив при это сразу два плюса: первый — это симпатичный интерфейс, а второй это все тот же симпатичный интерфейс, а так же унификация под один дизайн всех проектов.

Но хватит лирики, давайте разберем какой-нибудь конкретный пример. Первое, что мне очень пригодилось при создании проектов — это возможность строить замечательные древовидные меню средствами ExtJS. Делается все быстро, просто и можно даже сказать изящно.

Задача состоит из двух позадач: первое — это построение графического отображения дерева (часть которой занимает ExtJS), второе — это предоставление данных (часть которой занимается php-скрипт на сервере).

Вот как выглядит первая часть:


myTree = new Ext.tree.TreePanel ({
		width: 225,
		rootVisible:false,
		root: new Ext.tree.AsyncTreeNode({
			expanded: true,
			text: 'Some Tree'
		}),
		dataUrl: '/load_json_data.php'
	});
 



Конечно, пример очень упрощен. Более того, этого всего лишь часть скрипта, которая отвечает за создание дерева. Для реального проекта, этого будет маловато. Но для данной статьи, приведенного примера будет достаточно.

Попытаемся разобраться, что происходит в этом куске кода.

Во-первых, для реализации подобия Namespace на JS используется объект с именем Ext. Все остальные классы являются частью этого объекта. Таким образом разработчики подключая библиотеки ExtJS к своему проекту могут не волноваться, что ExtJS заменит уже существующий класс проекта.

Во-вторых, практически все классы в ExtJS конфигуриуются с помощью конфигурационного объекта, это позволяет создавать классы с очень большим количеством параметров, без узудшения читабельности кода.

Ну а теперь к сути рассматриваемого вопроса. Для создания графического представления дерева служит класс TreePanel (Ext.tree.TreePanel). Который в качестве аргументов принимает следующие параметры (отмечу, что на самом деле параметров гораздо больше):
  • width — ширина панели

  • rootVisible — показывать «корень» дерева или нет

  • root — корень дерева, определяется объектами типа TreeNode. В нашем примере AsyncTreeNode — это асинхронное дерево, которая позволяет дозагрузить «листья» дерева по мере раскрытия его «узлов»

  • dataUrl — адрес по которому запрашивать данные



Теперь о том, как выглядит вторая часть:


		$sampleArr = array( id=>1, 'text'=>"Node 1", leaf=>false, children=>array( array(id=>2, "text"=>"Child 1", leaf=>true), array(id=>3, "text"=>"Child 2", leaf=>true)));
		echo json_encode($sampleArr);



Здесь совсем просто. json_encode переводит PHP-массив в JSON формат. Для того, чтобы ExtJS мог построить отображение дерева массив должен содержать следующие поля:
  • id — идентификатор узла

  • text — отображаемый для узла текст

  • children — потомки узла (каждый потомок — отдельный массив с точно такими же полями)

  • leaf — параметр указаывающий на то является ли данный элемент «листом» дерева

    После совмещения этих двух частей мы получаем замечательное дерево.
  • 0
  • 23 ноября 2009, 07:16
  • admin
  • 3
Оборудование. Продаем сварочные горелки для аргонодуговой сварки.