Вопрос по MSHTML

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Вопрос по MSHTML

Сообщение Antonariy » 27.07.2005 (Ср) 16:50

В WebBrowser гружу страничку, динамически добавляю на нее элементы с onclick="javascript:somefunc();", но эта somefunc изначально в html-файле не описана. Пытаюсь добавить скрипт:
Код: Выделить всё
    Set scr = Doc.createElement("<script language=javascript>")
    Doc.appendChild scr

Элемент добавляется, но внедрить в него текст функции не получается. На scr.outerHTML = "function {..." выдает ошибку. Если загнать весть текст скрипта в createElement, в outerHTML все равно пусто.
Можно ли вообще как-нибудь внедрить скрипт в загуженный документ, чтобы элементы могли ими пользоваться?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Вопрос по MSHTML

Сообщение tyomitch » 27.07.2005 (Ср) 19:49

Antonariy писал(а):На scr.outerHTML = "function {..." выдает ошибку.

А на scr.innerHTML = "function {..." :?:
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.07.2005 (Чт) 10:16

Аналогично

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.07.2005 (Чт) 10:41

Еще попробовал element.attachEvent "onclick", AddressOf ScritptFunc - выдает ошибку несовпадения типов.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.07.2005 (Чт) 12:11

Походу проблема нерешаема
http://bbs.vbstreets.ru/viewtopic.php?t ... ttachevent

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.07.2005 (Чт) 14:26

Короче, ситуация в следующем:
1) element.attachEvent вторым параметром принимает объект JScriptTypeInfo, так что AddressOf - не алё.
2) объект JScriptTypeInfo можно получить так: Set r = Doc.All.plus.onclick если у элемента прописано это событие.
3) скрипт можно добавить с помощью Doc.appendChild предварительно вырвав его из другого документа или запихнув текстом в DIV, но работать он все равно не будет. Точно так же можно получить JScriptTypeInfo, но и он работать не будет. Похоже IE не интерпретирует скрипты на лету. Работать будут только те скрипты, которые были в тексте документа на момент загрузки.

Обойти можно следующим образом - создать документ со скриптами, ифреймом и каким-нибудь невидимым элементом, на события которого сажаются скрипты. Остальные документы грузить в ифрейм и уже там аттачить события из невидимки.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 28.07.2005 (Чт) 19:53

Поготь поготь. Я человек не оч сообразительный и не всё быро понимаю, так что объясни на пальцах, чего нужно добиться, а то я из предыдущих постов мало что понял.

А вообще - скрипт можно выполнить через
Код: Выделить всё
Window.execscript


Объясни по подробнее. :D

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.07.2005 (Пт) 11:18

Сначала объясню, чего нужно было мне. Если это не поможет, пиши, что нужно тебе, вместе допинаем.

Сейчас я занимаюсь тем, что пишу тонкого клиента с формами в виде html-шаблонов. На клиент переложены стандартные действия с типовыми наборами данных. Например одним из типов является дерево. Клиент получает рекордсет типа дерево и строит на html соответствующий документ. Для открытия/закрытия ветки дерева используется javascript. HTML-структура деревьев однотипная, скрипт один и тот же, вот я и подумал, нафига его таскать по шаблонам, где может встретиться дерево, лучше его внедрять в документ из клиента в случае надобности. Гружу в WebBrowser шаблон, пытаюсь внедрить в него скрипт, как описано в 2) и 3), и вот тут-то выясняется, что работать будут только те скрипты, что находились в этом шаблоне или были прописаны в других документах, на которые ссылается шаблон (через <SCRIPT src=""> или #include), на момент загрузки шаблона.
Вот я и придумал грузить в WebBrowser из ресурсов клиента общий документ со всякими сервисными скриптами и фреймом IFRAME, а уже в IFRAME грузить шаблон. Таким образом, шаблону доступны скрипты родительского документа через IFRAME.

Насколько я понял, в качестве обработчика события ты хочешь использовать приаттаченую vb-шную процедуру. Видимо, это невозможно. Придется объявлять withevents соответствующий HTML-элемент и обрабатывать elm_onclick() или действовать так, как я описал в своем предыдущем посте.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.07.2005 (Пт) 11:32

Н-да, Window.execscript я как-то не заметил вовремя. В принципе, он подошел бы. Но проще написать <span onclick="javascript:...">, чем
Код: Выделить всё
Private Function Doc_onclick() As Boolean
Dim elm As Object
    Set elm = Doc.parentWindow.event.srcElement
End Function

а потом выяснять span ли этот elm, нужен ли ему execscript и какой скрипт конкретно.

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 29.07.2005 (Пт) 20:30

'References: Microsoft HTML Object Library
'Controls: Microsoft Internet Controls
'добавить на форму WebBrowser с именем WebBrowser1

Private Sub Form_Load()
    Dim mStr As String
    Dim mDoc As MSHTML.IHTMLDocument
    Dim mHTMLDocument As MSHTML.HTMLDocument
    'загрузка простого документа
    WebBrowser1.navigate "res://mshtml.dll/blank.htm"
    While WebBrowser1.document Is Nothing
    'ждём создания документа
        DoEvents
    Wend
    Set mDoc = WebBrowser1.document
    mStr = "<html>" & _
           "  <head><style type=""text/css"">" & _
           "    body {overflow-y: visible;}" & _
           "    span {color: #003DB2;}" & _
           "    li   {cursor: hand;}" & _
           "  </style>" & _
           "  </head><body>" & _
           "  <ul>" & _
           "    <li id=""li1"" sel=""1"">пункт <span>1</span></li>" & _
           "    <li id=""li2"" sel=""0"">пункт <span>2</span> " & _
           "    (не активен)</li>" & _
           "    <li id=""li3"" sel=""1"">пункт <span>3</span></li>" & _
           "  </ul>" & _
           "  <div id=""txtout"">нужно кликнуть по списку</div>" & _
           "</body></html>"
    'меняем содержание всего документа
    mDoc.Write mStr
    Set mDoc = Nothing

    'присваиваем html документ
    Set mHTMLDocument = WebBrowser1.document
    
    'добавляем обработку событий с помощью JavaScript
    Dim scr As IHTMLScriptElement
    With mHTMLDocument
        'создаём скрипт
        Set scr = .createElement("script")
        scr.Type = "text/javascript"
        'задаём текст скрипта
        scr.Text = _
            "function clickIt() {" & _
            "txtout.innerHTML = " & _
            """выбран: "" + window.event.srcElement.outerText;}"
        .appendChild scr
        'задаём обработку событий для указанных элементов
        .parentWindow.execScript _
            "li1.attachEvent ('onclick',clickIt);" & _
            "li3.attachEvent ('onclick',clickIt);"
    End With

End Sub

Как отформатирован этот код?

2 Antonariy
- задавай вопрос на одном форуме, а то везде тебе отвечать приходится. :evil:

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 01.08.2005 (Пн) 8:56

Дык ктож заставляет? :? Мне достаточно и одного раза. Кроме того:

Во-первых не нужно думать, что я гоняюсь за тобой по всему нету с целью убить тебе клавиши ctrl+c/v.
Во-вторых здесь вопрос не адресовался конкретно тебе.
В-третьих, чем больше народу напрягает извилины, тем лучше и мне и им.

ЗЫ: Все равно спасибо. :twisted:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 70

    TopList