обработчик события

berkut

Новичок
обработчик события

как сделать так, чтобы обработчики события вызывались при изменения элемента самим js? т.е.
Код:
<select name="test" onChange="alert(this.options[this.selectedIndex])" id="my">
<option value="1">1</option>
<option value="2">2</option>
</select>
<a href="javascript: change()">CHANGE</a>
<script>
function change()
{
	document.getElementById('my').selectedIndex = 1;
}
</script>
вот .selectedIndex = 1 и прочее подобное не вызывают обработчик события.
 

berkut

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

dimagolov

Новичок
berkut
нифига не понял. а зачем автоматизированно? ради экономии одной строчки в change?

хотя... если очень любишь секс в гамаке, то запоминай прошлое состояние и по setInterval проверяй не изменилось ли....

п.с. а может тебе defaultSelected нужен?
 

berkut

Новичок
почему в гамаке стоя... мне кажется, вполне нормальное желание. вообщем есть жутко динамичная форма, для добавления картинок. типо:
<div id="src">
<input>... <input><select onchange="myFunc()"><input></div>
<button onclick="addNewImage()">
куча разных полей для 1 картинки. в зависимости от выбранного пункта в select, отображаются различные поля. а в addNewImage() я просто делаю $('src').cloneNode(true); $('src').parentNode.appendChild(newNode, null) - но при этом мне нужно сбросить состояние всей формы на исходное. я пробегаю по всем полям newNode и делаю defaultValue. а скатина обработчики полей не запускаетсю - т.е. невозможно восстановить исходное состояние. хотя я дятел комнатный, пока это писал, додумался изначально клонировать ноду, хранить и добавлять её - и с обработчиками ноль проблем, и чистить поля не надо. счтолько кода и насмарку. тьфу
 

Линка

Новичок
berkut
Код:
function change()
{
	document.getElementById('my').onchange();
	//или 
	//document.getElementById('my').change();
}
 

berkut

Новичок
круто. но я говорил _автоматизированно_, а тут руками нужно вызывать. это я и так знаю. что я хочу: чтобы скрипт как-бы эмулировал действия пользователя. например, на select-е висят 2 обработчика: onchange + onblur() - я о них не знаю. и допустим, мне понадобилось где-то, из какой-то библиотеки поменять selectedIndex, а в другой момент, мне захотелось сделать myPoorElement.blur() - и я не хочу знать, кто какие события понавешивал на элемент. Не хочу знать, какие строки моего кода, в принципе должны вызывать события. Но я так понял, что желания мои расходятся с суровой действительностью.
 

dimagolov

Новичок
berkut
по-моему в принципе изменение любых value из JS НЕ вызывают onchange. и это правильно. потому что если ты делаешь obj.value= "123", то ничего не мешает сделать obj.onchange() (если вешали по obj.onchange=func) или obj.fireEvent (если вешали через addEventListener/attachEvent). гараздо грустнее было бы разбираться кто сгенерил событие - пользователь или скрипт. потому что логика обработчиков событий в том, чтобы реагировать на действия пользователя. ну а уж проработать использование событий для взаимодействия разных скриптов должен программер, но только в том объеме, в котором ему нужно.
 

Линка

Новичок
berkut
что я хочу: чтобы скрипт как-бы эмулировал действия пользователя
Ну правильно.
Скрипт полностью эмулирует действия пользователя, а именно выбор чего-то из списка.
Про обработчики вы ничего не знаете, но система повела себя так как будто юзер выбрал что-то в селекте.
Код:
function My_func()
{
	document.getElementById('my').selectedIndex = 1;
	document.getElementById('my').onchange();
}
Или я непонимаю?
 

berkut

Новичок
ну нет,
но система повела себя так как будто юзер выбрал что-то в селекте.
в данном примере как-раз и не также она себя повела.
document.getElementById('my').selectedIndex = 1; - эмулирует действие юзера - выбор значения(мышой или клавишами). Но ведь если юзер это сделает, то обработчик запуститься сам, автоматически, а тут мне нужно руками прописывать:
document.getElementById('my').onchange(); - при этом, я должен узнать, а есть-ли у элемента обработчик события change - иначе ошибка.
Чтобы вызывать обработчики руками, я должен иметь ввиду, на какое действие какие обработчики могут вызываться, пройтись по списку, и вызвать, если он есть. зад полнейший.
dimagolov
dimagolov
гараздо грустнее было бы разбираться кто сгенерил событие - пользователь или скрипт.
это в принципе вообще ненужно. какая разница. есть элемент, есть обработчик события, в данном случае: при смене значения элемента, вызвать то-то, то-то. По логике, не должно волновать, кто вызвал обработчик - юзер своими махинациями или скрипт. К тому-же, если уж педантично придираться, юзер может набрать в адресной строке: javascript: $('myEl').selectedIndex = 5; - и ведь получается, что это ЮЗЕР собственоручно сменил значение, а обработчик не стартанёт.. _мне кажется_, что это принципиально не правильно. К тому-же, есть в ДОМ2=) возможность выйти на вызывающий объект. Но с другой стороны, опять пример в адресной строке: javascript: $('myEl').selectedIndex = 5; - кто вызвал действо???
 

Beavis

Banned
если хочешь чтоб работало как будто пользователь тыкает, делай
елемент.focus();
елемент.click();

т.е. вызывай функции которые эмулируют действия пользователя
а например document.getElementById('my').selectedIndex = 1 пользователя никак не эмулирует, он же не может взять и с пятого элемента за долю секунды переключиться на первый, например

пользователь что делает: устанавливает фокус, щелкает, выбирает нужное значение, опять щелкает... только проще всё таки вручную обработчик вызвать
 

berkut

Новичок
пользователь что делает: устанавливает фокус, щелкает, выбирает нужное значение, опять щелкает... только проще всё таки вручную обработчик вызвать
есть ещё и клавиатура: фокус, выбор(перебор стрелками значений), уход фокуса.
 

Линка

Новичок
berkut
как сделать так, чтобы обработчики события вызывались при изменения элемента самим js
ммм... что-то не могу понять...
document.getElementById('my').selectedIndex = 1;
Эта строчка javascript изменяет элемент? Да.
document.getElementById('my').onchange();
Эта строчка вызывет обработчик события? Да.

Что не так?

а в другой момент, мне захотелось сделать myPoorElement.blur() - и я не хочу знать, кто какие события понавешивал на элемент.
а что мешает проверить поцепили ли что то на этот обьект (есть ли метод blur)?
Код:
if(myPoorElement.blur){
	myPoorElement.blur();
}
Смотрите.
Вам захотелось вызвать метод blur обьекта myPoorElement;
Как в php делается? сначало посмотрим есть ли такой метод у обьекта , потом вызовим.
Не все ли равно, что делает метод blur ? если считаем что вы ничего не знаете об устройстве обьекта (тоесть кто что прицепил [дописал ручками] в этот метод)?

В чем я заблуждаюсь?
 

berkut

Новичок
аааа!!! брр=) вот шеф меня не понимает тоже)
Я говорил о полной автоматизации. Я ничего не хочу знать о том, какие обрабоотчики висят на элементе и что они делают - мне всёравно, главное чтобы срабатывали. НО! допустим я написал: document.getElementById('my').selectedIndex = 1;
во первых, я должен ЗНАТЬ, какое событие может породить это действо - в данном случае onchange. Второе, если юзер потыкает на выбранный элемент в списке - то onchange не срабатывает. Значит мне в своём коде ещё нужно написать проверку, равен-ли присваемый мною индекс текущему индексу:
Код:
var iWantToIndex = 1;
if (elem.selectedIndex != iWantToIndex) {
    elem.selectedIndex = iWantToIndex;
    if (elem.onchange)
        elem.onchange();
}
И хрен бы с этим select-ом, но элементы разные и мои действия над этими элементами разные - и каждый раз, я должен проверять, какие события может породить моё действие над элементом и обработать его.
 

BRat

o_0
Я ничего не хочу знать о том, какие обрабоотчики висят на элементе и что они делают - мне всёравно, главное чтобы срабатывали. НО! допустим я написал: document.getElementById('my').selectedIndex = 1;
а если такое написать в обработчике onchange ? Зацикливание получится. Руками оно надёжней.
 

BRat

o_0
ну тебе выше уже написали возможные недостатки, это просто ещё один
 
Сверху