Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Аналог onactive (IE) (https://javascript.ru/forum/events/9569-analog-onactive-ie.html)

B~Vladi 24.05.2010 23:24

Аналог onactive (IE)
 
Хочу найти аналог события onactive (реализованное в IE), для Gecko.
Задача такая: необходимо определять parent, дети которого получили фокус. В IE событие onactive идеально подходит для этой задачи. Даже когда просто кликаешь по parent-у. Это и надо. Событие всплывает, parent определяется. У мозиллы есть два похожих события: DOMActivate и DOMFocusIn. Ни одно из них не генерируется ни при клике, ни при получении фокуса детьми parent-а. Т.к. стандартное событие onfocus не всплывает, я не могу отследить его на parent-е. Проходиться по детям ресурсоёмко, ненадёжно и глупо. Собственно вопрос такой: когда вообще возникают события DOMActivate и DOMFocusIn? Про второе я думаю, что его могут генерировать только те элементы, которые могут получать фокус, но опять же, оно не всплывает. Чем оно от onfocus отличается? Про первое я вообще не знаю, когда оно срабатывает...

Других, ближе к истине, событий я не нашел...

e1f 25.05.2010 10:14

DOMActivate
DOMFocusIn
Оба возникают на элементах, которые могут быть активными. Div, к примеру, активным быть не может.

e1f 25.05.2010 11:05

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) не срабатывает.

B~Vladi 25.05.2010 17:25

e1f, спасибо. Действительно, не думал, что useCapture может пригодиться. А если вместо фокуса повесить только DOMActivate, чтобы везде работало... Надо попробовать.

e1f 25.05.2010 17:32

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

B~Vladi 25.05.2010 20:16

Я понял что не для всех. Будем экспериментировать.


Часовой пояс GMT +3, время: 18:27.