
24.05.2010, 23:24
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
|
Аналог onactive (IE)
Хочу найти аналог события onactive (реализованное в IE), для Gecko.
Задача такая: необходимо определять parent, дети которого получили фокус. В IE событие onactive идеально подходит для этой задачи. Даже когда просто кликаешь по parent-у. Это и надо. Событие всплывает, parent определяется. У мозиллы есть два похожих события: DOMActivate и DOMFocusIn. Ни одно из них не генерируется ни при клике, ни при получении фокуса детьми parent-а. Т.к. стандартное событие onfocus не всплывает, я не могу отследить его на parent-е. Проходиться по детям ресурсоёмко, ненадёжно и глупо. Собственно вопрос такой: когда вообще возникают события DOMActivate и DOMFocusIn? Про второе я думаю, что его могут генерировать только те элементы, которые могут получать фокус, но опять же, оно не всплывает. Чем оно от onfocus отличается? Про первое я вообще не знаю, когда оно срабатывает...
Других, ближе к истине, событий я не нашел...
Последний раз редактировалось B~Vladi, 24.05.2010 в 23:30.
|
|

25.05.2010, 10:14
|
 |
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
DOMActivate
DOMFocusIn
Оба возникают на элементах, которые могут быть активными. Div, к примеру, активным быть не может.
|
|

25.05.2010, 11:05
|
 |
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
B~Vladi, на самом-то деле можно использовать focus + useCapture (впервые вижу, что это реально пригодилось  ):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="generator" content="Geany 0.18.1.1" />
<style type="text/css">
.content {
border: 1px solid green;
}
</style>
<script type="text/javascript">
function init() {
document.body.firstChild.addEventListener(
'focus',
function(e) {
var el = (e.target || e.srcElment),
v = el.value || el.innerText || el.textContent;
alert([e.type, v].join(' AND '));
},
true // important
);
}
</script>
</head>
<body onload="init()"><div class="content">
<p><input type="text" value="Input::Text" /></p>
<p><input type="button" value="Input::Button" /></p>
<p><button>Button</button></p>
<p><select>
<option value="1">first</option>
<option value="2">second</option>
</select></p>
<p><textarea>Textarea</textarea></p>
</div></body>
</html>
UPD Для Chrome + Safari нужен еще такой же бинд на DOMActivate, поскольку у них focus на button (input:button) не срабатывает.
Последний раз редактировалось e1f, 25.05.2010 в 11:19.
Причина: upd
|
|

25.05.2010, 17:25
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
|
e1f, спасибо. Действительно, не думал, что useCapture может пригодиться. А если вместо фокуса повесить только DOMActivate, чтобы везде работало... Надо попробовать.
|
|

25.05.2010, 17:32
|
 |
Профессор
|
|
Регистрация: 03.04.2009
Сообщений: 1,263
|
|
|
B~Vladi, DOMActivate в ФФ возникает не для всех контролов, я же давал линк:
Fires:
button, input:button, input:checkbox, input:file, input:image, input:рassword, input:radio, input:reset, input:submit
Does not fire:
input:text, select, textarea
|
|

25.05.2010, 20:16
|
 |
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
|
Я понял что не для всех. Будем экспериментировать.
|
|
|
|