css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
17 Июн
Повторюсь, что в документации к библиотеке jQuery тема событий и их обработки занимает значительное место. И во второй части мы будем знакомиться с хэлперами. Используя их, Вы сможете как вызывать определенные события, так и связывать с ними некоторые действия…
возвращает: jQuery
Симулирует hovering – отслеживание входа указателя мыши в пределы объекта и выхода за его пределы. Всякий раз, когда указатель мыши оказывается поверх объекта, вызывается функция, переданная в качестве первого аргумента. Аналогично, когда указатель мыши выходит за пределы объекта – вызывается функция, которая является вторым аргументом.
Например, чтобы добавить специальный стиль для ячейки таблицы над которой находится указатель мыши, можно сделать так:
$("td").hover(
function () {
$(this).addClass("hover");
},
function () {
$(this).removeClass("hover");
}
);
В следующем примере в конце каждого элемента списка добавляется три звездочки (конечно в тот момент, когда над ним находится указатель мыши).
$("li").hover(
function () {
$(this).append($("<span> ***</span>"));
},
function () {
$(this).find("span:last").remove();
}
);
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Переключается между двумя функциями, которые по очереди вызываются каждым следующим кликом. Каждый раз, когда клик совершен на выбранном элементе, срабатывает первая функция. Если на том же элементе совершен еще один клик – срабатывает вторая функция. Каждый следующий клик продолжает переключение между этими двумя функциями. Можно использовать unbind(«click»), чтобы отменить действие toggle().
Чтобы добавить специальный стиль для ячейки таблицы по которой был совершен клик, можно сделать так:
$("td").toggle(
function () {
$(this).addClass("selected");
},
function () {
$(this).removeClass("selected");
}
);
В следующем примере мы применяем и следующим кликом отменяем стили для каждого элемента списка.
$("li").toggle(
function () {
$(this).css("list-style-type", "disc")
.css("color", "blue");
},
function () {
$(this).css({"list-style-type":"", "color":""});
}
);
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие blur для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием blur и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием blur. Событие blur обычно вызывается, когда элемент теряет фокус через действие указывающего устройства или клавиши Tab.
Вызываем событие blur для всех параграфов:
$("p").blur();
возвращает: jQuery
Связывает функцию с событием blur для всех элементов набора.
Чтобы выводить в alert сообщение «Hello World!» каждый раз, когда для любого параграфа наступает событие blur, надо сделать следующее:
$("p").blur( function () { alert("Hello World!"); } );
возвращает: jQuery
Вызывает событие change для каждого элемента набора. В этом случае будут вызваны все функции, связанные с этим событием change и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием change. Событие change обычно вызывается, когда элемент управления теряет фокус и его значение было изменено с момента получения им фокуса.
возвращает: jQuery
Связывает функцию с событием change для всех элементов набора.
По событию change для всех текстовых элементов ввода вызываем некую функцию, которая например будет проверять вводимые данные.
$("input:text").change( function() {
// здесь проверяем ввод на валидность
});
В следующем примере по событию change, используем функцию, которая получает текст каждой выбранной опции и записывает этот текст в элемент div в виде строки. Далее используем change(), чтобы вызвать это событие.
$("select").change(function () {
var str = "";
$("select option:selected").each(function () {
str += $(this).text() + " ";
});
$("div").text(str);
}).change();
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие click для каждого элемента набора. В этом случае будут вызваны все функции, связанные с этим обытием.
Чтобы вызвать событие click для всех параграфов на странице:
$("p").click();
возвращает: jQuery
Связывает функцию с событием click для всех элементов набора. Событие click наступает, когда кнопка указывающего устройства (например мышь) кликнута на элементе. Клик определяется как mousedown + mouseup в некотором месте экрана.
Чтобы скрыть параграфы на странице, на них необходимо кликнуть. Здесь hover() используется просто для эффекта.
$("p").click(function () {
$(this).slideUp();
});
$("p").hover(function () {
$(this).addClass("hilite");
}, function () {
$(this).removeClass("hilite");
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие dblclick для каждого элемента набора. В этом случае будут вызваны все функции, связанные с этим событием dblclick и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием dblclick.
возвращает: jQuery
Связывает функцию с событием dblclick для каждого элемента набора. Событие dblclick обычно вызывается, когда кнопка указывающего устройства дважды быстро кликнута на элементе.
Чтобы выводить в alert сообщение «Hello World!» каждый раз, когда для любого параграфа наступает событие dblclick, надо сделать следующее:
$("p").dblclick( function () { alert("Hello World!"); });
В следующем примере двойной клик по элементу div, переключает его цвет.
var divdbl = $("div:first");
divdbl.dblclick(function () {
divdbl.toggleClass('dbl');
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие error для каждого элемента набора. В этом случае будут вызваны все функции, связанные с этим событием error и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием error. Событие error обычно вызывается, когда элемент теряет фокус через действие указывающего устройства или клавиши Tab.
возвращает: jQuery
Связывает функцию с событием error для каждого элемента набора.
Для события error нет общих стандартов. В большинстве браузеров, событие error объекта window вызывается, когда на странице обнаружена ошибка JavaScript. Для объекта image событие error вызывается при некорректном содержимом атрибута src – например, несуществующий файл.
Если событие произошло в объекте window, обработчик события передает три параметра:
Если обработчик события вернет true, это означает, что событие было обработано и браузер не показывает никаких ошибок.
Чтобы сохранить лог ошибок JavaScript на стороне сервера, можно попробовать сделать так:
$(window).error(function(msg, url, line){
jQuery.post("js_error_log.php",
{ msg: msg, url: url, line: line });
});
Чтобы скрыть от пользователя ошибки JavaScript, попробуйте:
$(window).error(function(){
return true;
});
Чтобы скрыть иконку «broken image» от пользователей IE, можно попытаться сделать так:
$("img").error(function(){
$(this).hide();
});
возвращает: jQuery
Вызывает событие focus для каждого элемента набора. В этом случае будут вызваны все функции, связанные с этим событием focus.
Чтобы при загрузке страницы сразу передать фокус элементу с идентификатором ‘login’, сделайте следующее:
$(document).ready(function(){
$("#login").focus();
});
возвращает: jQuery
Связывает функцию с событием focus для каждого элемента набора. Событие focus вызывается, когда элемент получает фокус через указатель мыши или клавишу Tab.
Чтобы запретить пользователю писать что-либо в поле ввода, сделайте так:
$("input[@type=text]").focus(function(){
$(this).blur();
});
В этом примере как только элемент input получает фокус, отображается следующий сразу за ним элемент span и в течении одной секунды «затухает».
$("input").focus(function () {
$(this).next("span").css('display','inline')
.fadeOut(1000);
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие keydown для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием keydown и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием keydown.
возвращает: jQuery
Связывает функцию с событием keydown для каждого элемента набора. Событие keydown обычно вызывается, когда на клавиатуре нажата какая-либо клавиша.
Чтобы выполнять различные действия в зависимости от того, какая клавиша нажата на клавиатуре, попробуйте сделать так:
$(window).keydown(function(event){
switch (event.keyCode) {
// ...
// разные клавиши выполняют разные сценарии
// разные браузеры могут предоставлять разные коды
// чтобы узнать больше смотрите тут
// http://unixpapa.com/js/key.html
// ...
}
});
возвращает: jQuery
Вызывает событие keypress для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием keypress и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием keypress. Событие keypress обычно вызывается, когда на клавиатуре была нажата какая-либо клавиша.
возвращает: jQuery
Связывает функцию с событием keypress для каждого элемента набора. Событие keypress обычно вызывается, когда на клавиатуре была нажата какая-либо клавиша. Событие keypress определяется как keydown + keyup на какой-либо клавише.
В этом примере мы показываем код нажатой клавиши, но добавляем в строку только буквы латинского алфавита и пробелы.
$("input").keypress(function (e) {
if (e.which == 32 || (65 <= e.which && e.which <= 65 + 25) || (97 <= e.which && e.which <= 97 + 25)) {
var c = String.fromCharCode(e.which);
$("p").append($("<span></span>")).children(":last").append(document.createTextNode(c));
} else if ( e.which == 8 ) {
// backspace in IE only be on keydown
$("p").children(":last").remove();
}
$("div").text(e.which);
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие keyup для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием keyup и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием keyup.
возвращает: jQuery
Связывает функцию с событием keyup для каждого элемента набора. Событие keyup обычно вызывается, когда на клавиатуре была отпущена какая-либо клавиша.
Небольшой пример демонстрирует, как выполнить какое-либо действие в тот момент, когда отпущена клавиша escape:
$(document).keyup(function(event){
if (event.keyCode == 27) {
alert('escaped!');
}
});
возвращает: jQuery
Связывает функцию с событием load для каждого элемента набора. Будучи связанным с элементом window, это событие вызывается только тогда, когда агент пользователя завершит загрузку всего содержимого документа (фреймы, объекты, графику). Для элементов это вызывается, когда целевой элемент и все его содержимое полностью загружено.
Необходимо помнить, что load будет работать только в том случае, если он определен перед элементом, полной загрузки которого мы ожидаем. Если же его определить после такого элемента – ничего не произойдет.
В этом примере некоторый код будет выполнен только после полной загрузки страницы, включая и графику.
$(window).load(function () {
// выполняем некоторый код
});
возвращает: jQuery
Связывает функцию с событием mousedown для каждого элемента набора. Событие mousedown обычно вызывается, когда клавиша указывающего устройства (мыши) была нажата на элементе.
В этом примере добавляется текст сообщений, когда происходят события mouseup и mousedown на элементе p.
$("p").mouseup(function(){
$(this).append('<span style="color: #ff0000">Up!</span>');
}).mousedown(function(){
$(this).append('<span style="color: #0000ff">Down!</span>');
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием mousemove для каждого элемента набора. Событие mousemove обычно вызывается, когда указатель мыши перемещается поверх элемента. Обработчик события принимает один аргумент – объект события, в свойствах clientX и clientY которого представлены координаты указателя мыши.
В этом примере показываем координаты указателя мыши в то время, как указатель перемещается над элементом div.
Примите во внимание, что здесь пример демонстрируется во фрейме, поэтому координаты курсора высчитываются относительно этого фрейма.
$("div").mousemove(function(e){
var pCoords = "( "+e.pageX+", "+e.pageY+" )";
var cCoords = "( "+e.clientX+", "+e.clientY+" )";
$("span:first").text("e.pageX,e.pageY-" + pCoords);
$("span:last").text("e.clientX,e.clientY-" + cCoords);
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием mouseout для каждого элемента набора. Событие mouseout обычно вызывается, когда указатель мыши выходит за пределы элемента.
В этом примере показываются сообщения, когда происходят события mouseover и mouseout. Событие mouseout вызывается, когда указатель мыши перемещается в/из дочернего элемента, тогда как для mouseleave этого не происходит.
var i = 0;
$("div.overout").mouseout(function(){
$("p:first",this).text("мышь out");
$("p:last",this).text(++i);
}).mouseover(function(){
$("p:first",this).text("мышь over");
});
var n = 0;
$("div.enterleave").bind("mouseenter",function(){
$("p:first",this).text("мышь пришла");
}).bind("mouseleave",function(){
$("p:first",this).text("мышь ушла");
$("p:last",this).text(++n);
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием mouseover для каждого элемента набора. Событие mouseover обычно вызывается, когда указатель мыши находится в пределах элемента.
В этом примере показываются сообщения, когда происходят события mouseover и mouseout. Событие mouseover вызывается, когда указатель мыши перемещается в/из дочернего элемента, тогда как для mouseleave этого не происходит.
var i = 0;
$("div.overout").mouseover(function(){
$("p:first",this).text("мышь over");
$("p:last",this).text(++i);
}).mouseout(function(){
$("p:first",this).text("мышь out");
});
var n = 0;
$("div.enterleave").bind("mouseenter",function(){
$("p:first",this).text("мышь пришла");
$("p:last",this).text(++n);
}).bind("mouseleave",function(){
$("p:first",this).text("мышь ушла");
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием mouseup для каждого элемента набора. Событие mouseup обычно вызывается, когда клавиша указывающего устройства (мыши) была отпущена на элементе.
В этом примере добавляется текст сообщений, когда происходят события mouseup и mousedown на элементе p.
$("p").mouseup(function(){
$(this).append('<span style="color: #ff0000">Up!</span>');
}).mousedown(function(){
$(this).append('<span style="color: #0000ff">Down!</span>');
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием resize для каждого элемента набора. Событие resize обычно вызывается, когда изменяются размеры области просмотра документа.
Чтобы сделать изменение размеров окна головной болью, попробуйте сделать так:
$(window).resize(function(){
alert("Stop it!");
});
возвращает: jQuery
Связывает функцию с событием scroll для каждого элемента набора. Событие scroll обычно вызывается, когда прокручивается область просмотра документа.
Что бы делать что-нибудь, отслеживая прокрутку области просмотра документа:
$("p").clone().appendTo(document.body);
$("p").clone().appendTo(document.body);
$("p").clone().appendTo(document.body);
$(window).scroll(function () {
$("span").css("display", "inline").fadeOut("slow");
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие select для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием select и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием select.
Не стоит путать событие «select» с событием «change», которое вызывается, когда HTML-элемент select используется для выбора какой(их)-либо опций.
Чтобы вызвать событие select для всех элементов input, попробуйте сделать так:
$("input").select();
возвращает: jQuery
Связывает функцию с событием select для каждого элемента набора. Событие select обычно вызывается, когда пользователь выделяет какой-либо текст в текстовом поле, например input и textarea.
Чтобы выполнить какие-либо действия, когда выделяется текст в элементах ввода текста:
$(document).select( function () {
$("div").text("Что-то было выделено!")
.show().fadeOut(1000);
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Вызывает событие submit для всех элементов набора. В этом случае будут вызваны все функции, связанные с этим событием submit и также вызовет действие браузера по умолчанию для этого события. Поведение браузера по умолчанию можно предупредить, возвращая false из одной или нескольких функций, связанных с этим событием submit.
Чтобы вызвать событие submit для первой формы на странице, надо сделать так:
$("form:first").submit();
возвращает: jQuery
Связывает функцию с событием submit для каждого элемента набора. Событие submit обычно вызывается, когда форма отправляется.
Чтобы предотвратить отправку формы, если какая-либо переменная не установлена, сделайте:
$("form").submit( function () {
return this.some_flag_variable;
} );
Или более подробный пример на ту же тему:
$("form").submit(function() {
if ($("input:first").val() == "correct") {
$("span").text("Проверяем...").show();
return true;
}
$("span").text("Неправильно!")
.show().fadeOut(1000);
return false;
});
Откройте пример в отдельном окне и посмотрите исходный код.
возвращает: jQuery
Связывает функцию с событием unload для каждого элемента набора.
Чтобы попрощаться с посетителем, выведя сообщение в alert в то время когда страница закрывается:
$(window).unload( function () { alert("Bye now!"); } );
На этом пожалуй все. Ну, не совсем конечно. Впереди нас ждет еще интереснейшая тема – эффекты библиотеки jQuery.
Отзывов (99) на «jQuery API: Events – события. Часть 2.»
Дружище! Помог! Спасибо! Очень благодарен за инфу!
Сорри, не подскажете как загасить через jquery всплывание событий например по hover? ()
http://docs.jquery.com/Events/hover#overout
А вообще в jQuery по событиям очень хорошая документация
рульно.
пасиба большое
Инфа супер и почти все понятно. Столкнулся с проблемой. Хочу сделать вкладки такие как на new.skoda-auto.com с активностью и с подменой класов вообщем точь в точь такой функционал. Может кто подскажет что еще нужно добавить в стандартные табы jquery что бы все заработало? Буду очень признателен
Тут лучше вообще стандартные tabs не пользовать, а написать только то, что нужно. Если можете средствами HTML+CSS нарисовать красивые вкладки – это практически все, что нужно. А дальше (просто как пример), используйте хоть click() по вкладке, чтобы сменить ее стиль на активный и по тому же клику подгружайте через ajax с помощью скажем load(url, [data], [callback]) любой нужный контент.
Если схематично, то примерно так…
А как сделать чтобы щелкая по 1 вкладке она обрамлялась рамкой, при щелчке по следующей вкладке она тоже обрамляеться рамкой, а 1 вкладка становилась без рамки как буд-то по ней не щелкали?
Если я правильно понял задачу то это не сложно, все что нужно нарисовать 2 разных изображения, и прикрутить их css. Если ты используеш стандартные вкладки jquery то это классы ul.tabs li a, и ul.tabs li.tab-current a. Если что не получиться пиши сюда или на почту помогу. Хотя я сам сдесь прошу помощи! Пока не разобрался с активностью и с подменой классов. Может кто сможет помочь. Надежда умирает последней…
Напишу проще, есть 7 изображений по умолчанию у них серая рамка, так вот при щелчке по любому из них, рамка должна становиться красной, а остальные изображения должны оставаться с серой рамкой, как это сделать с помощью стандартных средств JQuery без использования доп. плагинов (jquery.tabs и др.)?
Задачу не совсем понял, но если в простейшем варианте, то если серая рамка вокруг картинок задана в CSS, например так:
img {
border:5px solid #999999;
}
, то сменить цвет рамки по событию очень просто:
$(«img»).click(function() {
$(this).css(«border-color»,»#FF0000″);
});
и картинка по которой был совершен клик станет уже с красной рамкой.
Если при клике по картинке надо еще снимать красную рамку (возвращать серую) с картинок по которым раньше кликнули, то тут немного по другому:
$(«img»).click(function() {
$(«img»).css(«border-color»,»");
$(this).css(«border-color»,»#FF0000″);
});
И это не единственный вариант – можно и через addClass и removeClass сделать.
Да если просто снимать и добавлять рамку тут можно обойтись с помощью toggle (с ним удобно когда надо выделить несколько картинок),
$(«img»).toggle(function(){
$(this).css(«border-color»,»#FF0000″);
},function(){
$(this).css(«border-color»,»#999999″);
});
но мне надо что бы было как при выборе какого-либо объекта (в нашем случае картинки), должно получиться что при выборе одной из картинок она должна подсветиться красной рамкой, при выборе уже другой картинки она подсветиться красной рамкой, а остальные остануться с серой, только ОДНА картинка должна подсвечиваться! Например: у нас есть 3 картинки щелкаем на вторую она посвечиваеться красной рамкой, оснальные 1,3 картинки остаются с серой, щелкаем на 3 она подсвечиваеться красной рамкой, а 1,2 картинки остаються с серой рамкой.
Ну, тогда Ваш вариант второй…. Код я привел.
Да точно, сначало снимаем со всех изображений рамку, а потом делаем рамку только тому по которому щелкнули. Спасибо за помощь!
Спасибо всем! У меня все получилось! Если чем смогу помочь – буду очень рад.
Добрый день
Пишу, может Вы мне поможете.
Переделываю сайт, делаю его динамическим. Надо сделать переключение вкладок, написал скрипт все работает, но не могу убрать баблэффект, что я имею ввиду:
все активируется вот такой вот конструкцией:
$(‘#a’).click(function(e){
tabChange( $(this).attr(\’href\’) );
return false;
});
Выходит, нажимаем один раз вызывается функция tabChange, делается запрос – рабоатет
нажимаем второй раз – tabChange вызывается 2 раза, 2 запроса
нажимаем третий раз – 4 запроса и тд
в документации написано что надо вернуть false или вставить вначале
e.stopPropagation();
e.preventDefault();
не помагает
как мне быть?
Артем, чтобы предложить решение надо смотреть весь код. Можете сбросить на почту g.samkov на сервере gmail.com
Спасибо большое за помощь
Большое спасибо за информацию. Очень помогла
Не подскажете можно ли отменить событие unload для страницы?
Может быть Вы не совсем точно сформулировали вопрос? По событию можно что-то делать или напротив что-то НЕ ДЕЛАТЬ.
К примеру можно запретить какие-то действия, определенные по умолчанию – скажем клик мышкой по ссылке НЕ ПРИВЕДЕТ к переходу по ней… Но кликнуть-то мышкой по ссылке я пользователю не могу запретить…
Простите, возможно действительно некорректный вопрос
Мне необходимо собирать клики мышек на странице по различным ссылкам, а потом полученную информацию отправлять на сервер. Желательно отправить ее один раз как раз, когда пользователь решил уйти со страницы. То есть по моему мнению необходимо поймать событие выгрузки страницы. Поймать-то у меня его получается, но вот сделать я уже ничего на этом моменте не могу. То есть в принципе мне необходимо отменить или задержать выгрузку на некоторое время, пока допустим отправляется ajax-запрос.
Простите, если немного запутанно, в первый раз сталкиваюсь с подобной задачей.
Почему не получается? Прекрасно можно отправить ajax-запрос серверу. Знаю из опыта, что это работает.
$(window).unload(function () {
$.ajax({
type: «POST»,
data: myData,
url: «handlers/handler.php»
});
});
другое дело, что тут возникает вопрос отслеживания успешности выполнения этого запроса…
Да действительно работает спасибо. Единственный вопрос: ajax-запрос успеет отправиться до того как перезагрузится страница в любом случае?
Да, запрос будет отправлен, но повторяю, тут на стороне клиента невозможно отследить выполнение этого запроса.
Спасибо за статью, все так подробно описано, а вот не подскажите, мне нужно определить есть ли у объекта собитие Change , если есть, то к нему приписать еще вызов одной функции, если нет то просто вызов этой функции. Второе тоя реализовала, а вот как мне определить именно есть ли уже другие события у объекта не знаю. Спасибо
Я понял вопрос так, что надо отследить наступало ли уже событие change() для объекта. Но это традиционно реализуется установкой какого-либо флага. Или я не так Ваш вопрос понял?
Да вы немного не так мой вопрос поняли. Да и собственно я уже нашла решение своей проблемы, но единственное, что у меня почему-то не работает
var events = $(‘this’).data(‘events’); говорит что $(«#test»).data is not a function Собственно внизу приведу код, пример тестовый
Функция:
jQuery.fn.bindFirst = function(evt, fn) {
var events = $(this).data(«events»);
var handlers = [];
for (var type in events) {
if (type == evt) {
for (var guid in events[type])
handlers.push(events[type][guid]);
$(this).unbind(evt);
$(this).bind(evt, function() {
fn();
for (var i = 0; i < handlers.length; i++)
handlers[i]();
});
break;
}
}
return $(this);
}
Пример использования:
$(‘document’).ready(function() {
$(‘#test’).bind(‘click’, function() {
alert(‘Click #1′);
});
$(‘#test’).bind(‘click’, function() {
alert(‘Click #2′);
});
$(‘#test’).bindFirst(‘click’, function() {
alert(‘Click #3′);
});
});
123
Но Ваш код работает без ошибок. По крайней мере FireBug не находит ничего криминального. Вот примерчик.
Просто я пока не пойму до конца что именно должно быть реализовано? Если по Вашему примеру: первый клик по элементу должен вызвать alert(click #3), а последующие что-то иное?
Может быть тогда стоит попробовать реализовать эту логику через one(), bind(), unbind()?
См. тут: http://docs.jquery.com/Events
Странно у вас все работает, а у меня FireBug ругается и все тут, и та же версия библиотеки подключена. Странно ничего понять не могу..
А работает все так как надо, просто я почему свою функцию на событие ставлю вперед других функций этого события, которые изначальна могут быть у объекта. Просто если я ее поставлю в конце, то если те функции события, которые будут стоять в начале возвротят false, то моя функция уже не выполниться, т.к. false вообще отменит выполнения этого события.
В кэше порой столько скопится…. Попробуйте почистить. Может проблема в простом… Я же Ваш код один в один взял и просто у себя поставил.
Нет не помогло, ладно спасибо за ваши советы и помощь, буду разбираться во всем этом дальше
Gennady а можно у вас еще спросить, как в версии jQuery-1.1.2 можно проверить есть ли у объекта событие onChange, и если есть, то получить его содержимое, функции…
Это я почему спрашиваю, оказывается мой тот примет не работал потому что используется jQuery-1.1.2, вот и я просто подключала ту поновее версию, и не работало все равно, оказалось, что в старой версии нет той функции data которая и возвращает массив всех событий объекта. А мне новую никак не подлючить, т.к. проект полностью работает на той старой, и там даже свои небольшие изменения вносили, так что если новую подключить, много переделывать придется. Вот подскажите пожалуйста.
Боюсь, что на Ваш вопрос и сам John Resig и его jQuery Team сразу и не ответят (в смысле конкретики конечно…), поскольку Data Cache с версии 1.2.3 появилось, а Вы аж на 1.1.2 завязаны. Разве что «поковырять» саму библиотеку (свежую версию разумеется) и подсмотреть, как это реализовано, чтобы попробовать это адаптировать под свои условия.
Мда, спасибо, да вот сижу ковыряю, написала функцию, тока все равно не хочет работать, видно там совсем много изменять придется, чтоб заработало….
Буду мучать дальше
Добрый день.
Передо мной стоит такая задача: на странице имеется несколько ссылок (5-10). Необходимо под каждой ссылкой разместить (и)фрейм со страничкой, на которую ведет каждая ссылка.
Делаю так:
$(document).ready(function() {
$(«a»).load(function() {
var url = $(this).attr(«href»);
$(this).append(«»);
});
});
Такой код не работает. Меняю load на hover – при наведении курсора на ссылку все работает – фрейм появляется.
Пробовал так:
$(«a»).append(«»);
Так, естесственно, фреймы добавляются, но каждый из них содержит страницу первой ссылки…
Подскажите, как же все таки реализовать поставленную задачу?..
И второй момент – методом .append текст добавляется к тексту ссылки. Как сделать так, чтобы он добавлялся сразу после закрывающего тега ?
Странно, почему-то съедается часть кода…
Вот так:
…
$(this).append(«[span][iframe src='" + url + "'][/span]«);
…
и
…
$(«a»).append(«[span] [iframe src='" + $("a").attr("href") + "'][/span]«);
…
Да, забыл добавить – нет возможности ссылкам присвоить ID, CLASS и др. параметры.
1. Вы неверно пытаетесь использовать метод load( url, data, callback ).
2. Вместо append() для решения Вашей задачи логичнее использовать after( content )
Ну а класс-то почему присвоить нельзя?
С after вместо append разобрался, спасибо.
С классом, пожалуй, тоже погорячился – присвоить то теоретически можно, но практически – не требуется.
Насчет метода load – мне не нужно получать _содержимое_ страницы – это сделает за нас сам браузер. В принципе, у меня уже имеется рабочий код, единственное что – фреймы появляются по наведению курсора на ссылки, а нужно чтобы это происходило сразу после загрузки страницы.
Ну, а зачем же тогда Вы используете событие? Достаточно, чтобы весь код отрабатывал по ready…
После ready мне необходимо получить набор ссылок со страницы.
$(document).ready(function() {
// Следующая строка не верна!!
$(”a”).(function() {
var url = $(this).attr(”href”);
// this.append………..+url+…….
});
});
Так чем же мне заменить строку $(”a”).(function(){ ??
Поясню еще раз, более развернуто:
После document.ready нужно получить набор ссылок со страницы (делаю это так: $(”a”) ), после чего каждую из них обработать. Поясните, пожалуйста, как это можно сделать без событий, сразу по ready?
Желательно с примером кода…
$(document).ready(function() {
$(«a»).each(function() {
…………………………….
});
});
Для каждого элемента а что-то делаем через each( callback )
Добавление пресловутой стрелочки и адреса ссылки:
$(document).ready(function() {
$(”a”).each(function() {
$(this).after(» <= » + $(this).attr(«href») );
});
});
И то не работает(( Где ошибка?
Вроде разобрался, спасибо огромное за помощь!))
Помогите пожалуйста, никак не могу сложить значение двух переменных:
-
1
2
-
3
4
$(«select»).change(function () {
var x = $(«#id»).val();
var y = $(«#id2″).val();
var sum = x + y;
$(«#rub»).text(sum);
});
Переменные не образуют сумму. Что не так?
Тоесть вот код..
<div id="rub"></div>
<select name="a" id="id">
<option value="0">-</option>
<option value="1000">1</option>
<option value="700">2</option>
</select>
<select name="b" id="id2">
<option value="0">-</option>
<option value="1000">3</option>
<option value="700">4</option>
</select>
<script type="text/javascript">
$("select").change(function () {
var x = $("#id").val();
var y = $("#id2").val();
var sum = x + y;
$("#rub").text(sum);
});
</script>
Переменные x и y у Вас получаются как строки, а не как числа, поэтому знаком + Вы осуществляете не сложение, а конкатенацию двух строк. Сделайте так:
var sum = parseInt(x) + parseInt(y);
тогда получите сумму.
Огромное спасибо! Теперь понял, хотя нашел ещё много других способов..
И можно ещё вопрос? Мне бы нужно было например с главной рамблера выдрать показатель курса доллара, и подключить его в свой скрипт. Как это можно осуществить? Сколько ни пробовал – ничего не получается.
А зачем такие сложные сложности? Есть же информеры всякие, на том же rbc – берите и пользуйтесь…
Нет, оно конечно можно и помучиться – получить страницу, разобрать ее на куски, найти нужный и поставить цифирку у себя, но по-моему эти усилия можно было бы направить и на что-то более полезное.
есть 2 формы при выборе чегонить из 1 выбираются определенные данные из второй но если после выбора в первом поле его изменить повторно то данные комбинируются, подскажите как очистить содержимое?
Вообще-то я не телепат, чтобы по таким данным давать рекомендации. Разве могу предположить, что когда в первой форме что-то выбирается, то во вторую Вы подставляете данные куда-то… Тогда стоит наверное использовать change() для отслеживания изменений в первой форме и сначала очистить «куда-то» во второй, а потом туда же подставить свежие данные. Ну а как очистить вопрос конкретной реализации – может remove() или empty() или еще как-то, например .text(‘»");
смотри на примере городов:
в первом поле – Москва
во втором Улица москвы
Если изменить 1 поле допустим на Питер
то теперь во втором поле будут улицы Москвы + Питера!
В общем имеются в виду выпадающие списки…. Насчет утверждения: «во втором поле будут улицы Москвы + Питера» – не верю.
Пожалуйста, как доказательство страница плагина Select Chain, реализующего связанные селекты. Вот ссылка на демо: http://remysharp.com/wp-content/uploads/2007/09/select-chain.php
Отличная статья, правда все написано для работы с id и тегами, а если допустм имеется несколько разных элементов с одним стилем:
Ляляляляля
…
…
есть возможность применить эффекты или изменить свойства этих элементов?
Балин, я не помню как код в постах выводить, надеюсь автор меня исправит…
Никаких проблем с этим нет, Вам просто надо познакомиться со статьями в которых рассказывается о селекторах jQuery, т.е. о том, как выбирать нужные элементы для дальнейших манипуляций с ними.
Только сейчас заметил, что событие keypress возникает только когда нажимаются буквенно-циферные клавиши. На Del, BS, Enter не реагирует. Есть ли приемы это обойти? – кроме keydown.
А как сделать так, чтобы полю передавался фокус при наведении, но не моментально, а через несколько секунд
Ну, например так:
$('input').mouseover(function(){ $(this).animate({opacity:1},1500,function(){ $(this).focus() }); });с помощью метода animate – сначала он по сути ничего не делает (opacity:1 – как было так и осталось) в течение полутора секунд, а затем вызывает передачу фокуса в элемент над которым находится указатель мыши.
Не понимаю в чём проблема
почему код
$(«*»).removeClass(«selected»);
работает, а этот нет:
$(«#filter»).removeClass(«selected»);
Здраствуйте, Gennady! Подскажите пожалуйста можно ли средствами JavaScript (JQ) отследить закрытие страницы браузера, именно закрытие (может нажатие на крестик или что-нибудь другое). Событие unload на сколько я понимаю мне с этим не поможет…. так как оно срабатывает даже в случае обновления той же страницы.
Да, Вы правы, unload не поможет. Я тоже вряд ли, поскольку как то не приходилось такую задачу решать, а навскидку ничего хорошего в голову не приходит…
Спасибо, Gennady! Буду искать дальше )))
Подскажите, пожалуйста,как решить подобную задачу:есть галлерея изображений,стрелки влево,вправо для навигации.Раньше подобные галереи я реализовала так,что при клике на стрелки влево-вправо подгружаеться информация аяксом и соответственно выезжает.А теперь мне нужно добиться такого же эффекта только при наведении на стрелку.а у меня только один раз выезжает изображение((А должно изменяться,пока мышка наведена..если есть у вас возможность,подскажите.Заранее спасибо
Можно наверное и мозгами шевелить, но сейчас не могу почему-то. Есть на самом деле плагины под это. Один из примеров:
http://plugins.jquery.com/project/simplyScroll
Ребятв привет подскажите как передать POST с линка.
Я использую плагин JQuery Forms c оюычной простой кнопкой всё ок а вот чтобы кнопка была линком это для проверки имени пори регистрации невыходит нечего Спасибо!!
Добрый день.
a =
0
1
2
$(document).ready(function(){
$(«#to»).change(function(){
$(«#to option:selected»).each(function(){
if(this.value!=0) $(«#do»).removeAttr(«disabled»);
else $(«#do»).attr(«disabled»,»disabled»);
});
}).change();
$(«#do»).focus(function(){
if(this.disabled==true){
alert(‘Выбирите a > 0.’);
}
});
});
как правильно прописать, чтобы при обращение к полю do когда оно disabled выскакикало сообщение ‘Выбирите a > 0.’?
Заранее благодарю!
вот код
a = <select name=’to’ id="to">
<option value=’0′ selected="selected">0</option>
<option value=’1′>1</option>
<option value=’2′>2</option>
</select>
<input name=’do’ id="do" type="text" disabled="disabled" />
<script type="text/javascript">
$(document).ready(function(){
$("#to").change(function(){
$("#to option:selected").each(function(){
if(this.value!=0) $("#do").removeAttr("disabled");
else $("#do").attr("disabled","disabled");
});
}).change();
$("#do").focus(function(){
if(this.disabled==true){
alert(‘Выбирите a > 0.’);
}
});
});
</script>
Усложняете…
Вот часть JS-кода:
$("#to").change(function(){ if($(this).val()!=0) $("#do").removeAttr("disabled"); else $("#do").attr("disabled","disabled"); }).change();Что касается второй половины – input не может получить фокус, поскольку он disabled (собственно click он тоже не отследит), поэтому Вам надо искать другое решение.
Столкнулся с таким «феноменом» (только в ИЕ):
есть плавающий DIV с абсолютным позиционированием, часть которого прозрачная. Отлеживаю покидание мыши этого дива, используя событие mouseleave. Все хорошо работает, но когда прозрачная область попадает над текстом или картинкой (только IMG), то сразу возникает событие mouseleave, хотя мышь не покинула границ дива. Пробовал отменить всплывание события – не помогло. При этом ФФ отрабатывает нормально. Есть ли решение?
Додумался сам …
В бек дива положил прозрачный гиф. Все работает
если изображение не найдено, то заменить на noim.jpg
$(«img»).error(function(){
$(this).attr(’src’,'img/noim.jpg’);
});
вот такую штуку хотел сделать, но заменять не хочет. Помогите, пожалуйста.
Вероятно Вы ставите эксперимент на файлах, которые у Вас просто на локалке лежат. Таким образом Вы error не вызовите. Бросьте файл на веб-сервер – все будет работать.
спасибо, сейчас попробую…
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.flash.js"></script>
<div id="flashObj"></div>
<input type="checkbox" onclick="change(4)"/>
<script type="text/javascript">
$(document).ready(function(){
$(‘#flashObj’).flash({
src: ‘flash.swf’,
width: 400,
height: 400,
className: ‘flash’
});
change = function(id){
$(‘.flash’).SetVariable("_root.flg",id);
}
})
</script><script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.flash.js"></script>
<div id="flashObj"></div>
<input type="checkbox" onclick="change(4)"/>
<script type="text/javascript">
$(document).ready(function(){
$(‘#flashObj’).flash({
src: ‘flash.swf’,
width: 400,
height: 400,
className: ‘flash’
});
change = function(id){
$(‘.flash’).SetVariable("_root.flg",id);
}
})
</script>
ребят подскажите … браузер пишет ошибку говорит не поддерживает свойство или метод(SetVariable), как правильно Flash-объекту параметры передавать?
Сергей, судя по всему jquery.flash.js – какой-то плагин к jQuery. Я его не встречал. А для того, чтобы сказать что-то надо взглянуть, что разработчик пишет и т.д. Вы ссылку скиньте, где этот плагин нашли?
http://jquery.lukelutman.com/plugins/flash/
Сергей, плагин староват малость и с jQuery свежих версий (начиная с 1.3) нормально работать без доработки не будет. Но дело по-моему не в этом. Вы пытаетесь применить метод SetVariable() вовсе не к flash-объекту, а к объекту jQuery, который (следуя Вашему коду) содержит все элементы имеющие класс flash и всего-то.
Детали я смотрел тут: http://javascript.ru/unsorted/bridge-to-flash поглядите, должно помочь…
Здравствуйте!
Проблема такая:
на странице есть чекбоксы, при помощи load загружаю в пустой div html с другими чекбоксами. Хочу чтобы при клике на один чекбокс синхронно переключались все чекбоксы с таким же id. Все работает при клике на чекбоксы загруженные ранее (меняются и загруженные лоадом), при клике на чекбоксы загруженные при помощи load не могу увидеть объекты находящиеся за пределами div.
Код:
$(‘#’ + $(this).attr(‘id’)).attr({checked: $(this).attr(‘checked’)});
Помогите, пожалуйста
Этот ответ у меня стал уже стандартным практически
Чтобы понять причину, я бы Вам рекомендовал прочитать пару статей:
Обработка событий для элементов DOM, загружаемых через ajax и Плагин Live Query. И хотя вторая статья утратила актуальность с выходом версии jQuery 1.3, ее стоит почитать, чтобы потом плавно перейти к использованию метода live()…
я тут поразбирался и проблема не в лоад
Почему-то так вот работает
$(‘body’).children(‘#’ + $(this).attr(«id»)).attr({checked: $(this).attr(‘checked’)});
А так нет
$(‘#’ + $(this).attr(«id»)).attr({checked: $(this).attr(‘checked’)});
Есть ли какое-то «правильное» обращение к нескольким элементам с одинаковым параметром или надо обращаться к ним через родителя?
Правильное обращение есть. Выбирать один элемент и обратиться к его свойствам можно например так:
alert($("#someId").attr("name"));в окне предупреждения будет выведено значение атрибута name элемента с идентификатором #someId.
Выбрать несколько элементов и обратиться к свойствам каждого можно так:
$(".someClass").each(function(){ alert($(this).attr("name")); });в окне предупреждения появится значения атрибута name для каждого элемента попавшего в набор. Окно предупреждения появится столько раз, сколько элементов есть в наборе.
подскажите как узнать на сколько был прокручен документ(или div со стилем overflow:auto)?
есть в IE «this.scrollTop», но вот в Опере оно не работает.
можно ли считать подобное свойство используя jQuery?
var top = $(document).scrollTop();
var left = $(document).scrollLeft();
спасибо, большое
Взлом почтового ящика, взлом email. Взламываем почту на заказ.
Вы хотите проследить переписку Ваших недругов, конкурентов или деловых партнеров?
Хотите узнать, что говорят у Вас за спиной или с кем общается Ваша девушка/парень? Ведь по современной статистике 80% измен начинаются с общения в сети.
Хотите знать все? Наша команда занимается взломом почтовых ящиков на заказ.
При взломе пароль остается прежним. Вы просто регулярно можете следить за перепиской.
Анонимность полностью гарантирована. Сроки выполнения заказа 1-3 дня.
Оплата только после выполнения работы!
Пишите сейчас на detectiveplus@gmail.com. ICQ: 580959790, 585601375
Геннадий, еще вопрос
Стоит задача отключить скролл на странице. Чтобы скроллбар отображался, а скролл не происходил (это же касается и “альтерналивного” скролла колесиком мыши, нажатым колесиком мыши и т. п.)?.
Код
$(window).scroll(function(event){
event.preventDefault();
});
При выполнении кода выше страница продолжает скроллиться.
Зачем же все решать именно на JS? На CSS достаточно написать: body { overflow: hidden; }
Ну разве еще какие-то детали, с учетом существования IE6
Указание стиля body { overflow: hidden; } оставляет возможность работы скролла с помощью нажатия колесика мыши. Браузер переключается в режим скролла и, соответственно, скроллит, несмотря на отключенные скроллы в стиле. Речь идет о Мозилле 3.5.
Ну, тогда действительно можно это организовать с помощью jQuery. Конечно не то, чтобы собственно скролла не было, а при попытке скролла все тут же возвращалось в 0. Вот так как-то:
$(function(){ $(window).scroll(function () { $(this).scrollTop(0).scrollLeft(0); }); });Геннадий, спасибо. Но страница при попытке скроллирования не скроллится, но дергается
Поэтому я и хотел именно самостоятельно отрабатывать событие, но почему-то конструкция
$(window).scroll(function(event){
event.preventDefault();
});
не отрабатывает так, как я ожидаю. Учитывая, что при mousedown, mouseup или click колесиком мыши включается автоскролл Мозилле 3.5 я также пытался всех их отрубить кодом
$(«#draggable_element»).mousedown(function(event) {
if (event.button == 1)
event.preventDefault();
});
$(«#draggable_element»).mouseup(function(event) {
if (event.button == 1)
event.preventDefault();
});
$(«#draggable_element»).click(function(event) {
if (event.button == 1)
event.preventDefault();
});
но результата не получил, автоскрол включается. Кстати, функция автоскролла включается через пользовательский интерфейс самой Мозиллы.
У Вас есть какие-то идеи?
Спасибо.
Да, в Опере 10 та же ситуация.
Геннадий подскажите пожалуйста,а как можно подписать событие на клик правой клавишей мышки, Порылся в Гугле вроде нет такого. Или какое дополнительное событие можно повесить на один и тот же элемент для левой клавишы и которое бы не пересикалось с Сlick. (mousedown и двойной клик не отрабатывают) То есть я хотел бы когда клацаю на ячейке таблицы левой появл. одно диалоговое окно, правой другое ну или если невозможно два разных события для левой клавиши)
У объекта event есть свойство button. Значения свойства: 0 – левая клавиша, 1 – средняя, 2 – правая. Это по W3C. А по IE 1 – левая, 2 – правая, 4 – средняя…
Можно обрабатывать событие основываясь на этих значениях. Учитывая конечно различия…
Геннадий сделал так не хочет работать не в одном браузерe
Просто выпадает стандартное котекстное меню. Может я неправильно написал. Хотя вверху вижу сообщение вроде работать должно?
h1 id=»al» РАСПИСАНИЕ КА «ШАГ» /h1 (тєги убрал)
$(«#al»).click(function(event) {
if (event.button == 2)
alert(‘1111′);
});
Нужно же еще предотвратить стандартное поведение браузера…
Вы поищите какой-нибудь небольшой скриптик, который например запрещает использование правой клавиши мыши на странице, разберите его и все станет понятно.
Обсуждение статьи можно продолжить на форуме jQuery.