首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用RAD Studio自动化IHTMLElement OnKeyUp事件

使用RAD Studio自动化IHTMLElement OnKeyUp事件
EN

Stack Overflow用户
提问于 2018-07-17 12:56:43
回答 1查看 175关注 0票数 0

我正在尝试在下面概述的代码中触发一个OnKeyUp事件。因此,OnKeyUp事件将在我试图自动化的页面的HTML中触发一些javascript。

我正在做一个使用RAD Studio XE6 C++自动化IE的项目。我有一个需要激发OnKeyUp事件的元素。但是它不会触发javascript。

我想自动化的HTML代码是:

代码语言:javascript
复制
<input
   name="tbSearch"
   type="text"
   value="ZZZ"
   maxlength="10"
   id="tbSearch"
   class="smltxtbox txtlabel"
   ContentEditable="true"
   unselectable="off"
   OnBlur="Lookup(tbSearch,&#39;TC&#39;)"
   OnKeyUp="KeyUp(tbSearch, this)"
/>

到目前为止我使用的代码是...

代码语言:javascript
复制
bool __fastcall SessionData::UpdateValueByIDTest(String id,String value) 
{
    IHTMLDocument3* htmldoc3;
    tagVARIANT keyup;
    HRESULT hresult;
    if (SUCCEEDED(ie->Document->QueryInterface(IID_IHTMLDocument3,(void**)&htmldoc3))) 
    {
        IHTMLElement* htmlElement;
        htmldoc3->getElementById(WideString(id).c_bstr(), &htmlElement);
        if (htmlElement)
        {
            //the value is updated OK
            htmlElement>setAttribute(WideString("value").c_bstr(),TVariant(value));
            hresult=htmlElement->get_onkeyup(&keyup);
            //expecting this to fire the OnKeyUp event, but it does not.
            hresult=htmlElement->put_onkeypress(keyup);
            return true;
        }
    }
    return false;
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-20 06:18:12

您只需将现有的OnKeyUp事件处理程序重新分配回OnKeyUp事件即可。您实际上根本没有触发事件。

在IE11之前,使用元素的IHTMLElement3::fireEvent()方法。

在IE11和更高版本中,您需要改用IEventTarget::dispatchEvent()方法。

尝试如下所示:

代码语言:javascript
复制
#include <utilcls.h>

bool __fastcall SessionData::UpdateValueByIDTest(String id,String value) 
{
    TComInterface<IHTMLDocument3> htmldoc3 = ie->Document;
    if (htmldoc3)
    {
        TComInterface<IHTMLElement> htmlElement;
        if (SUCCEEDED(htmldoc3->getElementById(WideString(id).c_bstr(), &htmlElement)))
        {
            htmlElement->setAttribute(WideString(L"value").c_bstr(), TVariant(value));

            //fire the OnKeyUp event

            TComInterface<IDocumentEvent> documentEvent = htmldoc3;
            TComInterface<IEventTarget> eventTarget = htmlElement;

            if ((documentEvent) && (eventTarget))
            {
                TComInterface<IDOMEvent> eventObj;
                if (SUCCEEDED(documentEvent->createEvent(WideString(L"KeyboardEvent").c_bstr(), &eventObj)))
                {
                    TComInterface<IDOMKeyboardEvent> keybdEvent = eventObj;
                    keybdEvent->initKeyboardEvent(WideString(L"keyup").c_bstr(), VARIANT_TRUE, VARIANT_TRUE, NULL, WideString(L"<desired key>").c_bstr, DOM_KEY_LOCATION_STANDARD, WideString(L"<desired modifiers>").c_str(), VARIANT_FALSE, WideString(L"en-US").c_str());
                    // set other event properties as needed...

                    VARIANT_BOOL bPreventDefault = VARIANT_FALSE;
                    eventTarget->dispatchEvent(eventObj, &bPreventDefault);
                }
            }
            else
            {
                TComInterface<IHTMLDocument4> htmldoc4 = ie->Document;
                TComInterface<IHTMLElement3> htmlElement3 = htmlElement;
                if (htmldoc4 && htmlElement3)
                {
                    TVariant empty;
                    TComInterface<IHTMLEventObj> eventObj;
                    if (SUCCEEDED(htmldoc4->createEventObject(&empty, &eventObj)))
                    {
                        eventObj->put_keyCode(<desired key>);
                        // set other event properties as needed...

                        VARIANT_BOOL bCancelled = VARIANT_FALSE;
                        htmlElement3->fireEvent(WideString(L"onkeyup").c_bstr(), TVariant(eventObj), &bCancelled);
                    }
                }
            }

            return true;
        }
    }

    return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51373475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档