我正在尝试在下面概述的代码中触发一个OnKeyUp事件。因此,OnKeyUp事件将在我试图自动化的页面的HTML中触发一些javascript。
我正在做一个使用RAD Studio XE6 C++自动化IE的项目。我有一个需要激发OnKeyUp事件的元素。但是它不会触发javascript。
我想自动化的HTML代码是:
<input
name="tbSearch"
type="text"
value="ZZZ"
maxlength="10"
id="tbSearch"
class="smltxtbox txtlabel"
ContentEditable="true"
unselectable="off"
OnBlur="Lookup(tbSearch,'TC')"
OnKeyUp="KeyUp(tbSearch, this)"
/>
到目前为止我使用的代码是...
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;
}
发布于 2018-07-20 06:18:12
您只需将现有的OnKeyUp
事件处理程序重新分配回OnKeyUp
事件即可。您实际上根本没有触发事件。
在IE11之前,使用元素的IHTMLElement3::fireEvent()
方法。
在IE11和更高版本中,您需要改用IEventTarget::dispatchEvent()
方法。
尝试如下所示:
#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;
}
https://stackoverflow.com/questions/51373475
复制相似问题