Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: WebBrowser Control + связь с JavaScript Добавлено: 28.01.13 22:57  

Автор вопроса:  erlangcat
Здравствуйте.

Окончательно запутался.

В приложении, написанном на VB.NET понадобилось вызывать красивую табличку, при клике на содержимое которой оное содержимое подставляется в TextBox. Ввиду отсутствия удобных и красивых родных средств студии (?), я решил рисовать оную табличку в WebBrowser (HTML+CSS, и прочий блэкджек).

Далее я с удивлением узнал, что у WebBrowser нет события Click. Почесав задумчиво дебри гугла, я сделал так:


3
4
5
6
7
8
9
10
11
12
13
14
 
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim document As HtmlDocument = WebBrowser1.Document
        AddHandler document.Body.MouseDown, New HtmlElementEventHandler(AddressOf WebBrowser1_MouseDown)
    End Sub
 
    Private Sub WebBrowser1_MouseDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If e.MouseButtonsPressed = Windows.Forms.MouseButtons.Left Then
            'Здесь считать значение переменной из тела документа
            Dim Result = WebBrowser1.Document.Body.GetAttribute("currentObj")
            LastSender.Text = Result
        End If
    End Sub


Действительно, теперь при клике на элементе формы типа WebBrowser срабатывает код внутри "Private Sub WebBrowser1_MouseDown".

Далее, со стороны самого html-документа имеем следующий скрипт:
<SCRIPT>
document.body.currentObj="no";
    
    //Перебираем все div внутри главного div (id="content") и навешиваем обработчик событий
    window.onload = function() {
    var div = document.getElementById('content').getElementsByTagName('div'), i = div.length;
        
        while(i--)
        {
           div[i].onclick = function(i) {
               return function()
                {
                    if (div[i].id=='value')
                    {          
                        onClick(div[i].innerHTML);
                    }
                };
          }(i);
        }
    };
 
    function onClick(obj)
        {
            document.body.currentObj = obj;
        };
    
</SCRIPT>
 


По идее, теперь клик на любой div с id="value" должен помещать в переменную currentObj содержимое этого div. Собственно, так и происходит. Команда "Dim Result = WebBrowser1.Document.Body.GetAttribute("currentObj")" должна это наше currentObj считывать, что, опять же, работает. НО!


Но JS скрипт выполняется только после завершения процедуры WebBrowser1_MouseDown. Таким образом, работает всё следующим образом:

1) Запускаем программу, загружается форма с WebBrowser
2) Пользователь кликает по WebBrowser
3) В процедуре WebBrowser1_MouseDown считывается значение нужной переменной: WebBrowser1.Document.Body.GetAttribute("currentObj"). Да, именно. J-скрипит ещё не выполнен, а оно уже считывается. Поэтому мы получаем "no" в currentObj (этим значением он инициализируется при загрузке html-документа.
4) Только теперь выполняется J-скрипт, и в переменную currentObj заносится нужное значение из кликнутого div.

Таким образом, чтобы в VB получить нужное значение, приходится кликать по div два раза. Потому что до завершения основной VB-программы, никакие JS в WebControl не выполняются.

Можно как-то решить? В какую сторону копать?

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 16.02.13 02:48
Возможно, проще будет сделать эту табличку на WPF

Ответить

Номер ответа: 2
Автор ответа:
 vahta8



Вопросов: 1
Ответов: 9
 Профиль | | #2 Добавлено: 24.03.13 12:27
Как-то так правильней, сделано в VB2010:
  1.     Public WithEvents docHTML As HtmlDocument
  2.  
  3.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  4.         WebBrowser1.Navigate("about:blank")
  5.         WebBrowser1.Document.Write("<p><font color=""red"">text1</font> text1</p><p><font color=""blue"">text2</font> text2</p>")
  6.         docHTML = WebBrowser1.Document
  7.     End Sub
  8.  
  9.     Private Sub docHTML_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs) Handles docHTML.Click
  10.         MsgBox(WebBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).OuterHtml)
  11.     End Sub

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам