Для тех, кто интересуется jQuery будет интересно читать эту статью. Потому что jquery наиболее удобен при написании веб приложений, быстро изучаем, не говоря о количистве плагинов и виджитов содержащихся на официальном сайте, которые может приспособить к своему сайту даже неопытный пользователь интерента и не говоря об эффектах jquery. В этой статье мы остановимся не на простых функциях jquery, а на наиболее труднопонимаемых функциях jquery, которые будут разъясняться на примерах взаимодействия со структурой DOM.
Вышла новая статья - jQuery - самое нужное! C неё начнётся новый цикл статей о самом нужном в jQuery. Советую почитать -
jQuery - самое нужное!. jQuery меню, данные с twitter.com и многое другое Вы найдёте в новой статье!
Начнём с самого простого. В некоторых случаях разработчику необходимо использовать элементы форм наиболее продвинутыми способами, например, когда необходимо создать возможность пользователю отмечать не один элемент checkbox, а несколько или сразу все. Для этого замечательно подходит jquery, в качестве примера можно взять следующий вариант jquery кода.
"HTML"
<button id="all">Нажмите</button><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
"CSS"
p { margin: 8px; font-size:12px; }
Как видно из этого несложного примера, с помощью одного события click() мы отмечаем сразу все элементы chekbox.
Однако данный вариант лишь упрощенная копия того что мы хотели добится, ведь возможен вариант когда пользователь понажимает по элементам, и тогда наша фунция для тех элементов checkbox, которые были отмечены становится бессмыслена, потому что для них так же будет запущено событие click() и следовательно они не будут отмечены, а наоборот будут выключены. Как же избежать этого? С помощью простого кода, опять же на jquery.
"HTML"
<button id="all">Нажмите</button><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
<input type="checkbox" id="calend"><br/>
"CSS"
p { margin: 8px; font-size:12px; }
На этом пример jquery с checkboxami, я думаю, можно завершить и перейти к следующему не менее интересному примеру проверки русских букв в поле формы предназначенном для ввода пароля.
В общем, сделаем так же как у Yandex, когда при вводе в поле запрещенных символов выводится сообщение об ошибке, только лишь с меньшими издержками за счёт jquery.
"HTML"
<input type="password" id="all">
"CSS"
p { margin: 8px; font-size:12px; }
Я думаю ни чего сложного, но полезно для поля формы password.
Теперь после небольших примеров jquery для начинающих, перейдём к более сложным вещам. Как и для большинства веб программистов ajax для меня одно из замечательных средств для построения эффективной структуры сайта и обеспечения пользовательского взаимодействия.
И как всегда jquery помогает мне в этом. Функции jquery связанные с ajax, на мой взгляд наиболее хорошо продуманы со стороны разработчиков. К примеру есть простейшие примеры ajax функций, осущетсвляющих запрсы к серверу, например load(), есть и сложные функции, например $.ajax(). Простые пригодятся для повседневной работы и небольших эффектов на сайте, сложные подойдут для осущетсвления нескольких запросов, с различным количестовм настроек. Для того чтобы быть более понятным посмотрите простейший пример с импользованием фунции load().
"jQuery"
$("#load1").click(function(){
$("#response").load("primer/2.php", { 'choices[]': ["Jon", "Susan"] },function(text){alert(text);});
});
$("#load2").click(function(){
$("#response").load("primer/2.php #hello2");
});
"HTML"
<button id="load1">Нажмите</button>
<button id="load2">Нажмите</button>
<div id="response">Jquery примеры<div>
"CSS"
p {font-color: #000;}
"PHP"
<?php
header('Content-Type: text/html; charset=utf-8;');
$fp = fopen("text.txt","w");
$fw = fwrite($fp,$_POST['choices']['1']);
fclose($fp);
$arr = array ('name'=>name);
echo json_encode($arr);
echo '<p id="hello2">hello2</p>';
?>
Здесь первая функция load() отправляет запрос к странице 2.php c массивом. И получает обратно ответ от сервера (function(text){alert(text);}).
Вторая функция делает то же самое но с разницей лишь в том, что фильтрует ответ по id элемента, в результате чего в качетстве ответа мы получим содержание элемента id которого hello2. Сохранить ответ от сервера в переменной можно следующим способом, например, var post = $.post("load.php").responseText;
Но как уже говорилось выше данной функции достаточно лишь для простых случаев, в тех случаях когда Вам требуется выполнять функции, в зависимости от того на каком этапе находистя запрос, необходимо использвать функцию $.ajax() вместе с функцией $.ajaxSetup(). Первая выполняет запрос, вторая устанавливает настройки, параметры запроса(ов) глобально.
Пример выполнения функции $ajax на основе двух запросов и использовании глобальных настроек jQuery.ajaxSetup().
"jQuery"
jQuery.ajaxSetup({
url: "2.php", global: false });
$("#load1").click(function(){
$.ajax({ type: "POST",
dataType: "json",
data: "name=John&location=Boston",
success: function(msg){
$("#load").replaceWith('<div id="load">' + msg.name + 'Первый запрос jquery</div>');
$("#load").fadeOut("slow");
}
});
$.ajax({ async: false,
success: function(){
$("#load2").replaceWith('<div id="load2">Второй запрос jquery</div>');
$("#load2").fadeOut("slow");
}
});
});
"HTML"
<body>
<button id="load1">Нажмите</button>
<div id="load">Jquery примеры</div>
<div id="load2">Jquery примеры</div>
</body>
"CSS"
p { margin: 8px; font-size:12px; }
Отойдём от ajax и перейдём к менее сложным задачам. Зачем нужна функция clone() и как её использовать? Не всегда понятно зачем нужна фунцкия clone(), но в результате её выполянения Вы можете получить коипю элемента или объекта. Примеры: в первом пример с помощью фунции clone() мы сохраняем элемент в перменную clone, а во втором примере мы сохраняем и копируем элемент без использования переменной.
"HTML"
<button id="load1">Нажмите</button>
<div id="load2">Применяем функцию clone()</div>
"CSS"
p {font-color: #000;}
"HTML"
<button id="load1">Функция clone()</button>
<div id="load2">Применяем функцию clone()</div>
"CSS"
p {font-color: #000;}
Надеюся теперь ни у кого вопросов не возникнет при использовании функции clone().
После того как Ваш мозг отдохнул от этого легкого примера перейдём к сложному. А именно к постраничному выводу на jquery и php и mysql. Сразу оговорюсь, что этот пример не полностью аналог обчного потсраничного вывода. Он лишь основа для разработки более серьзных вещей. Но в качестве основы и примера вполне пригодится.
В этом примере находит место применение всего того о чём мы говорили ранее о фунцкии ajax(), здесь их с избытком.
"jQuery"
$.ajax({ url: "primer/colvo.php",
global: false,
beforeSend: function(){
$("#load").fadeIn();
},
complete: function(){
$("#load").fadeOut();
},
dataType: "json",
success: function (data){
$("#col").attr("title",""+data.name+""); max = Math.ceil(data.name/2);
var page = backpage = $("#buttonnext").attr("title");$("#buttonback").css({"display":"none"});
$("#buttonback").attr({title:backpage}); $("#buttonnext").attr({title:page});
for( i=1; i <= max; i++ )
{
$("#buttonnext")
.before("<span style='float:left;cursor:pointer;' id=" + i + " class='numeric'>" + i + "</span>");
}
$("#1").css("color","red");
$.ajax({ url: "primer/novosti.php",
global: false,
type: "POST",
beforeSend: function(){ $("#novosti").fadeOut();
},
complete: function(){ $("#novosti").fadeIn();
},
data: ({col: page}), dataType: "html",
success: function (data){ $("#novosti").html('');
$("#novosti").html(data).fadeIn("slow"); }
});
}
});
$('.numeric').live("click",function(){ var numeric = $(this).attr("id");
$(".numeric").css("color","#000"); $("#"+numeric).css("color","red"); var data = $("#col").attr("title");
max = Math.ceil(data/2);
if(data <= 2){return false}
var page = numeric;
var backpage = numeric-1; $("#buttonback").css({"display":"block"});
$("#buttonback").attr({title:backpage});
if(page == max)
{$("#buttonnext").css({"display":"none"});} else {$("#buttonnext").css({"display":"block"});}
if(page == 1) {$("#buttonback").css({"display":"none"});
$("#buttonnext").css({"display":"block"});} $("#buttonnext").attr({title:page}); $.ajax({
url: "primer/novosti.php",
global: false,
type: "POST",
beforeSend: function(){
$("#novosti").fadeOut(); },
complete: function(){
$("#novosti").fadeIn(); },
data: ({col: numeric}), dataType: "html",
success: function (data){
$("#novosti").html('');
$("#novosti").html(data).fadeIn("slow"); }
});
});
$('#buttonnext').click(function(){ var data = $("#col").attr("title");
max = Math.ceil(data/2);
if(data <= 2){return false}
var page = $("#buttonnext").attr("title");
if(page < max) {++page;} $(".numeric").css("color","#000"); $("#"+page).css("color","red"); var backpage = $("#buttonnext").attr("title"); $("#buttonback").css({"display":"block"});
$("#buttonback").attr({title:backpage});
if(page == max) {$("#buttonnext").css({"display":"none"});}
$("#buttonnext").attr({title:page}); $.ajax({
url: "primer/novosti.php",
global: false,
type: "POST",
beforeSend: function(){
$("#novosti").fadeOut(); },
complete: function(){
$("#novosti").fadeIn(); },
data: ({col: page}), dataType: "html",
success: function (data){
$("#novosti").html('');
$("#novosti").html(data).fadeIn("slow"); }
});
});
$('#buttonback').click(function(){ var data = $("#col").attr("title");
max = Math.ceil(data/2);
if(data <= 2){return false} var page = $("#buttonnext").attr("title")-1;
$(".numeric").css("color","#000"); $("#"+page).css("color","red"); if(page == 1) {$("#buttonback").css({"display":"none"}); $("#buttonnext").css({"display":"block"});} if(page > 1) {$("#buttonback").css({"display":"block"}); $("#buttonnext").css({"display":"block"});}
$("#buttonnext").attr({title:page});
$.ajax({ url: "primer/novosti.php",
global: false,
type: "POST",
beforeSend: function(){ $("#novosti").fadeOut();
},
complete: function(){
$("#novosti").fadeIn(); },
data: ({col: page}),
dataType: "html",
success: function (data){
$("#novosti").html('');
$("#novosti").html(data).fadeIn("slow"); }
});
});
"HTML"
<span id="col" title="1" />
<table><tr>
<td><div title="1" class = "back" id = "buttonback" ><img class="png" src="../../img/6.png"></div>
<td><div title="1" class = "next" id = "buttonnext" style="float:left;"><img class="png" src="../../img/5.png"></div>
<td><div id = "info"></div>
<td><div id="load"><img src="../../img/load.gif"></div>
</table>
<div id="cont">
<div title="2" id="novosti"></div>
</div>
"CSS"
p {font-color: #000;}
Хотелось бы сказать что это всё но нет, мы забыли про php и mysql. Это вторая составляющая нашего потсраничного вывода на jquery и она не менее интересна.
Первый скрипт, определяющий количество новостей выглядит следующим образом.
"PHP"
<?php
$offset = 15 * 21600;
header('Expires:'.gmdate('D,d M Y H:i:s', time() + $offset).'GMT');
header('Cache-control:public, max-age=3600');
header('Contetnt-type: text/xml; charset=UTF-8;');
$connection = mysql_connect ("localhost", "USER", "PASS")
or die ("Ошибка соединения с сервером");
$db = mysql_select_db ("BD", $connection)
or die ("Ошибка при выборе базы данных");
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
$sql = "SELECT * FROM `novosti1`";
$result = mysql_query ($sql);
$query=mysql_num_rows($result);
if($query!==0){
echo json_encode(array("name"=>"$query"));
}
else
{
echo '0';
}
mysql_close($connection);
?>
Второй скрипт, ответственный за вывод новостей следующий.
"PHP"
<?php
$offset = 15 * 21600;
$page = $_POST['col'];
$perpage = 2;
$start_pos = ($page - 1) * $perpage;
$time=date( 'My', time() );
$connection = mysql_connect ("localhost", "USER", "PASS")
or die ("Ошибка соединения с сервером");
$db = mysql_select_db ("BD", $connection)
or die ("Ошибка при выборе базы данных");
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
$sql = "SELECT * FROM `novosti1` LIMIT $start_pos ,$perpage";
$result = mysql_query ($sql);
$query=mysql_num_rows($result);
header('Expires:'.gmdate('D,d M Y H:i:s', time() + $offset).'GMT');
header('Cache-control:public, max-age=3600');
header('Contetnt-type: text/xml; charset=UTF-8;');
echo "<table class=cont align=center width=100%><tr>";
while ($res=mysql_fetch_array($result))
{
echo "<td width=70px class=cont valign=top ><img border=0 align=left src="primer/$res[si]">";
echo "<td width=40% class=cont align=justify border=0>".$res['name'].'<br>';
echo $res['opisanie'];
echo "<td>";
}
echo "</table>";
mysql_close($connection);
?>
Теперь можно сказать что это всё. Правда я забыл вам передать таблицу mysql. Вот она.
"SQL"
CREATE TABLE IF NOT EXISTS `novosti` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`name` text,
`opisanie` text,
`avtor` text,
`novost` text NOT NULL,
`count` int(255) NOT NULL,
`time` varchar(255) NOT NULL,
`arhiv` varchar(255) NOT NULL,
`si` varchar(255) NOT NULL,
`bi` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `statia` (`novost`,`name`,`avtor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
Вообще Вы можете её скачать уже заполненной (zip Архив).
Теперь можно сказать всё с постраничным выводом на jquery и php + mysql.
На некоторых сайтах авторы рекомендуют использовать целые плагины для получения данных полей формы, хотя в этом нет надобности, так jquery обладает собственными функциями позволяющими получить данные полей формы. Например функция serialize() вполне сгодится для этих целей. В следующем примере мы спомощью функции serialize() получим данные элементов формы и сохраним их в качестве строки.
"jQuery"
function showValues()
{
var str = $("form").serialize();
return str;
}
$("form:eq(0)").submit(function(){
var val = showValues();
$(".serialize").text(val);
$.post("post.php",{name:""+val+""},function(data){
$(".result").empty();
$(".result").append(data);});
return false
});
"HTML"
<form method="post" action="#">
<input type="text" name="text"><br/>
<input type="checkbox" name="check"><br/>
<textarea name="area">textarea</textarea><br/>
<input type="submit" value="отправляем на сервер"><br/>
<form>
<span class="serialize"></span>
<span class="result"></span>
"CSS"
p { margin: 8px; font-size:12px; }
.selected { color:blue; }
.highlight { background:yellow; }
Такой несложынй отрезок jquery кода позволит нам сэкономить время и силы для собирания данных из полей формы, самым простым способом. Однако следует учитывать, что таким образом вы не закачаете файла на сервер. Для этого же опять не следует использовать целые плагины, так или иначе загрузка файлов происходит через создания скрытого окна iframe, использовать которое можно без труда и самому, к тому же всегда следует писать код самостоятельно, а не использовать чужой.
Не маловажным сегодня становиться бесконфликтное использование нескольких js библиотек, например mootools и jquery, поэтому напоследок рассмотрим ошибкоустойчивый код на jquery с библиотекой mootools.
"jQuery"
;(function( $ ){
$.fn.myfunction = function(){
if($(".result").css("display")=="block")
{
$(".result").hide("slow");
}
if($(".result").css("display")=="none")
{
$(".result").html("");
$(".result").append("Моя функция на jquery").show("slow");
}
};
$(function() {
$("button[name=button]").click(function(){
$(".result").myfunction();
$('#myElement').width('300px');
});
});
})( jQuery );
"HTML"
<button name="button">Нет, jQuery! </button>
<button id="moot">Нет, mootools! </button>
<span class="result" style="display:none;"></span>
<div id="myElement" style="width:100px;height:100px; border:5px solid red;"></div>
"CSS"
p {font-color: #000;}
Следующий отрезок кода - ;(function( $ ){ ваш код jquery....})( jQuery ); позволят избавить jquery от конфликта с другми js библиотеками. Единственное, что для Вас здесь может быть непонятно, так это функция $.fn.extend(), данная функция позволяет Вам добавлять собственные методы juqery, подробно об этой функции можно прочитать в руководстве http://slyweb.ru/jquerydoc/jQuery-fn-extend-object.php.
Избегать конфликтов js библиотек можно и с использованием ещё одной фнуции jquery - jQuery.noConflict() - http://slyweb.ru/jquerydoc/jQuery-noConflict.php.
Пример применнеия jQuery.noConflict();
"jQuery"
jQuery.noConflict();
jQuery(document).ready(function(){
jQuery.fn.myfunction = function(){
if(jQuery(".result").css("display")=="block")
{
jQuery(".result").hide("slow");
}
if(jQuery(".result").css("display")=="none")
{
jQuery(".result").html("");
jQuery(".result").append("Моя функция на jquery").show("slow");
}
};
jQuery(function() {
jQuery("button[name=button]").click(function(){
jQuery(".result").myfunction();
jQuery('#myElement').width('300px');
});
});
});
"HTML"
<button name="button">Нет, jQuery! </button>
<button id="moot">Нет, mootools! </button>
<span class="result" style="display:none;"></span>
<div id="myElement" style="width:100px;height:100px; border:5px solid red;"></div>
"CSS"
p {font-color: #000;}
На этом моя статья о некоторых функциях jquery заканчиваетя, надеюся Вам пригодятся мои знания о jquery.
16.1
Бывалый
плагин jQuery Color Animations здесь не причём! У Вас ведь без него написан код.