Практически все JavaScript-приложения выполняют те или иные действия, откликаясь на различные события.
Событие - это сигнал от браузера о том, что что-то произошло.
Есть множество самых различных событий.
DOM-события, которые инициируются элементами DOM. Например, событие click происходит при клике на элементе, а событие mouseover - когда указатель мыши появляется над элементом,
События окна. Например событие resize - при изменении размера окна браузера,
Другие события, например load, readystatechange. Они используются, скажем, в технологии AJAX.
Именно DOM-события связывают действия, происходящие в документе, с кодом JavaScript, тем самым обеспечивая динамический веб-интерфейс.
Для того, чтобы скрипт реагировал на событие - нужно назначить хотя бы одну функцию-обработчик. Обычно обработчики называют "on+имя события", например: onclick.
Нужно сразу отметить, что JavaScript - однопоточный язык, поэтому обработчики всегда выпоняются последовательно и в общем потоке. Это значит, что при установке обработчиков двух событий, которые возникают на элементе одновременно, например mouseover (мышь появилась над элементом) и mousemove (мышь двигается над элементом), их обработчики будут выполнены последовательно.
Существует несколько способов назначать обработчик на конкретное событие элемента. Все они представлены ниже.
Такой способ установки обработчиков очень удобен - он нагляден и прост, поэтому часто используется в решении простых задач.
У этого способа установки обработчика есть и минусы. Как только обработчик начинает занимать больше одной строки - читабельность резко падает.
Впрочем, сколько-нибудь сложные обработчики в HTML никто не пишет. Вместо этого лучше устанавливать обработчики из JavaScript способами, которые будут представлены ниже.
Самый близкий родственник описанного выше способа - установка функции-обработчика через свойство onсобытие соответствующего элемента. Этот способ тоже будет работать в любом браузере с поддержкой JavaScript.
Для этого нужно:
получить элемент
назначить обработчик свойству on+имя
Вот пример установки обработчика события click на элемент с id="myElement":
Это именно свойство, а не атрибут. Поэтому, хотя технически и есть кроссбраузерные способы назначать обработчики через setAttribute, но лучше их даже не знать, а пользоваться прямым присвоением.
Кроме того, как и все свойства объектов JavaScript, имя свойства onсобытие чувствительно к регистру символов и должно быть в нижнем регистре.
Обработчик - не текст, а именно функция javascript.
Когда браузер видит свойство on... в HTML-разметке - он создает функцию из содержимого кавычек.
Это различие легко объяснить. Дело в том, что при назначении onclick в HTML браузер автоматически создает функцию-обработчик из содержимого кавычек. Получается, что последний пример - это по сути то же самое, что:
document.getElementById('mybutton').onclick = function() {
doSomething() // внутри автосозданной функции
}
Конечно, можно при назначении нового обработчика копировать предыдущий и запускать его самостоятельно. Но лучше использовать специальные методы назначения.
Представленных выше методов недостаточно для случаев, которые возникают при разработке серьёзного JavaScript-приложения.
Классический пример - установка обработчика на событие "содержимое окна загрузилось":
// разные элементы интерфейса могут иметь интерес
// в том, чтобы их вызвали при загрузке документа
window.onload = function() {
alert('Документ загружен!')
}
Если заведомо нет локальной переменной onload, то можно и не упоминать про window. Пустячок, но код немного короче.
onload = function() { ... }
Существует два основных интерфейса для установки событий.
Обратите внимание, что имя события указывается без префикса "on".
Еще одно отличие от решения Microsoft это третий параметр – фаза.
Если он установлен в true, то при срабатывании события во вложенном элементе, обработчик будет вызван на фазе "перехвата", а если значение будет false, то - на фазе "всплывания". Подробнее об этом будет написано далее, в разделе этой статьи "Порядок срабатывания событий".
При обычной установке обработчика третий параметр всегда должен быть false.
Как и в других случаях, вы должны передать имя обработчика не ставя круглых скобок, иначе функция будет выполнена сразу, а в качестве обработчика будет передан лишь её результат.
Сколько угодно обработчиков
Кросс-браузерные несовместимости
Далее мы вернемся к различным способам установки обработчиков и в подробностях рассмотрим, как сделать все кросс-браузерно.
В Internet Explorer существует глобальный объект window.event, который хранит в себе информацию о последнем событии. А первого аргумента обработчика просто нет.
То есть, все должно работать так:
// обработчик без аргументов
function doSomething() {
// window.event - объект события
}
element.onclick = doSomething;
Обратите внимание, что доступ к event при назначении обработчика в HTML (см. пример выше) по-прежнему будет работать. Такой вот надежный и простой кросс-браузерный доступ к объекту события.
Это совершенно кросс-браузерный способ, так как по стандарту event - название первого аргумента функции-обработчика, которую автоматом создаст браузер; ну а в IE значение event будет взято из глобального объекта window.
Из объекта события обработчик может узнать, на каком элементе оно произошло, каковы были координаты мыши (для событий, связанных с мышью), какая клавиша была нажата (для событий, связанных с клавиатурой), и извлечь другую полезную информацию.
Например, для события по клику мыши (onclick), свойство event.target(в IE event.srcElement) содержит DOM-элемент, на котором этот клик произошел.
Примечательно, что на одно событие может реагировать не только тот элемент, на котором произошло событие, но и элементы над ним.
Это очень удобно, например если в элементе содержатся много дочерних HTML-тегов - не обязательно ставить обработчик на каждый, достаточно указать один обработчик на родителе и в нем ловить все события.
Рассмотрим ситуацию, когда у вас есть три элемента "вложенных" друг в друга.
1
2
3
<div class="d1" >1<!-- самый верхний, в представлении DOM, элемент -->
<div class="d2">2
<div class="d3">3</div><!-- самый глубокий элемент -->
</div>
</div>
Если на каждом из них будет свой обработчик события, например onclick, то обработчик для какого элемента будет вызван первым при клике, скажем, на d3?
Всего существует 2 модели поведения, они не имеют преимуществ между собой, но используют принципиально разные подходы. Стандарт W3C объединяет две модели в одну универсальную.
В этой модели сначала будет выполнен обработчик на элементе 3, затем на элементе 2, и последним будет выполнен обработчик на элементе 1.
Такой порядок называется "всплывающим", потому что событие поднимается с самых "глубоких" элементов в представлении DOM, к самым "верхним", как пузырек воздуха в воде.
Визуально это выглядит так (кликните на вложенном элементе, чтоб увидеть, какой будет порядок обработки события):
Нужно понимать, что "всплытие" происходит всегда. При возникновении события на элементе, сигнал будет подниматься до самого высокого элемента, выполняя нужные обработчики.
Если какой-то обработчик хочет остановить всплытие и не выпускать событие дальше вверх - это делает следующий код:
element.onclick = function(event) {
event = event || window.event // кросс-браузерно
if (event.stopPropagation) {
// Вариант стандарта W3C:
event.stopPropagation()
} else {
// Вариант Internet Explorer:
event.cancelBubble = true
}
}
Перехват - вторая, альтернативная всплытию модель порядка выполнения для события.
В этой модели сначала будет выполнен обработчик на элементе 1, затем - на элементе 2 и последним будет выполнен обработчик на элементе 3. Она называется "перехват", потому что родительские элементы могут обработать событие раньше, чем непосредственная цель события, как бы "перехватывая" обработку.
Визуально это выглядит так (кликните на вложенном элементе, чтоб увидеть, какой будет порядок обработки события, не поддерживается в IE):
Такой порядок был предложен Netscape и никогда не поддерживался в Internet Explorer, поэтому в IE вы не сможете увидеть этот пример в действии.
Остальные браузеры поддерживают одновременно такой порядок и порядок всплытия, но из-за проблем с Internet Explorer де-факто его почти никто не использует.
Если в качестве третьего параметра функции addEventListener передать значение true, то событие будет срабатывать на фазе захвата, если false – то после окончания захвата, на фазе всплытия.
При установке обработчиков классическими методами (через свойство элемента или атрибут html тега) события всегда будут срабатывать на фазе всплытия.
Дальше мы вообще не будем рассматривать фазу захвата, так как в реальной жизни используется только всплытие.
Браузер имеет своё собственное поведение по умолчанию для различных событий.
Например, клик по ссылке - сменить URL, клик правой кнопкой мыши - показать контекстное меню и т.п.
В ряде случаев реакцию браузера на событие можно убрать в обработчике.Для этого у IE и W3C есть, как и раньше, два по сути близких, но по виду разных способа:
element.onclick = function(event) {
event = event || window.event
if (event.preventDefault) {
// Вариант стандарта W3C:
event.preventDefault()
} else {
// Вариант Internet Explorer:
event.returnValue = false
}
}
Некоторые поведения по умолчанию происходят до вызова обработчика события. В этом случае их, конечно же, отменить нельзя.
Например, при фокусировке на ссылке - браузер выделяет ее пунктирной рамочкой.
Это действие выполняется до события focus, поэтому отменить выделение в обработчике onfocus нельзя.
А переход по ссылке выполняется после события, поэтому его отменить можно.
Обработчики onfocus и onclick на этой ссылке отменяют поведение по умолчанию:
При клике перехода не произойдет, а рамка вокруг ссылки появится.
Код примера:
var a = document.getElementById('my-focus-a')
a.onfocus = a.onclick = function(e) {
e = e || window.event
// другая кроссбраузерная запись остановки события
e.preventDefault ? e.preventDefault() : (e.returnValue=false)
}
Возвращение return false из обработчика события предотвращает действие браузера по умолчанию, но не останавливает всплытие. В этом смысле следующие два кода эквивалентны:
function handler(event) {
...
return false
}
function handler(event) {
...
if (event.preventDefault) {
event.preventDefault()
} else {
event.returnValue = false
}
}
Заметим, что хотя даже если всплытие и действия по умолчанию остановлены, но другие обработчики на текущем элементе все равно сработают.
elem = document.getElementById('TestStop')
function handler(e) {
e.preventDefault() // браузер - стоять
e.stopPropagation() // событие - не всплывать
return false // и вообще, мне больше ничего не надо
}
elem.addEventListener('click', handler, false)
// следующий обработчик все равно сработает
elem.addEventListener('click', function() { alert('А я сработало..') }, false);
Проверить:
Действительно, браузер даже не гарантирует порядок, в котором сработают обработчики на одном элементе. Назначить можно в одном порядке, а сработают в другом.
Поэтому тем более один обработчик никак не может влиять на другие того же типа на том же элементе.
т.е. alert('1'); произойдет лишь один раз, в момент первого клика, после оно никогда не повториться (сколько не кликай). Но при ситуации нескольких обработчиков на одно событие данный код начнёт разрастаться как снежный ком... И код может стать не универсальным...
Хотя, может кто из читателей сайта то придумает более симпатичное решение по удалению обработчика?
Ну если честно, то по-моему мнению, в хорошем коде вообще в событии стоит лишь вызов функции, реагирующих на событие и ни какой логики по обработке события! :-)
А показанный выше мной пример, скорее для того, что б все знали, что и такое тоже работает.
Непонятно как реализовать функционал detachEvent в таком подходе...
Сам думал долго над этим, но кроме варианта показанного чуть выше ничего не нашел.
function addEvent( elm, evType, fn, useCapture ) {
if ( elm.addEventListener ) {
elm.addEventListener( evType, fn, useCapture );
return true;
}
else if ( elm.attachEvent ) {
var r = elm.attachEvent( 'on' + evType, fn );
return r;
}
else {
elm[ 'on' + evType ] = fn;
}
}
var hiClick = function ( evt ) { window.alert( "hi" ) }
var div = document.getElementById( "barTitle" );
addEvent( div, "mousedown", hiClick, false );
Если в стилях поменять position: relative на position: absolute для элемента (чем выше по дереву DOM, тем хуже), то в IE(6/7) событие даже не будет генерироваться.
Например поменяем для wndMain, то события вообще не будут генериться для его внутренних элементов и его самого(хоть какой кнопкой кликать).
Дело не в нюансах, у вас проблема с версткой, точнее с перекрытием элементов, barStatus если позиционировать абсолютно перекрывает barTitle на которорый и вешается событие. а по причине того, что элементы друг в друга не вложены всплытия события не происходит.
P.S. Знаю что некропост, просто такие комменты могу ввести в заблуждение тех кто этот инструмент (javascript) осваивает.
Отличная статья!!! Доходчиво изложено и с примерами
Хотелось бы видеть развитие темы, углубление. В связи с этим появился вопрос. В статье было сказано что...
При установке обработчиков методами attachEvent/detachEvent this внутри обработчика всегда указывает на объект window и совершенно бесполезен.
Поэтому при использовании этих методов в библиотеках и фреймворках добавляется дополнительная "обертка для обработчика", устанавливающая правильный this.
Приведите, пожалуйста, пример реализации "обертки" или посоветуйте где об этом можно почитать?
// Обработчик для mouseout
function mouseoutHandler(event) {
event = event || window.event
var relTarg = event.relatedTarget || event.fromElement;
// relTarg - элемент, на который перешел курсор мыши
}
Универсальный кроссбраузерный способ обработки событий:
/*el - элемент, на который вешаем событие,
evnt - тип события,
func - обработчик*/
function addEvent(el, evnt, func){
if (el.addEventListener) {
el.addEventListener(evnt.substr(2).toLowerCase(), func, false);
} else if (el.attachEvent) {
el.attachEvent(evnt.toLowerCase(), func);
} else {
el[evnt] = func;
}
}
//массив типов событий
var events = new Array("onMouseOver", "onMouseout", "onclick");
//вешаем обработчики на все события на объект targt
function attachEvents(targt) {
for (evnt in events) {
addEvent(document.getElementById(targt), events[evnt], CatchEvent);
}
}
function CatchEvent(event) {
var event = event || window.event;
var target = event.target || event.srcElement;
var classNm = target.className;
var tag = target.tagName;
switch (event.type) {
case "mouseover":
break;
case "mouseout":
break;
case "click":
break;
}
}
Объясните пожалуйста,
если у DOM элемента несколько свойств,
на которые повешены обработчики событий мыши,
то в какой последовательности они будут срабатывать?
Например при наведении на него и щелчке мыши:
onmouseover
onmousedown
onfocus
onclick
так верно?
и еще, чем отличается onmouseover="return fun1(arg1,arg2)"
от onmouseover="fun1(arg1,arg2)"
и куда собственно эти функции возвращают значение(если возвращают)?
В Internet Explorer существует глобальный объект window.event, который хранит в себе информацию о последнем событии. А первого аргумента обработчика просто нет.
это не так. еще ие6 вполне корректно выполнял строчку
var f=function(e){alert(e.type+"\n")};
window.attachEvent ? document.getElementById("div").attachEvent("onclick",f) : alert("не ie");
function preview(e) {
if (!e) e = window.event;
var element = e.target || e.srcElement;
if (element.id.match(/^idElement$/)) {
window.alert('Вы кликнули на элементе с ID = "idElement"');
// Выполняем необходимые действия для элемента с ID равным "idElement"
}
// Ну и так далее...
}
document.onclick = preview;
Доброго всем дня!!!
Объясните пожалуйста для "чайников" как правильно кроссбраузерно остановить всплытие?... на своих примерах получается только для IE сделать или только для FF...
Все дело в разнице генерации страницы браузерами. В этой статье специально было выделено в рамочку: "Все вызовы типа getElementById должны запускаться после описания соответствующего HTML-узла, а лучше - после окончания загрузки страницы.
Иначе узел просто не будет найден."
Судя по описанной вами проблеме, строчка:
var el = document.getElementById('wc')
Выполняется до того как сгенерится сам элемент. И следовательно выполнится:
var el = document.getElementById('wc');
alert(el); // Вот тут будет undefined
И корректно (вернее не корректно, а так чтобы работало) обработает только Опера. В остальных браузерах скрипт упадет в ошибку. А вот если перенести скрипт в конец, то все будет работать.
Здравствуйте, подскажите пожалуйста как организовать таку вещь:
мне нужно что бы при окне браузера развернутом не в максимайзе(т.е. не на весь экран) и при этом стрница находится в граничном положении(самый низ/верх/право/лево) при расширении окна вручную(когда наводишь на грань браузера и начинаешь ее увеличивать как хочешь) в сторону от границы наружу, сторона приклеевалась к стороне браузера, помогите плз...
В каких случаях alert() может выскакивать дважды?
Удивляет цепочка: post - alert ('ушло') - OK - alert ('ушло') -OK
Странно, что не 3 раза выскакивает - было бы ещё веселее ...
На самом деле, capturing в IE использовать можно. Ограничений масса: метод расчитан только на события мыши, перехват теряется при потере окном фокуса, геморройная работа с preventDefault и масса других факторов.
Но если в целом, это вкупе с альтернативными макрософтовыми событиями (напр. activate и deactivate — такие же focus и blur, только бабблятся) может помочь сделать более-менее вменяемую эмуляцию capturing.
Не пугайтесь: в IE6 этот код может вызвать блокировку окна.
Под диспетчером (dispatcher) подразумевается некий корневой элемент, собирающий события, и потом обрабатывающий их с учетом (e.srcElement||e.target), т.е., непосредственно практическое применение capturing.
Автор:
"Все вызовы типа getElementById должны запускаться после описания соответствующего HTML-узла, а лучше - после окончания загрузки страницы.
Иначе узел просто не будет найден. " Тогда почему в
document.getElementById('myElement').onclick = function() {
alert('Спасибо')
}
Нашел статью по запросу getElementById. Сам щас пишу скрипт, и не могу прикрутить событие к iframe по onKeyUp.
Хорошая статья, но у меня в браузере не работают Ваши примеры с getElementById, даже с textarea, даже большая половина с вашего сайта не работает - странно...
У меня 7 ИЕ. Ни че не понимаю.
"Кликни меня
При клике перехода не произойдет, а рамка вокруг ссылки появится."
var a = document.getElementById('my-focus-a')
a.onfocus = a.onclick = function() {
// другая кроссбраузерная запись остановки события
e.preventDefault ? e.preventDefault() : (e.returnValue=false)
Сколько не вчитывался в статью и приведенные в кометариях примеры, так и не смог понять как сделать в приведенном ниже примере так. Что бы событие срабатывало только для первого элемента, но не страбатывало для вложеных в него.
Понятно что div c id="d2" наследует событие от div c id="d1", и div c id="d3" наследует событие от div c id="d2"
Но из статьи я так и не понял как ОСТАНОВИТЬ срабатывание события на "дочерних" к первому элементах, или если сказать по другому... как запретить наследование события "дочерними" элементами.
Небольшое уточнение к моему предыдущему посту, цель не просто остановить обработку событий, это можно было бы просто организовать через:
document.getElementById('d2').onmouseover = function(e)
{
if (!e) e = event || window.event; // кросс-браузерно
{
e.cancelBubble = true;
if (e.preventDefault) e.preventDefault();
}
}
А сделать страбатывание Алерта в любом случае, даже когда onmouseover происходит над областями даже перекрытое Div с id="d2" и id="d3"
Еще раз... алерт должен выполнится только один раз, при наведении на любой из DIV'ов, учитывая что обработка события запускается с старшего в ерархии элемента.
Простите, не заметил, что вы уточнили свой вопрос, и он изменился по сути. Впрочем, все же рассмотрим еще раз способ решения того вопроса, так как предложенный выше был неудачен. Соответственно, это относится и к этому вашему посту. В случае, если бы у корневого дива имелся не 1 потомок 1-го уровня, а несколько, то пришлось бы для каждого из них прописывать такой обработчик, который вы и предложили. В этом случае лучше всего проверять target(srcElement) в обработчике корневого дива. И если className(ну или id, если по нему проверять) не совпадает с таковым у корневого дива - то ничего не делать.
Теперь перейдем собственно к вашему вопросу. Для удобства понимания сути проблемы лучше переформулировать задачу так: mouseover не должен вызываться в случае, если переход мыши осуществляется между потомками одного корневого элемента(или между потомками и самим корневым элементом). Теперь способ решения становится очевиден. В обработчике корневого элемента производится проверка target и relatedTarget(toElement и fromElement). Если оба объекта имеют общим предком корневой элемент, то обработчик ничего не делает.
Помогите пожалуйста
есть такая функция(код из вашей статьи)
function position(){
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
var message = document.getElementById("my-message")
message.style.top = scrollTop + 'px'
message.style.left = scrollLeft + 200 + 'px'
}
эта функция присваивается событию onScroll,в идеале нужно чтобы при прокручивании скрола,блок "my-message" оставался на месте,но при этом он перескакивает-как это можно исправить?
М... Есть возможность поверять, находится ли курсор мыши над объектом? Предположим, функция запускается, когда над объектом курсор мышки, в ней есть задержка, и некоторая другая функция запускается после этой задержки, но в случае, если курсор мыши остался над объектом. Как проверить?
function hidelem() {
document.getElementById('but').disabled = "disabled"
}
Вообще понять не могу... У меня в браузере кнопка не получила никакого события... Страница загрузилась и сразу "Не активный кнопкоо! ))"... Почему так? При том такая ситуация только в FF 3.5... Opera, Chrome, Safari выполняют скрипт именно так, как я ожидаю. В IE не пробовал.
Привет
Не работает потому что
1. addEventListener в качестве первого параметра принимает имя события без префикса on h.addEventListener("click", p, false);
2. li с обработчиком event.stopPropagation() перекрывает распространиение события к предку, попробуйте раскрасить список и все станет очевидно. Красная область кликабельная, так как клик происходит непосредственно на элементе ul, а вот синяя перекрытая stopPropagation и алерта нету.
<ul id="pip" style="background: red;">
<li id="mum" style="background: blue;"><a href="#">JavaScript</a></li>
</ul>
function p(event){alert('hi')}
h = document.getElementById('pip')
h.addEventListener("click", p, false)
document.getElementById('mum').onclick=function(event){
event.stopPropagation()
}
Привет!Елки!насчет stopPropagation так задумано и было, опробовать хотел, останавливает он событие только для себя, или также и всплытие дальше по дереву DOM, а вот с "click" вместо "onclick" - спасибо, невнимательность, сейчас в статье повнимательнее глянул, так и есть.В общем благодарю!
Мне надо заблокировать все события на странице, в особенности onmousedown, onkeydown (onclick, ondblclick тоже). Чтобы и мышка, и клавиатура страницей на какое-то время не обрабатывалась. Как это сделать?
Такая штука не срабатывает (explorer игнорирую):
var condition = true;
function prevent(e) {
if (condition) { // заблокировать действия пользователя пока идет какой-либо процесс
if (e.stopPropagation) e.stopPropagation();
if (e.preventDefault) e.preventDefault();
return false;
}
}
document.onmousedown = function (event) { prevent(event); }
document.onkeydown = function (event) { prevent(event); }
document.onclick = function (event) { prevent(event); }
document.ondblclick = function (event) { prevent(event); }
Мне надо заблокировать все события на странице, в особенности onmousedown, onkeydown (onclick, ondblclick тоже). Чтобы и мышка, и клавиатура страницей на какое-то время не обрабатывалась. Как это сделать?
Вариант 1. Вернуть false при возникновении события.
Пример:
но в таком случае вложенные элементы со своими событиями будут отрабатывать (из-за перехвата).
Вариант 2. Заблокировать клики мыши лежащим слоем overlay по верх всех элементов.
Пример:
У меня такой вопрос: допустим написал свою очень нужную функцию (myfunction), приаттачил к HTML такой файлик:
function myfunction()
{
//....
}
document.onload = function() {
if (...) myfunction()
}
Далее написал еще одну функцию и приаттачил еще один подобный файлик. Ясно что я переопределил событие onload для document и работать будет только вторая функция. Ну а что же делать когда я прикручу jQuery? Получается будет работать только что-то одно. Не хочется в конец HTML перед тегом < /body> вставлять < script> if (...) ...; if (...) ...;< /script> Как обойти не навредив другим скриптам и чтоб все в onload влезло? Писать перед < body> : этот злосчастный < script> c "ифами"? — выход, но я не знаю что случится если я прикручу стороннюю библиотеку которая может переназначить событие onload! Или в этих умных библиотеках как то все по другому и они onload не трогают?
Виноват, насчёт ошибки - сгрешил.
Но результат тот же.
Можно, конечно, пробежаться по значениям всех других кнопок.
Их состояние даётся реальное.
И методом исключения, так сказать, установить состояние кликнутой кнопки до клика.
Но как-то это коряво.
Сам себе говорю - глупость сморозил.
В функцию по клику передаются уже изменённые значения радиокнопок.
Поэтому всегда TRUE.
Никакого другого выхода кроме как запоминать кликнутую кнопку в переменной не проглядывается.
Тогда в функции можно определить повторное нажатие той же кнопки
Не очень понял смысл return false в этом примере (да и вообще отличия в работе, когда для остановки действия по умолчанию используется возврат, от метода preventDefault и свойства returnValue):
function handler(e) {
e.preventDefault() // браузер - стоять
e.stopPropagation() // событие - не всплывать
return false // и вообще, мне больше ничего не надо
}
preventDefault останавливает действие браузера по умолчанию, зачем еще false возвращать?
Подскажите плиз, как реализовать следующую задачу:
На сайте есть окно для ввода текста с применением тега input и ниже текстовая гиперссылка. необходимо чтобы она отправляла на две разные страницы: в первом случае - при вводе в окно определенного слова или значения - на одну страницу, во втором случае - при вводе любых других слов или значений - на другую страницу.
Очень нужно, помогите пожалуйста с кодом! Зараннее благодарен!
Привет,
пытаюсь повторить ваш пример и не получается . Событие не назначается. Т.е. я нажимаю на кнопку, а сообщение с текстом "test" не появляется.
<head>
</head>
<body>
<script>
var y = document.getElementById("t");
y.onclick= function tt() { alert("test") }
</script>
<input type ="button" id="t" value = "ok" />
</body>
Здравствуйте!
Сразу скажу, что я не кодер (или не скриптер, как это у вас правильно сказать не знаю, не программист в общем), я дизайнер.
Но не думайте, я именно по теме пишу! Вопрос касается объект события - window.event.
Мне в работе моей частенько помогает одна страничка, уж не помню где добытая. Она подбирает более менее приемлемую цветовую гамму на основе одного цвета. Но есть одна загвоздка: на отрез отказывается работать в FF и замечательно пашет в IE. Из-за моей ненависти к ослику (как это у меня так сдержанно получилось!? %) без мата даже) я решился-таки на изучение js (ну, изучение - это сильно сказано).
Цель простая: понять, где мелкософтовская собака зарыта в том коде, и исправить этот код. Причём замечу, мне хочется исправить не на кроссбраузерность, а именно так, чтоб в FF всё работало а в ie - кукиш!
Кстати, тег мета сообщает, что штуковина сгенерирована фронтпэйдем, может это важная информация для вас.
Для себя я уже выделил в одтельные файлы таблицу css (отредактировав её не мало) и скрипт js (который изначально был одной строчкой, мной же отстркуктурирован в более читабельный вид переводами строк)
Здесь попытаюсь представить код, изначальный, но скрипт для вас же вставлю отструктурированный.
Я выделил в предыдущем посте строки, на которые ругается FireBug - мол window.event is not defined
Я пробовал и с этой страницы кроссбраузерную примочку применить, пробовал даже прикрутить event.js с вашего же сайта.
Я сдаюсь, не понимаю как это вылечить.
А программка эта очень нужна (часто в момент общения с заказчиком нужно пожонглировать цветовыми гаммами).
Помогите переделать этот скрипт в скрипт для FireFox (желательно, чтоб ie при этом отвалилось!)
Было бы вообще супер, если бы я ещё и понял, как лечение прошло! Потому что, меня js заинтересовал в процессе чтения этого самоучителя.
Кстати, огроное спасибо Илье, автору самоучителя!
И конечно же тем спасибо, кто в проблеме моей мне поможет)
Подскажите пож. Хотел посмотреть, как можно менять надпись на кнопке, оперативно. Не стал заморачиваться, немного изменил код кролей. Где ошибка? Я хотел что бы после нажатия, надпись на самой кнопки поменялась, а не выскакивал в отельном окне. Спасибо.
function count_rabbits() {
onclick="this.style.value = "спасибо"
}
Да, действительно. Такая строка была допустима в ActionSсript , так как там изначально скрипт можно расположить в теле объекта и его ID использовано по умолчанию, без дополнительно указания.
Буду искать книги по JS, на сайте материал хороший, но структура и объяснения хромают. Нужны базовые навыки JS для понимания.
Очень хочется понять как реализовать самому событие mouseenter из jQuery. Я так понимаю, что весь фокус в игре со всплытием и перехватом событий, только вот ничего не приводит в нужному результату.
У кого нибудь есть идеи, или все пользуются jQuery mouseenter и даже не задумываются как это работает?
Мне нужно прикрутить к ним обработчик onclick "processor_javascript".
При этом если в браузере включено исполнение javascript, то мне не нужно обращаться к "processor_php", а все обрабатывать в "processor_javascript".
а вот здесь я наблюдаю что этим методо пользуется только IE , Opera также использует метод addEventListener как и Firefox , так что получается Opera в первую очередь использует этот метод.
<div id='id1' style='background:#ccc'> sfcsdf</div>
<script type="text/javascript">
func = function(){alert('result');}
window.onload = function(){
var el = document.getElementById('id1');
if(el.attachEvent){
el.attachEvent('onclick',func);
alert('browser ie or opera');
}else if(el.addEventListener){
el.addEventListener('click',func,false);
alert('all browsers without IE');
}
}
</script>
Здравствуйте, у меня вопрос. Если присвоить событию анонимную функцию, как передаваемые параметры function(arg1,arg2...) будут интерпретироваться в событии
document.getElementById('button').onclick = function() {
alert('Клик')
равнозначно строке ниже.
Только HTML:
Спасибо за статью. Хотелось бы уточнить некоторые моменты.
В этом смысле следующие два кода эквивалентны:
function handler(event) {
...
return false
}
function handler(event) {
...
if (event.preventDefault) {
event.preventDefault()
} else {
event.returnValue = false
}
}
Для основных обработчиков событий (не назначенных с помощью addEventListener) эти два кода полностью эквивалентны? Или есть разница?
И какие ещё стандартные объекты, кроме event, доступны в атрибутах?
И чтобы не появлялись контуры вокруг объектов, нужно определять css свойства:
Потому что клик происходит по изображению, то есть, если просто, то таргет - это объект вызвавший событие, а до элемента "а" просто "доходит" событие по всплытию или перехвату.
В колбеке "а" - это this. О порядке срабатывания события
Решение W3C работает во всех современных браузерах, кроме Internet Explorer.
Наверно, стоит добавить, что в последних версиях IE (по крайней мере, в IE 11 - точно) работает решение W3C, а вот прежнее решение MS (attachEvent) - больше не работает.
И "перехват событий" (capturing) - в IE 11 работает, а в статье говорится, что нет.
Пробую следующий код:
HTML-HEAD-SCRIPT
function showevent(a) {
alert(a);
alert("event" in window);
alert("tag: " + event.srcElement.tagName);
}
/SCRIPT-/HEAD-BODY-TABLE-TBODY-TR
TD onmousedown="showevent('first-param')">Событие mousedown
/TR-/TBODY-/TABLE-/BODY-/HTML
Работает одинаково в:
IE6
Opera 32.0
Google Chrome 45.0.2454.101 m
и говорит, что "event" in window == true.
Вопрос: если первым параметром передается объект event, то почему "a" не является объектом event?
function setupHandlers(root){
setAttributes(root, {
В особенности это ->
"onmouseup" : "handleMouseUp(evt)",
"onmousedown" : "handleMouseDown(evt)",
"onmousemove" : "handleMouseMove(evt)",
});
}
function setAttributes(element, attributes){
// doSomething
}
Здравствуйте. Скажите пожалуйста, почему в опере не работает , если нажатие на него осуществляется посредством . В хроме и мозиле все работает. Попытка увязать события клика по метке с кликом по кнопке безрезультатны. Я абсолютно узколобый в отношении JS (Паскалем всю жизнь занимался), пытаюсь разобраться и освоить. Буду весьма благодарен за консультацию. Интересуют лишь азы JS, без JQuery и прочих надстроек. Ваш сайт на редкость понятен и информативен, в отличие от остального мусора в Сети. С уважением, Amon.
Мероприятия - один из важнейших компонентов любого веб-сайта. Они могут варьироваться от торжественного posterdle открытия компании до flagle запуска продукта или даже праздника для сотрудников.
Хорошим подходом при работе с событиями является использование делегирования событий, когда обработчик события добавляется к родительскому элементу, который "слушает" события всех своих дочерних элементов. bluey
Спасибо за статью.
Эта часть наверное самая важная для понимания javascript
Полностью согласен, давно ждал подобной статьи. Огромное спасибо.
Статья супер, адрес в избранное
А вы знаете что когда вы нажимаете посмотреть! на одном из скриптов происходит xss атака??у меня просто защита стоит(noscript) всем посоветую
А вы знаете что когда вы нажимаете посмотреть! на одном из скриптов происходит xss атака??у меня просто защита стоит(noscript) всем посоветую
А если в FireFox тег div не реагирует на onkeyup (press и т.п.), можно ли ему прописать обработчик на событие onkeyup?
div.addEventListener('keyup', function(){alert('Ура, я реагирую на нажатие клавиш!')}, false);
Вот еще один метод установки нескольких обработчиков событий, о котором не было сказано в статье:
И вызов данного метода:
А каким образом в данном подходе можно удалить один из вложенных обработчиков?
Например так:
т.е. alert('1'); произойдет лишь один раз, в момент первого клика, после оно никогда не повториться (сколько не кликай). Но при ситуации нескольких обработчиков на одно событие данный код начнёт разрастаться как снежный ком... И код может стать не универсальным...
Хотя, может кто из читателей сайта то придумает более симпатичное решение по удалению обработчика?
Непонятно как реализовать функционал detachEvent в таком подходе...
Ну если честно, то по-моему мнению, в хорошем коде вообще в событии стоит лишь вызов функции, реагирующих на событие и ни какой логики по обработке события! :-)
А показанный выше мной пример, скорее для того, что б все знали, что и такое тоже работает.
Сам думал долго над этим, но кроме варианта показанного чуть выше ничего не нашел.
--
С уважением, Владимир Вашурин
Отличная статья! Спасибо.
Есть еще нюанс, связанный со стилями для элементов. Если есть абсолютное позиционирование.
Например:
Если в стилях поменять position: relative на position: absolute для элемента (чем выше по дереву DOM, тем хуже), то в IE(6/7) событие даже не будет генерироваться.
Например поменяем для wndMain, то события вообще не будут генериться для его внутренних элементов и его самого(хоть какой кнопкой кликать).
Выложили бы что ли где-нибудь этот код. Я пока не понимаю, что такого IE делает не так.
У меня лично абсолютно позиционированные элементы обрабатывались всегда без проблем. Может, чего-то не заметил?
Дело не в нюансах, у вас проблема с версткой, точнее с перекрытием элементов, barStatus если позиционировать абсолютно перекрывает barTitle на которорый и вешается событие. а по причине того, что элементы друг в друга не вложены всплытия события не происходит.
P.S. Знаю что некропост, просто такие комменты могу ввести в заблуждение тех кто этот инструмент (javascript) осваивает.
Спасибо! Это лучший сайт по ява-скрипту! )))
Если необходимо прикрепить обработчик для события, передав ему параметры, специфичные для данного объекта, то как это сделать?
Например, при таком назначении в момент прикрепления сразу произойдёт вызов alert('test')
Если же вместо al('test') использовать function(){ al('test') }, то позже, как я понимаю, будет сложность снять этот обработчик?
Отличная статья!!! Доходчиво изложено и с примерами
Хотелось бы видеть развитие темы, углубление. В связи с этим появился вопрос. В статье было сказано что...
При установке обработчиков методами attachEvent/detachEvent this внутри обработчика всегда указывает на объект window и совершенно бесполезен.
Поэтому при использовании этих методов в библиотеках и фреймворках добавляется дополнительная "обертка для обработчика", устанавливающая правильный this.
Приведите, пожалуйста, пример реализации "обертки" или посоветуйте где об этом можно почитать?
Спасибо за статью, за существование этого сайта.
тут наверно вместо fromElement надо toElement;
Спасибо полезная информация особенно про захват
Методы
myElement.attachEvent("on" + событие, обработчик)
иmyElement.detachEvent("on" + событие, обработчик)
поддерживает не только IE, но и Opera
Универсальный кроссбраузерный способ обработки событий:
P. S.
В функции
targt - объект, поэтому запускать скрипт лучше вот так:
а функцию attachEvents записать вот так:
Да, ну и вызвать функцию main() в документе:
Объясните пожалуйста,
если у DOM элемента несколько свойств,
на которые повешены обработчики событий мыши,
то в какой последовательности они будут срабатывать?
Например при наведении на него и щелчке мыши:
так верно?
и еще, чем отличается
onmouseover="return fun1(arg1,arg2)"
от
onmouseover="fun1(arg1,arg2)"
и куда собственно эти функции возвращают значение(если возвращают)?
Вот не пойму никак, а чего событие onclick() можно только Id присваивать, всему классу одно событие нельзя?
Например:
Вот так работает:
А вот так нет:
Почему?
Потому что событие вешается на элемент, а функция
getElementsByClassName
, которая, кстати, не кроссбраузерная, возвращает *список* элементов.Событие можно повесить на каждый.
Кстати, селекторы библиотеки jQuery предоставляют возможность вешать обработчики на список.
Илья Кантор спасибо
Просто я уже третий день бьюсь вот над такой задачей:
И нужно присвоить одно событие onclick для всех ссылок. Не подскажете как это можно организовать?
Все решил задачу Спасибо за наводку, сам бы не догадался
никогда не задумывался и писал всегда "ev = ev || window.event".
но ведь "ev" не передается только если обработчик задан так
а если так то
те если нигде не ошибся то "ev = ev || window.event" совсем и не нужно когда речь идет о EventListener
В Internet Explorer существует глобальный объект window.event, который хранит в себе информацию о последнем событии. А первого аргумента обработчика просто нет.
это не так. еще ие6 вполне корректно выполнял строчку
Ещё один способ напоследок:
Доброго всем дня!!!
Объясните пожалуйста для "чайников" как правильно кроссбраузерно остановить всплытие?... на своих примерах получается только для IE сделать или только для FF...
у меня почему то
не работает нигде кроме Opera , не подскажете почему ? вот так у меня это реализовано :
в html документе
в javascript документе
да, кстати , когда javascript код переношу в html файл в конец
, то во всех браузерах(ff , opera , chrome, safari) работает нормально
Все дело в разнице генерации страницы браузерами. В этой статье специально было выделено в рамочку:
"Все вызовы типа getElementById должны запускаться после описания соответствующего HTML-узла, а лучше - после окончания загрузки страницы.
Иначе узел просто не будет найден."
Судя по описанной вами проблеме, строчка:
Выполняется до того как сгенерится сам элемент. И следовательно выполнится:
И корректно (вернее не корректно, а так чтобы работало) обработает только Опера. В остальных браузерах скрипт упадет в ошибку. А вот если перенести скрипт в конец, то все будет работать.
Здравствуйте, подскажите пожалуйста как организовать таку вещь:
мне нужно что бы при окне браузера развернутом не в максимайзе(т.е. не на весь экран) и при этом стрница находится в граничном положении(самый низ/верх/право/лево) при расширении окна вручную(когда наводишь на грань браузера и начинаешь ее увеличивать как хочешь) в сторону от границы наружу, сторона приклеевалась к стороне браузера, помогите плз...
В каких случаях alert() может выскакивать дважды?
Удивляет цепочка: post - alert ('ушло') - OK - alert ('ушло') -OK
Странно, что не 3 раза выскакивает - было бы ещё веселее ...
На самом деле, capturing в IE использовать можно. Ограничений масса: метод расчитан только на события мыши, перехват теряется при потере окном фокуса, геморройная работа с preventDefault и масса других факторов.
Но если в целом, это вкупе с альтернативными макрософтовыми событиями (напр. activate и deactivate — такие же focus и blur, только бабблятся) может помочь сделать более-менее вменяемую эмуляцию capturing.
Иллюстрация метода setCapture:
Не пугайтесь: в IE6 этот код может вызвать блокировку окна.
Под диспетчером (dispatcher) подразумевается некий корневой элемент, собирающий события, и потом обрабатывающий их с учетом (e.srcElement||e.target), т.е., непосредственно практическое применение capturing.
Автор:
"Все вызовы типа getElementById должны запускаться после описания соответствующего HTML-узла, а лучше - после окончания загрузки страницы.
Иначе узел просто не будет найден. " Тогда почему в
document.getElementById('myElement').onclick = function() {
alert('Спасибо')
}
вызов идет до создания кнопки?
Статья отличная.
Нашел статью по запросу getElementById. Сам щас пишу скрипт, и не могу прикрутить событие к iframe по onKeyUp.
Хорошая статья, но у меня в браузере не работают Ваши примеры с getElementById, даже с textarea, даже большая половина с вашего сайта не работает - странно...
У меня 7 ИЕ. Ни че не понимаю.
Не могли бы подробнее?
В примере
"Кликни меня
При клике перехода не произойдет, а рамка вокруг ссылки появится."
В IE8 сыпется иксепшн а в хроме нет рамки
Сейчас все ок ?
Почти В IE8 нет иксепшна - это хорошо.
Но теперь в IE8 клик на ссылке перекидывает на самый верх страницы. А в Chrome рамка так и не появилась.
Chrome не выделяет таким образом активные ссылки по стандарту.
Но можно сделать, добавив в css:
Аналогичным же способом данную пунктирную рамку можно убрать из firefox.
(P.S. Извиняюсь что не по коду, IE для меня пока не доступен.)
А в ie "перебрасывает" на верх страницы, наверное из-за #
Че то вообще ничего не понятно.... Когда начнется объяснение нормальное.. Может кто нить подкинет что нибудь по проще..Для новичка?7
С какого момента непонятно? Что непонятно?
Если честно только сейчас понял разницу между свойством и атрибутом ...)
А можно вопрос, использую
в FF срабатывает нормально, а в IE событие не присваивается
все разобрался для IE написал
Хороший сайт, но к сожалению ссылку на вас разместить негде. Но советовать буду обязательно.
Сколько не вчитывался в статью и приведенные в кометариях примеры, так и не смог понять как сделать в приведенном ниже примере так. Что бы событие срабатывало только для первого элемента, но не страбатывало для вложеных в него.
Понятно что div c id="d2" наследует событие от div c id="d1", и div c id="d3" наследует событие от div c id="d2"
Но из статьи я так и не понял как ОСТАНОВИТЬ срабатывание события на "дочерних" к первому элементах, или если сказать по другому... как запретить наследование события "дочерними" элементами.
Очень надеюсь на помощь знающих людей.
Вписать обработчик того же события для всех потомков первого уровня, в котором добавить event.stopPropagation()(для Лисы)
Небольшое уточнение к моему предыдущему посту, цель не просто остановить обработку событий, это можно было бы просто организовать через:
А сделать страбатывание Алерта в любом случае, даже когда onmouseover происходит над областями даже перекрытое Div с id="d2" и id="d3"
Еще раз... алерт должен выполнится только один раз, при наведении на любой из DIV'ов, учитывая что обработка события запускается с старшего в ерархии элемента.
Простите, не заметил, что вы уточнили свой вопрос, и он изменился по сути. Впрочем, все же рассмотрим еще раз способ решения того вопроса, так как предложенный выше был неудачен. Соответственно, это относится и к этому вашему посту. В случае, если бы у корневого дива имелся не 1 потомок 1-го уровня, а несколько, то пришлось бы для каждого из них прописывать такой обработчик, который вы и предложили. В этом случае лучше всего проверять target(srcElement) в обработчике корневого дива. И если className(ну или id, если по нему проверять) не совпадает с таковым у корневого дива - то ничего не делать.
Теперь перейдем собственно к вашему вопросу. Для удобства понимания сути проблемы лучше переформулировать задачу так: mouseover не должен вызываться в случае, если переход мыши осуществляется между потомками одного корневого элемента(или между потомками и самим корневым элементом). Теперь способ решения становится очевиден. В обработчике корневого элемента производится проверка target и relatedTarget(toElement и fromElement). Если оба объекта имеют общим предком корневой элемент, то обработчик ничего не делает.
О... нашел как проще обьяснить что мне нужно...
Нужен кросбраузерное решение - аналог функции onmouseenter
отличная статья, но меня интересует вопрос: можно ли из javascript управлять перемещением курсоры мышки?
нет
Помогите пожалуйста
есть такая функция(код из вашей статьи)
эта функция присваивается событию onScroll,в идеале нужно чтобы при прокручивании скрола,блок "my-message" оставался на месте,но при этом он перескакивает-как это можно исправить?
Для этого существует css правило position:fixed. А ИЕ6 бодро идет лесом
Ах, я вас так понимаю...
М... Есть возможность поверять, находится ли курсор мыши над объектом? Предположим, функция запускается, когда над объектом курсор мышки, в ней есть задержка, и некоторая другая функция запускается после этой задержки, но в случае, если курсор мыши остался над объектом. Как проверить?
Устанавливать флажок в событии mouseover. Снимать флажок в событии mouseout. В "некоторой другой" функции проверять значение флажка.
Гость, спасибо! Да, старею я, похоже...
Народ, как повесить событие на все строки ввода разом??
Что в этой шняге неправильно?
P.S. isMSIE() - функция, определяющая, уж не эксплорер ли это часом...
Вообще понять не могу... У меня в браузере кнопка не получила никакого события... Страница загрузилась и сразу "Не активный кнопкоо! ))"... Почему так? При том такая ситуация только в FF 3.5... Opera, Chrome, Safari выполняют скрипт именно так, как я ожидаю. В IE не пробовал.
Это проблема FF, как оказалось Разобрался
После данной статьи, я возненавидел окончательно и основательно, бесповоротно и навсегда IE!!!
В IE6 "йа кнопкоо" работает нормально.
Добрый вечер!Не могу понять, почему не работает обычный пример как в статье(в JS совсем еще зеленый), то есть при клике на #pip эффекта никакого
и соответственно html
Причем Лис FireBug'ом ошибок не выдает
Привет
Не работает потому что
1. addEventListener в качестве первого параметра принимает имя события без префикса on h.addEventListener("click", p, false);
2. li с обработчиком event.stopPropagation() перекрывает распространиение события к предку, попробуйте раскрасить список и все станет очевидно. Красная область кликабельная, так как клик происходит непосредственно на элементе ul, а вот синяя перекрытая stopPropagation и алерта нету.
Привет!Елки!насчет stopPropagation так задумано и было, опробовать хотел, останавливает он событие только для себя, или также и всплытие дальше по дереву DOM, а вот с "click" вместо "onclick" - спасибо, невнимательность, сейчас в статье повнимательнее глянул, так и есть.В общем благодарю!
Мне надо заблокировать все события на странице, в особенности onmousedown, onkeydown (onclick, ondblclick тоже). Чтобы и мышка, и клавиатура страницей на какое-то время не обрабатывалась. Как это сделать?
Такая штука не срабатывает (explorer игнорирую):
Виталя,
Вариант 1. Вернуть false при возникновении события.
Пример:
но в таком случае вложенные элементы со своими событиями будут отрабатывать (из-за перехвата).
Вариант 2. Заблокировать клики мыши лежащим слоем overlay по верх всех элементов.
Пример:
и 2 варианта вместе тоже можно применять.
У меня такой вопрос: допустим написал свою очень нужную функцию (myfunction), приаттачил к HTML такой файлик:
Далее написал еще одну функцию и приаттачил еще один подобный файлик. Ясно что я переопределил событие onload для document и работать будет только вторая функция. Ну а что же делать когда я прикручу jQuery? Получается будет работать только что-то одно. Не хочется в конец HTML перед тегом < /body> вставлять < script> if (...) ...; if (...) ...;< /script> Как обойти не навредив другим скриптам и чтоб все в onload влезло? Писать перед < body> : этот злосчастный < script> c "ифами"? — выход, но я не знаю что случится если я прикручу стороннюю библиотеку которая может переназначить событие onload! Или в этих умных библиотеках как то все по другому и они onload не трогают?
Спасибо автору сайта ответ нашел http://javascript.ru/tutorial/events/crossbrowser
Вопрос может быть и глупый, но...
На радиокнопку навешена функция
Выдаёт TRUE независимо от состояния кнопки до клика.
Собственно вопрос - как тогда узнать состояние кнопки?
а если так?
if($(this).is(":checked"))
Виноват, насчёт ошибки - сгрешил.
Но результат тот же.
Можно, конечно, пробежаться по значениям всех других кнопок.
Их состояние даётся реальное.
И методом исключения, так сказать, установить состояние кликнутой кнопки до клика.
Но как-то это коряво.
Сам себе говорю - глупость сморозил.
В функцию по клику передаются уже изменённые значения радиокнопок.
Поэтому всегда TRUE.
Никакого другого выхода кроме как запоминать кликнутую кнопку в переменной не проглядывается.
Тогда в функции можно определить повторное нажатие той же кнопки
Не очень понял смысл return false в этом примере (да и вообще отличия в работе, когда для остановки действия по умолчанию используется возврат, от метода preventDefault и свойства returnValue):
preventDefault останавливает действие браузера по умолчанию, зачем еще false возвращать?
На всякий случай.
Проясните пожалуйста один момент:
Зачем нужно event = event || window.event
если во всех браузерах, реализующих w3c, event и без того будет доступен в теле обработчика как первый параметр, а в IE - как глобальный объект?
То есть в каком таком случае код не заработает без этой строки???
В ослике не заработает.
Как видите event уже резервируется как локальная переменая перекрывая глобальную, а потому ту приходится получать через window.
Подскажите плиз, как реализовать следующую задачу:
На сайте есть окно для ввода текста с применением тега input и ниже текстовая гиперссылка. необходимо чтобы она отправляла на две разные страницы: в первом случае - при вводе в окно определенного слова или значения - на одну страницу, во втором случае - при вводе любых других слов или значений - на другую страницу.
Очень нужно, помогите пожалуйста с кодом! Зараннее благодарен!
Привет,
пытаюсь повторить ваш пример и не получается . Событие не назначается. Т.е. я нажимаю на кнопку, а сообщение с текстом "test" не появляется.
Необходимо поменять местами код кнопки и код скрипта. Код кнопки должен быть выше.
Здесь сначала один раз сработает alert(x), а потом всё время alert('2')
а здесь кнопка сработает всего лиш один раз
Здравствуйте!
Сразу скажу, что я не кодер (или не скриптер, как это у вас правильно сказать не знаю, не программист в общем), я дизайнер.
Но не думайте, я именно по теме пишу! Вопрос касается объект события - window.event.
Мне в работе моей частенько помогает одна страничка, уж не помню где добытая. Она подбирает более менее приемлемую цветовую гамму на основе одного цвета. Но есть одна загвоздка: на отрез отказывается работать в FF и замечательно пашет в IE. Из-за моей ненависти к ослику (как это у меня так сдержанно получилось!? %) без мата даже) я решился-таки на изучение js (ну, изучение - это сильно сказано).
Цель простая: понять, где мелкософтовская собака зарыта в том коде, и исправить этот код. Причём замечу, мне хочется исправить не на кроссбраузерность, а именно так, чтоб в FF всё работало а в ie - кукиш!
Кстати, тег мета сообщает, что штуковина сгенерирована фронтпэйдем, может это важная информация для вас.
Для себя я уже выделил в одтельные файлы таблицу css (отредактировав её не мало) и скрипт js (который изначально был одной строчкой, мной же отстркуктурирован в более читабельный вид переводами строк)
Здесь попытаюсь представить код, изначальный, но скрипт для вас же вставлю отструктурированный.
Не удаётся всё сразу, попытаюсь отдельно.
не запускается, как его запустить
C html вообще ничего не удалось вставить но внутри тела его есть вставки скрипров:
Я выделил в предыдущем посте строки, на которые ругается FireBug - мол window.event is not defined
Я пробовал и с этой страницы кроссбраузерную примочку применить, пробовал даже прикрутить event.js с вашего же сайта.
Я сдаюсь, не понимаю как это вылечить.
А программка эта очень нужна (часто в момент общения с заказчиком нужно пожонглировать цветовыми гаммами).
Помогите переделать этот скрипт в скрипт для FireFox (желательно, чтоб ie при этом отвалилось!)
Было бы вообще супер, если бы я ещё и понял, как лечение прошло! Потому что, меня js заинтересовал в процессе чтения этого самоучителя.
Кстати, огроное спасибо Илье, автору самоучителя!
И конечно же тем спасибо, кто в проблеме моей мне поможет)
только в IE ивентом является window.event
в нормальных браузерах ивент передается в функцию
привет, нужна помощь...
в функции сделал вот такой цикл
по идее после выполнения цикла при щелчке на любой ссылке должен всплывать ее номер, а у меня всегда выводится последний номер ссылки...
В чем проблема?? Зарание спасибо....
Классический пример на замыкания.
прочитал про замыкания, разобрался....
Подскажите пож. Хотел посмотреть, как можно менять надпись на кнопке, оперативно. Не стал заморачиваться, немного изменил код кролей. Где ошибка? Я хотел что бы после нажатия, надпись на самой кнопки поменялась, а не выскакивал в отельном окне. Спасибо.
Ошибка во второй строчке. Огромная такая ошибка. "Полнейшее незнание и непонимание JS" называется. Исправляется так.
Да, действительно. Такая строка была допустима в ActionSсript , так как там изначально скрипт можно расположить в теле объекта и его ID использовано по умолчанию, без дополнительно указания.
Буду искать книги по JS, на сайте материал хороший, но структура и объяснения хромают. Нужны базовые навыки JS для понимания.
Очень хочется понять как реализовать самому событие mouseenter из jQuery. Я так понимаю, что весь фокус в игре со всплытием и перехватом событий, только вот ничего не приводит в нужному результату.
У кого нибудь есть идеи, или все пользуются jQuery mouseenter и даже не задумываются как это работает?
Привет!
А подскажите пожалуйста, как с помощью указанных примеров добавлять данные в функцию, и можно ли вообще.
Скрипт для примера:
В Хроме ИЕ - работает в ФФ - нет,
а -
сообщает e=null во всех браузерах?
заранее спасибо )
Добрый день!
Задачка такая:
Есть ряд кнопок
в форме
Мне нужно прикрутить к ним обработчик onclick "processor_javascript".
При этом если в браузере включено исполнение javascript, то мне не нужно обращаться к "processor_php", а все обрабатывать в "processor_javascript".
Вроде все просто...
Запускаю (в FF), кликаю, а меня все равно отправляет в "processor_php".
При этом если тупо писать в тег
, то все работает как задумано - при включенном js - работает processor_javascript, при выключенном - processor_php.
Долго экспериментировал, нашел такую конструкцию (думаю что она кривая)
Можно ли как-то решить мою задачу способом form.childNodes[i].onclick = function(){}?
Спасибо.
Подскажите пожалуйста, а можно ли с помощью события onclick в теге <а> достать значение атрибута title и поместить его в переменную
Методы, предложенные Microsoft, работают только в браузерах Internet Explorer и Opera(она поддерживает метод Microsoft для лучшей совместимости).
Установка обработчика:
Удаление обработчика:
а вот здесь я наблюдаю что этим методо пользуется только IE , Opera также использует метод addEventListener как и Firefox , так что получается Opera в первую очередь использует этот метод.
Здравствуйте, у меня вопрос. Если присвоить событию анонимную функцию, как передаваемые параметры function(arg1,arg2...) будут интерпретироваться в событии
document.getElementById('button').onclick = function() {
alert('Клик')
равнозначно строке ниже.
Только HTML:
Спасибо за статью. Хотелось бы уточнить некоторые моменты.
Для основных обработчиков событий (не назначенных с помощью addEventListener) эти два кода полностью эквивалентны? Или есть разница?
И какие ещё стандартные объекты, кроме event, доступны в атрибутах?
И чтобы не появлялись контуры вокруг объектов, нужно определять css свойства:
>Способов передачи этого объекта обработчику существует ровно два, и они зависят от способа его установки и от браузера.
Почему в браузере firefox 22.0 ни один из них не работает? Существует какой-то еще способ для fiirefox'a или firefox не умеет работать с событиями?
"Заметим, что хотя даже если всплытие и действия по умолчанию остановлены, но другие обработчики на текущем элементе все равно сработают"
- как сделать чтобы другие обработчики на текущем элементе останавливали срабатывание первого обработчика ???
Объясните кто знает плиз
есть html
делаю
в результате в callback в event.target - img
почему?
Потому что клик происходит по изображению, то есть, если просто, то таргет - это объект вызвавший событие, а до элемента "а" просто "доходит" событие по всплытию или перехвату.
В колбеке "а" - это this.
О порядке срабатывания события
Не могу понять, почему кросс платформенная запись event = event || window.event вдруг превратилась в e = e || window.event. e - это эквивалент event?
В статье говорится:
Решение W3C работает во всех современных браузерах, кроме Internet Explorer.
Наверно, стоит добавить, что в последних версиях IE (по крайней мере, в IE 11 - точно) работает решение W3C, а вот прежнее решение MS (attachEvent) - больше не работает.
И "перехват событий" (capturing) - в IE 11 работает, а в статье говорится, что нет.
дата первого камента: 17 сентября, 2008 - 15:17
стало быть статья из тех времен, если не редактируется постоянно.
за 6 лет много чего поменялось.
Пробую следующий код:
HTML-HEAD-SCRIPT
function showevent(a) {
alert(a);
alert("event" in window);
alert("tag: " + event.srcElement.tagName);
}
/SCRIPT-/HEAD-BODY-TABLE-TBODY-TR
TD onmousedown="showevent('first-param')">Событие mousedown
/TR-/TBODY-/TABLE-/BODY-/HTML
Работает одинаково в:
IE6
Opera 32.0
Google Chrome 45.0.2454.101 m
и говорит, что "event" in window == true.
Вопрос: если первым параметром передается объект event, то почему "a" не является объектом event?
Может кто-нибудь объяснить эту конструкцию?
function setupHandlers(root){
setAttributes(root, {
В особенности это ->
"onmouseup" : "handleMouseUp(evt)",
"onmousedown" : "handleMouseDown(evt)",
"onmousemove" : "handleMouseMove(evt)",
});
}
function setAttributes(element, attributes){
// doSomething
}
Здравствуйте. Скажите пожалуйста, почему в опере не работает , если нажатие на него осуществляется посредством . В хроме и мозиле все работает. Попытка увязать события клика по метке с кликом по кнопке безрезультатны. Я абсолютно узколобый в отношении JS (Паскалем всю жизнь занимался), пытаюсь разобраться и освоить. Буду весьма благодарен за консультацию. Интересуют лишь азы JS, без JQuery и прочих надстроек. Ваш сайт на редкость понятен и информативен, в отличие от остального мусора в Сети. С уважением, Amon.
Мероприятия - один из важнейших компонентов любого веб-сайта. Они могут варьироваться от торжественного posterdle открытия компании до flagle запуска продукта или даже праздника для сотрудников.
Я попробую реализовать это на сайте run games, и, возможно, это сработает. Я долго искал это решение, спасибо за разъяснение.
Хорошим подходом при работе с событиями является использование делегирования событий, когда обработчик события добавляется к родительскому элементу, который "слушает" события всех своих дочерних элементов. bluey