我正在尝试在下面概述的代码内触发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;
}
答案 0 :(得分:0)
您只是将现有的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;
}