Веб-браузер работает в режиме совместимости - PullRequest
0 голосов
/ 25 марта 2012

Первый вопрос, так что будьте нежнее.Я пробовал несколько проектов с участием компонента веб-браузера.Я хотел просто установить строку поиска в Google.У меня IE9 установлен на этой машине.Я запускаю следующий код:

 Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    Dim dumstr As String = ""
    Dim jqCheck As Boolean = False
    Dim dum As Object
    WebBrowser1.Navigate("http://www.google.com/ncr")
    Do While WebBrowser1.IsBusy = True Or WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()
    Loop
    dum = {"javascript:var element1 = document.createElement(""script"");element1.src = ""https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"";document.getElementsByTagName(""head"")[0].appendChild(element1);"}
    WebBrowser1.Document.InvokeScript("eval", dum)
    Do While Not jqCheck
        Application.DoEvents()
        jqCheck = WebBrowser1.Document.InvokeScript("eval", {"javascript:jqCheck=!(typeof $==='undefined');jqCheck"})
    Loop
    dumstr = WebBrowser1.Document.InvokeScript("eval", {"javascript:document.documentElement.innerHTML"})
    TextBox1.Text = dumstr
    WebBrowser1.Document.InvokeScript("eval", {"javascript:$(""#lst-ib"").attr('value','I was here')"})
    Application.DoEvents()
    dumstr = WebBrowser1.Document.Forms(0).Document.GetElementById("q").GetAttribute("value")
    System.Threading.Thread.Sleep(5000)
    WebBrowser1.Document.GetElementById("q").SetAttribute("value", "I was here first")

End Sub

HTML-текст из веб-браузера помещается в текстовое поле.

    <meta content="IE=edge" http-equiv="X-UA-Compatible">

указывает, что должен использоваться лучший из доступных IE?Веб-браузер работает в режиме совместимости с IE7.Также GetElementById ("q") работает, но из HTML

   id="lst-ib" class="gsfi" title="Search" name="q". 

Так что я думаю, у меня есть 2 вопроса.Почему веб-браузер работает в режиме совместимости и почему GetElementById работает с именем.

ОБНОВЛЕНИЕ: я добавил:

dumstr = WebBrowser1.Document.InvokeScript("eval", {"javascript:navigator.appVersion"})
MsgBox(dumstr)

вывод, указанный ie7 был в работе.

Я также добавил в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ MAIN \FeatureControl \ FEATURE_BROWSER_EMULATION - имя моего .exe со значением 9999, но мы все еще работаем в режиме ie7

1 Ответ

2 голосов
/ 21 апреля 2012

Как продолжение: Internet Explorer разрешил getElementById ссылаться как на атрибут name, так и на id.Соответствующее описание справки: Возвращает ссылку на первый объект с указанным значением атрибута ID или NAME.Однако начиная с ie8: Windows Internet Explorer 8 и более поздние версии.В режиме стандартов IE8 getElementById выполняет регистрозависимое сопоставление только для атрибута ID.В режиме стандартов IE7 и предыдущих режимах этот метод выполняет сопоставление без учета регистра для атрибутов ID и NAME, что может привести к неожиданным результатам.С изменениями в реестре мой проект больше не находится в режиме ie7, основываясь на выводе navigator.appVersion, а также на том факте, что Google предоставляет более новый HTML-код ($ ("# gbqfq") вместо $ ("# lst-ib "). Однако getElementById по-прежнему работает с именами. Странно ...

...