Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как установить фокус на элемент в webBrowser'e?


Автор: Yama 28.11.2006, 14:01
Есть список всех HTML-тегов. Надо при выборе какого-либо тега из списка установить фокус в webBrowser'е на этот элемент. Подскажите, плз, кто знает. и, по возможности,  smile . 

Автор: smartov 28.11.2006, 14:23
Ну не все элементы могут иметь фокус, только те, в которых возможен ввод или объекты - все input, textarea например.
С ними все просто - элемент.focus()
Код

<input type="text" id="findMe" value="Text">

<script>

document.getElementById('findMe').focus();

</script>

Автор: Yama 28.11.2006, 15:32
smartov, это то понятно. Но как быть с теми элементами, у которых нет ID? это гиперссылки, имейджи и т.д. . Можно, конечно, присвоить всем айди, но тогда скрипты не работают smile . Если присвоить айди всем, у кого его нет - тогда можно.... но, как я говорил, у нас имеется просто набор тегов, получаемый из webBrowser1.Document.All уже не в HtmlElementCollection а, в String. Как при таком условии устанавливать фокус?

Автор: smartov 29.11.2006, 00:08
Yama, читаем доку и находим smile
Код

var inputs = document.getElementsByTagName('input');

В inputs имеем все элементы тега input на странице. Делаем с ними все, что хочется.

Автор: Yama 29.11.2006, 11:07
Цитата(smartov @ 29.11.2006,  00:08)
Yama, читаем доку и находим smile
Код

var inputs = document.getElementsByTagName('input');

В inputs имеем все элементы тега input на странице. Делаем с ними все, что хочется.

Эх, если бы мне были нужны только инпуты, я бы не создавал топик smile . Мне нужен фокус на ЛЮБОМ элементе в webBrowser'e. Вот как это сделать...  smile 

Автор: smartov 29.11.2006, 12:10
Yama
Цитата(Yama @  29.11.2006,  10:07 Найти цитируемый пост)
Мне нужен фокус

А луну с неба на любом элементе не надо? smile
Что ты подразумеваешь под фокусом и как тебе браузер поставит фокус на элемент <br> например ?

Автор: Yama 29.11.2006, 12:49
Луну не надо, т.к. если упадет на землю, тут никому мало не покажется, так что пускай висит там, где есть smile . А на счет фокуса вот что я тебе скажу:
1) <td> - это контейнер для элемента, который отображается на экране, так что, по крайней мере, по теории должно давать фокус на <td>......[тут наш фокус]......</td> . 

Редактирую - на контейнеры <td>..</td> фокус действительно ставит!

2) 
Код

//присваиваем всем элементам ID + объявляем добовляем обработчик события Focusing для веббраузера
private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            richTextBox1.Text = "webBrowser1_DocumentCompleted_1 event";
            int count = 0;
            foreach(HtmlElement el in webBrowser1.Document.All){
                if (webBrowser1.Document.All[count].Id==null)
                webBrowser1.Document.All[count].Id = webBrowser1.Document.All[count].OuterHtml;
                count++;
            };
            webBrowser1.Document.Focusing += new HtmlElementEventHandler(Document_Focusing);
        }

//собственно, сам обработчик focusing, что бы можно было наглядно посмотреть, какие на данный момент Id у элементов

        void Document_Focusing(object sender, HtmlElementEventArgs e)
        {
            richTextBox1.Text = richTextBox1.Text+"\n"+webBrowser1.Document.ActiveElement.Id + " - Id";
        }

Все работает.
Проверял сам. Только скрипты на страницах глючат, т.к. они к Id привязаны.
Если бы со скраптами проблем небыло - небыло бы и этого торика  smile 

3) Фокус на любой HTML элемент в веббраузере реализован в тестКомплите, только как - я не знаю. Поэтому изобретаю велосипед, но все-таки надеюсь, что кто-то его уже изобрел, поэтому http://forum.vingrad.ru/index.php?showtopic=124098&view=findpost&p=939835

4 и самое важное ) Надо реализовать фокус на НТМЛ-элемент в вебБраузере НЕ ИЗМЕНЯЯ содержимое документа, т.е. НЕ переопределяя НИ ОДИН тег. 

З.Ы. а луну не трогай smile Пусть себе висит там, где есть. Она мне и так нравится smile 

Автор: ivashkanet 29.11.2006, 13:02
Можно я чуть чуть влезу?
Yama, тебе нужен именно фокус, или достаточно переместить страницу к нужному элементу?
можно это скомбинировать: если для элемента возможен фокус, то фокус на него, если нет --- то просто передвигаем страницу на него.

Автор: Yama 29.11.2006, 13:06
Хммм... вариант. У webBrowser'a есть еще фокус по координатам...
если подскажешь, как сделать то, что ты сказал - будет просто замечательно smile

З.Ы. ты не влез smile . Это же форум smile))))))))))

Автор: ivashkanet 29.11.2006, 13:29
Цитата(Yama @  29.11.2006,  12:06 Найти цитируемый пост)
если подскажешь, как сделать то, что ты сказал - будет просто замечательно 

Знал бы --- сказал бы  smile 
Но с броузером не работал ни разу  smile 
Это просто были мысли.
P.S. 
Цитата(Yama @  29.11.2006,  12:06 Найти цитируемый пост)
З.Ы. ты не влез smile . Это же форум smile)))))))))) 

Да я, это  smile , просто так сказал  smile 

Автор: smartov 29.11.2006, 13:42
Цитата(Yama @  29.11.2006,  11:49 Найти цитируемый пост)
фокус действительно ставит!

ставит фокус или перемещает (скроллит) страницу к этому месту. Ты понимаешь что это две большие разницы, как говорят в Одессе?
На счет скролла должны быть довольно нативные функции (даже у js это делается простым scrollTo); получить позицию нужного элемента думаю для тебя не трабл.

Автор: Yama 29.11.2006, 13:43
Цитата(ivashkanet @ 29.11.2006,  13:29)
Цитата(Yama @  29.11.2006,  12:06 Найти цитируемый пост)
если подскажешь, как сделать то, что ты сказал - будет просто замечательно 

Знал бы --- сказал бы  smile 
Но с броузером не работал ни разу  smile 
Это просто были мысли.

Ок! Идея хорошая. Буду развивать. 
Когда реализую фокус - выложу код.

З.Ы. За любую помощь - БОЛЬШОЕ СПАСИБО!
З.З.Ы. Одна голова хорошо, 2 - лучше, а 3 - вообще замечательно! - сказал Змей Горыныч...
З.З.З.Ы. Тааак, а почему у этого велостпеда колеса квадратные?.. Что бы по булыжникам лучше ездить было, да? Ну-ну, сейчас круглые делать будем, посмотрим, что получится...

Добавлено @ 13:46 
Цитата(smartov @ 29.11.2006,  13:42)
ставит фокус или перемещает (скроллит) страницу к этому месту. Ты понимаешь что это две большие разницы, как говорят в Одессе?
На счет скролла должны быть довольно нативные функции (даже у js это делается простым scrollTo); получить позицию нужного элемента думаю для тебя не трабл.

Хммм... на <td>..</td> действительно фокус ставит.
На счет скроллинга - спасибо за идею. еще +1. 
Если не сложно, можешь сделать пример со скроллингом?

Автор: smartov 29.11.2006, 14:35
Цитата(Yama @  29.11.2006,  12:43 Найти цитируемый пост)
Если не сложно, можешь сделать пример со скроллингом? 

На C# нет smile на js без проблем smile

Автор: Yama 29.11.2006, 15:25
Цитата(smartov @ 29.11.2006,  14:35)
Цитата(Yama @  29.11.2006,  12:43 Найти цитируемый пост)
Если не сложно, можешь сделать пример со скроллингом? 

На C# нет smile на js без проблем smile

давай на JS smile  А там я уже что-нибудь придумаю  smile 

Автор: redig 22.10.2007, 08:13
У меня тоже возник вопрос по установке фокуса.
Решение:

Код

public static int GetCurrFocus(WebBrowser Wb)
        {
            int foc = 0;
            if (Wb.Document != null)
            {
                HtmlElementCollection elems = Wb.Document.GetElementsByTagName("div");
                foreach (HtmlElement elem in elems)
                {
                    //Если в документе тэг div с атрибутом id один и не пустой
                    String nameStr = elem.GetAttribute("id");
                    if (nameStr != null && nameStr.Length != 0)
                    {
                        foc = elem.OffsetRectangle.Top;
                    }
                   //Или Если в документе все тэги div с атрибутом id
                   //if (nameStr == "22")
                   // {
                   //     foc = elem.OffsetRectangle.Top;
                   // }
                }
            }
            return foc;
        }

private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.Body.ScrollTop = GetCurrFocus(webBrowser1);
                        
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)