выбор фильтрации фокуса при загрузке страницы

#javascript #html #internet-explorer-8 #dojo #setfocus

#javascript #HTML #internet-explorer-8 #dojo #setfocus

Вопрос:

почему следующий код не фокусирует filteringselect?

     <!DOCTYPE html>
    <html>
    <head>
    <script type="text/javascript" src="http://yandex.st/dojo/1.6.0/dojo/dojo.xd.js" djConfig="parseOnLoad: true"></script>
    <style type="text/css">
            @import "http://yandex.st/dojo/1.6.0/dijit/themes/claro/claro.css";
    </style>
    <script type="text/javascript">
    <!--
    dojo.require("dijit.form.FilteringSelect");

    dojo.addOnLoad(function(){
        dijit.byId('dept').focus();
    });

    -->
    </script>
    </head>
    <body class="claro">
    <select name="dept" id="dept" dojoType="dijit.form.FilteringSelect" >
        <option value=""></option>
        <option value="test">test</option>
        <option value="test1">test1</option>
    </select>
    </body>
    </html>
  

Я пробовал это с ie7 и firefox 3/4 — это работает.
но в ie8 это не удается:-(

может ли это быть ошибкой dojo — или я делаю что-то не так?
когда запускается dojo.addOnLoad()? после того, как DOM будет готов или после того, как все виджеты будут должным образом инициализированы?
с уважением

герхард

Ответ №1:

это очень интересная ошибка.. я провел небольшое исследование и нашел решение. возможно, это выглядит как «грязный взлом», но все же это может вам помочь.

вы можете просто добавить время ожидания:

 dojo.addOnLoad(function () {
        setTimeout(function () { dijit.byId('dept').focus() }, 400);
});
  

Пользователь не замечает, но это дает IE передышку.

Для меня это работает в IE8

Комментарии:

1. Интересно, что когда я пытаюсь это сделать, кажется, что даже установка 0 в качестве тайм-аута работает — это говорит о том, что достаточно просто отложить эту строку кода до завершения процесса ready. Не уверен, зачем это необходимо (и, по-видимому, конкретно только в IE 8); отвечая на вопрос Герхарда, обратные вызовы addOnLoad / ready выполняются после (1) готовности DOM (или window.onload в версиях, которые не поддерживают DOMContentLoaded ), (2) загрузки всех dojo.require общих модулей на данный момент и (3) если parseOnLoad значение true, анализатор запущен и виджеты запущены.

2. дальнейшие исследования вчера привели меня к тому же выводу. я поищу похожую ошибку в dojo-trac или создам новую!

Ответ №2:

Я не уверен, какие браузеры полностью поддерживают это, но вы могли бы попробовать:

 <select name="dept" id="dept" dojoType="dijit.form.FilteringSelect" autofocus>
  

Кроме того, я не понимаю, почему вы используете Import оператор, если вы могли бы просто использовать тег link:

Перед:

 <style type="text/css">
    @import "http://yandex.st/dojo/1.6.0/dijit/themes/claro/claro.css";
</style>
  

После:

 <link rel="stylesheet" type="text/css" href="http://yandex.st/dojo/1.6.0/dijit/themes/claro/claro.css"> 
  

Комментарии:

1. Я сомневаюсь, что autofocus это даст эффект, поскольку этот select тег в конечном итоге будет заменен виджетом FilteringSelect, который не распознает ни одного autofocus атрибута.