Что нового

Обработка HTML кода в AutoIt'e

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
Viktor1703
Нужно парсить страницу. Сначала получение имен элементов, получив массив имён типа au1, au2, au3, далее регулярным выражением получить теги <autoit> с аналогичными именами au1, au2, au3, далее найти пары, чтобы найденному элементу соответствовала команда. То есть исключить элементы в IE не имеющие команды.

Предположительный вариант: использовать одно из свойств элемента в качестве команды, например, в _IEImgClick есть текст
src = (По умолчанию) совпадение по URL изображения
name = совпадение по имени изображения
alt = совпадение по альтернативному тексту изображения
хорошо бы иметь возможность получить эти поля и можно было бы одно из них использовать под команду. Например поле alt для случая если картинка не найдена, вполне это поле можно было бы использовать под команду. Для ссылок можно было бы использовать текст всплывающей подсказки, в тегах есть поле title="текст подсказки".
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
хорошо бы иметь возможность получить эти поля и можно было бы одно из них использовать под команду

Все эти поля можно получить с помощью того же объекта, например:

Код:
$sSrc = $hObj.document.getElementById('image_0').src
$sName = $hObj.document.getElementById('image_0').name


Для примера

AutoIt:
Код:
$hObj = ObjCreate('Shell.Explorer.2')
$hForm = GUICreate('', 500, 400)
GUICtrlCreateObj($hObj, 0, 0, 500, 400)
$hObj.navigate(@ScriptDir & '\test.html')
$hObj.document.bgcolor = '#303030'
GUISetState()

While 1
    $event = WebEvent($hObj)
    If IsArray($event) Then
        Switch $event[0]
            Case 'image_0'
                Switch $event[1]
                    Case 'over'
                        If IsObj($hObj) Then
                            $hObj.document.getElementById($event[0]).src = 'autoit_1.png'
                            $hObj.document.getElementById($event[0]).style.left = '98px'
                            $hObj.document.getElementById($event[0]).style.top = '98px'
                        EndIf
                    Case 'out'
                        If IsObj($hObj) Then
                            $hObj.document.getElementById($event[0]).src = 'autoit_0.png'
                            $hObj.document.getElementById($event[0]).style.left = '100px'
                            $hObj.document.getElementById($event[0]).style.top = '100px'
                        EndIf
                    Case 'click'
						Switch StringUpper($hObj.document.getElementById($event[0]).name)
							Case 'RUN'
								$sAlt = $hObj.document.getElementById($event[0]).alt
								If $sAlt <> '' Then
									Run($sAlt)
								EndIf
						EndSwitch
                    Case 'dbclick'
                        MsgBox(0, '', '')
                EndSwitch
        EndSwitch
    Endif

    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
Wend

Func WebEvent($hObject)
    Local $aRet[2], $sEvent
    If IsObj($hObject) Then
        $sEvent = $hObject.document.title
        If $sEvent Then
            $hObject.document.title = ''
            $aData = StringSplit($sEvent, ':')
            If (IsArray($aData) And ($aData[0] == 2)) Then
                $aRet[0] = $aData[1]
                $aRet[1] = $aData[2]
                Return $aRet
            EndIf
        EndIf
    EndIf
    Return 0
EndFunc

Html:
Код:
<html>
  <head>
    <meta http-equiv="MSThemeCompatible" content="Yes">
  </head>
  <script>
    document.oncontextmenu = function() { return false; };
    document.onkeydown     = function() { if (event.keyCode == 116) { event.keyCode = 0; return false; } };
    document.onmousedown   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":down";    } };
    document.onmouseup     = function() { var id = event.srcElement.id; if (id) { document.title = id + ":up";      } };
    document.onmouseover   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":over";    } };
    document.onmouseout    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":out";     } };
    document.onclick       = function() { var id = event.srcElement.id; if (id) { document.title = id + ":click";   } };
    document.ondblclick    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":dbclick"; } };
  </script>
  <style>
    body {
      border: none;
      margin: 0px;
      padding: 0px;
      overflow: hidden;
    }
  </style>
  <body>
      <img id="image_0" src="autoit_0.png" name="run" alt="notepad.exe" style="position: absolute; left: 100px; top: 100px; cursor: pointer;"></img>
  </body>
</html>
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
Viktor1703
посмотри тест
ничего почти не изменял, только в $aRet добавил 0 или 1 чтобы не проверять массив или нет.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Так а что требуется сделать?? :smile:

Подправил пример, теперь функционируют сразу две кнопки и не надо писать Case 'image_%d' главное что бы id кнопок в Html различались.
 

AZJIO

Меценат
Меценат
Сообщения
2,891
Репутация
1,195
Re: Обработка HTML кода в AutoIt\\\'e

Viktor1703
Посмотрю, я тоже свой пример перезалил, добавив 4 кнопки и картинки прописываются теперь в HTML.


Добавлено:
Сообщение автоматически объединено:

Я в java-скриптах не разбираюсь, нужно переделать скрипт, чтобы манипуляции с картинками было с помощью java, так как для IE это нативный вариант.

типа так
Код:
<html>
  <head>
    <meta http-equiv="MSThemeCompatible" content="Yes">
  </head>
  <script>
    document.ondrag        = function() { return false; };
    document.ondragdrop    = function() { return false; };
    document.ondragstart   = function() { return false; };
    document.oncontextmenu = function() { return false; };
    document.onkeydown     = function() { if (event.keyCode == 116) { event.keyCode = 0; return false; } };
    document.onmousedown   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":down";    } };
    document.onmouseup     = function() { var id = event.srcElement.id; if (id) { document.title = id + ":up";      } };
    document.onmouseover   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":over";    } };
    document.onmouseout    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":out";     } };
    document.onclick       = function() { var id = event.srcElement.id; if (id) { document.title = id + ":click";   } };
    document.ondblclick    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":dbclick"; } };
    
    function Over(object, pic) { object.src = pic; }; // Меняет изображение если мышь над элементом
    function Last(object, pic) { object.src = pic; }; // Меняет изображение если мышь покинула элемент
    function Press(object, pic) { object.src = pic; }; // Меняет изображение если кнопка мыши нажата на элементе
    function Up(object, pic) { object.src = pic; }; // Меняет изображение если кнопка мыши отпущена
  </script>
  
  <style>
    body {
      border: none;
      margin: 0px;
      padding: 0px;
      overflow: hidden;
    }
  </style>

  <body>
      <img id="image_0" src="setup2.gif" name="run" alt="notepad.exe"
	  style="position: absolute; left: 20px; top: 20px; cursor: pointer;"
	  onmousedown="Press(this, 'setup3.gif')"
	  onmouseup="Up(this, 'setup1.gif')"
	  onmouseover="Over(this, 'setup1.gif')"
	  onmouseout="Last(this, 'setup2.gif')" />
  </body>
</html>


Добавлено:
Сообщение автоматически объединено:

Перезалил тестовый архив, где картинки меняются с помощью java-скрипт, а в GUI только события нажатия.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Не много не понял... ваш пример рабочий. Или что нужно сделать?

Не заметил сообщение внизу

Перезалил тестовый архив, где картинки меняются с помощью java-скрипт, а в GUI только события нажатия.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
AZJIO
java и javascript - разные вещи :smile:
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
А что это HtmLayout совсем забыли? Вот 2 примера.
<a href="http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=290" />examp.rar</a>
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Почему забыли, мы все о нём помним :smile: только браться за него ни кто не хочет, в том числе и я :smile:
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Добавил в Html.au3 30+ фунций, фунциям заголовки и прочие украшения.
<a href="http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=293" />html.rar</a>
 
Сообщения
3
Репутация
-1
Как насчет портирования всех ваших функций с ужасного IE Trident под Chromium?
Дабы не нарушать правил форуме не буду копировать подробное сообщение из другой темы, а просто оставлю ссылку
http://autoit-script.ru/index.php/topic,2845.msg102999.html#msg102999

Короче, погуглите Chromium Embedable Framework и прекращайте использовать IE!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ну, IE 11 отличный браузер. API есть, для него все написано, есть готовая UDF. А что даст Chromium Embedable Framework?


Добавлено:
Сообщение автоматически объединено:

Где найти инфу по libcef.dll. Или тоториал как сделать "Hello Word"?


Добавлено:
Сообщение автоматически объединено:

вот ;D явно не для меня.
 
Сообщения
3
Репутация
-1
С этими вопросами сюда http://www.magpcss.org/ceforum/
Почитатать туториалы можно здесь https://code.google.com/p/chromiumembedded/wiki/Tutorial
нам ближе будет реализация питона, так что чисто для понимания аналогии можно почитать тутор здесь https://code.google.com/p/cefpython/wiki/API

А говорить что ИЕ 11 отличный браузер и спрашивать что даст движок Chrome как-то даже неприлично в наши дни :rofl:

Для сравнение основых фич и поддержки стандарта HTML 5 прошу сюда, http://html5test.com/compare/browser/chrome-33/ie-11.html - ну и в отличии от продукции Мелкомягких любящих ломать обратную совместимость путем выпиливания или API которые никому не мешали, распространяемая со скриптом или exe враппером библиотека libcef.dll навсегда сохранит имеющийся в ней функционал, независимо от того где опят накосячать мелкомягкие, ну и бонусом идет то, что пока стандарт развивается, свежие билды либцеф выходят каждый день и обеспечиваю всегда наиболее полную и современную поддержку веб стандартов, так что обновить движок в любой день путем замены библиотеки и без переписывания скрипта не составит труда, а в от движок ослика ИА обновляется в основном по случаю выхода новой ОС или сервис пака, в лучшем случае раз в год, а то порой и раз в 2 (проследи динамику, в 2001 году вышел 6ой, в 2014 мы имеем лишь 11, всего 5 версий за почти 15 лет и без всяких майнор версии, кроме критических хотфиксов безопасности, XP уже новые версии браузера не получает, это тоже следует учесть) и MS очень любят без всяких технически ограничивающих причин делать новые версия осла экслюзивным да одной-двух последних версий винды, в то время как обратная совместимость хромиума не привязана к маркетинговым трюкам и позволяет им поддерживать все, начиная с XP.

Еще осел, как и весь софт МС, слишком завязан на реестр и различные ActiveX компоненты, которые на разных системах любят отваливаться (не без помощи кривых твикеров, чистильщиков реестра и прочего кривого софта) или добавляются говнософтом и хватаются ослом как родные, от чего осла начинает неизлечимо глючить у многих людей до полной перестановки винды.
 
Верх