InternetExplorer Ввод текста тега типа не преобразуется в IHTMLInputTextElement в BHO - PullRequest
0 голосов
/ 12 февраля 2011

В процессе «войти» в login.live или через страницу msdn.com Форма, сгенерированная DHTML, работает неправильно, так как она нашла первый IHTMLElementэлемент с тэгом «input» и преобразованием его в поле IHTMLInputElement может видеть, что он имеет тип = «текст», однако при запросе он не обеспечивает интерфейс IHTMLInputTextElement.Ни одно из других полей ввода не предоставляет интерфейсы для их конкретных типов.

По сравнению с этим тот же процесс работает просто отлично при нажатии http://gmail.com.

Я в растерянности относительно источникаэтой ошибки, DHTML, login.live, луна в неправильной фазе?Получите ту же проблему в IE7 и IE8, поэтому она не зависит от версии.Получите ту же проблему независимо от режима совместимости IE.

Вот краткий пример

TSharedField Factory( CComPtr<IHTMLElement>& _Element )
{
CComQIPtr<IHTMLTextAreaElement> TextAreaField = _Element;
if (TextAreaField)
    return TSharedField(new Text(TextAreaField));

CComQIPtr<IHTMLInputTextElement> TextField = _Element;
if (TextField)
    return TSharedField(new Text(TextField));

CComQIPtr<IHTMLInputButtonElement> ButtonField = _Element;
if (ButtonField)
    return TSharedField(new Button(ButtonField));

CComQIPtr<IHTMLInputFileElement> FileField = _Element;
if (FileField)
    return TSharedField(new CWebField_File(FileField));

CComQIPtr<IHTMLInputHiddenElement> HiddenField = _Element;
if (HiddenField)
    return TSharedField(new Hidden(HiddenField));

CComQIPtr<IHTMLOptionButtonElement> BooleanField = _Element;
if (BooleanField)
    return TSharedField(new Boolean(BooleanField));

CComQIPtr<IHTMLSelectElement> SelectionField = _Element;
if (SelectionField)
    return TSharedField(new Select(SelectionField));

CComQIPtr<IHTMLInputImage> ImageField = _Element;
if (ImageField)
    return TSharedField(new Image(ImageField));

// Added for debug, only gets hit on login.live
std::wstring type;
HRESULT hr;
DOM_SIMPLE_GET_STRING( type, _Element, get_tagName, hr);

::OutputDebugString( type.c_str() );
if( type == L"INPUT" ){
    CComQIPtr<IHTMLInputElement> Input = _Element;
    if( Input){
        DOM_SIMPLE_GET_STRING( type, Input, get_type, hr);
        ::OutputDebugString( (type+L"\n").c_str() );
    }
}
    return TSharedField();
}

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Привет, Грег, я работаю над BHO, который использует элементы Input, поэтому твоя проблема заинтриговала меня.После некоторых обширных испытаний я врезался в ту же стену, что и ты.После того, как событие DocumentComplete сработало, и вы пытаетесь QI либо элементы name и password для их интерфейса IHTMLInputTextElement, оно завершается неудачей.Однако я обнаружил, что вы можете успешно обработать их с помощью интерфейса HTMLInputTextElementEvents, что позволяет мне сделать вывод, что причиной этой проблемы является ошибка в MSHTML.Будьте уверены, фаза луны в порядке.Теперь, каковы шансы заставить команду IE взглянуть на это?

1 голос
/ 12 февраля 2011

Возможно, этот элемент ввода текста = не полностью инициализирован (не готов).

Вы проверяли состояние документа?

Если вы инициировали изменение документа DHTML из BHO, такие проблемы могут возникнуть.

Безопасной и простой альтернативой является использование функции window.execScript для выполнения действий.

...