Как выбрать элемент <option> по атрибуту «value» в раскрывающемся списке <select>?

В моем приложении Delphi я используюTWebBrowser контроль, где я загрузил HTML-документ, содержащий<select> элемент (выпадающий список) с несколькими<option> предметы (выпадающий список предметов). Допустим, в моем веб-браузере загружен следующий HTML-документ:

<html>
<body>
  <select id="ComboBox">
    <option value="firstvalue">First Value</option>
    <option value="secondvalue">Second Value</option>
    <option value="thirdvalue">Third Value</option>
  </select>  
</body>
</html>

Как я могу программно выбрать, например,<option>, чьяvalue атрибутthirdvalue ? Или, другими словами, как я могу программно выбрать третий элемент в этом раскрывающемся списке, если я знаю только, что этот элементvalue атрибутthirdvalue ?

 Jay13 окт. 2012 г., 20:13
Да, через интерфейс DOM.

Ответы на вопрос(1)

Решение Вопроса

IHTMLSelectElement интерфейс с егоselectedIndex свойство например. В качестве витрины я сделал следующую функцию.

Функция SelectOptionByValue

Следующая функция пытается найти и выбрать (если найдено)<option> (элемент раскрывающегося списка) данногоvalue значение атрибута в указанном<select> элемент (выпадающий список). Если нет<option> найден, текущий выпадающий список очищается (элемент не выбран).

Параметры:

ADocument - интерфейс для входного HTML-документаAElementID - идентификатор<select> элемент (идентификатор элемента раскрывающегося списка)AOptionValue - искали<option> значение элемента (значение элемента выпадающего списка)

Возвращаемое значение:

Если<option> с даннымvalue успешно найден (и выбран), возвращаемое значение является индексом этой опции в указанном выпадающем списке, -1 в противном случае.

Исходный код:

function SelectOptionByValue(const ADocument: IDispatch; const AElementID,
  AOptionValue: WideString): Integer;
var
  HTMLDocument: IHTMLDocument3;
  HTMLElement: IHTMLSelectElement;

  function IndexOfValue(const AHTMLElement: IHTMLSelectElement;
    const AValue: WideString): Integer;
  var
    I: Integer;
  begin
    Result := -1;
    for I := 0 to AHTMLElement.length - 1 do
      if (AHTMLElement.item(I, I) as IHTMLOptionElement).value = AValue then
      begin
        Result := I;
        Break;
      end;
  end;

begin
  Result := -1;
  if Supports(ADocument, IID_IHTMLDocument3, HTMLDocument) then
  begin
    if Supports(HTMLDocument.getElementById(AElementID), IID_IHTMLSelectElement,
      HTMLElement) then
    begin
      Result := IndexOfValue(HTMLElement, AOptionValue);
      HTMLElement.selectedIndex := Result;
    end;
  end;
end;

Пример использования:

Чтобы выбрать элемент сthirdvalue Значение в раскрывающемся списке из HTML-документа из вопроса можно использовать этот код (при условии, что вWebBrowser1 компонент здесь загружается этот документ):

procedure TForm1.Button1Click(Sender: TObject);
var
  Index: Integer;
begin
  Index := SelectOptionByValue(WebBrowser1.Document, 'ComboBox', 'thirdvalue');

  if Index <> -1 then
    ShowMessage('Option was found and selected on index: ' + IntToStr(Index))
  else
    ShowMessage('Option was not found or the function failed (probably due to ' +
      'invalid input document)!');
end;

Пример HTML-документа из вопроса:

<html>
<body>
  <select id="ComboBox">
    <option value="firstvalue">First Value</option>
    <option value="secondvalue">Second Value</option>
    <option value="thirdvalue">Third Value</option>
  </select>  
</body>
</html>
 TLama14 февр. 2013 г., 16:36
@kobik, интересно, я не был уведомлен об этом комментарии (даже если я владелец поста). Конечно, это будет намного лучше!
 kobik03 февр. 2013 г., 16:14
[+1] Так как вы включилиif Supports, HTMLElement может отличаться отIHTMLSelectElement поэтому я бы использовал:if Supports(HTMLDocument.getElementById('ComboBox'), IID_IHTMLSelectElement, HTMLElement) then..., только мои 2 цента;)

Ваш ответ на вопрос