Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从C++;IHTMLInputElement_Javascript_Jquery_C++ - Fatal编程技术网

Javascript 从C++;IHTMLInputElement

Javascript 从C++;IHTMLInputElement,javascript,jquery,c++,Javascript,Jquery,C++,我使用IE8引擎在MFC应用程序的CDialog中加载了一个html页面和一个CDHtmlDialog实例。html页面包含元素,并包含jQuery。在上述jQuery中,我有以下代码: $(function() {$ $('#Left').change(function() { $('[id$=left]').prop('disabled', ! $(this).is(':checked') ); }).change(); }); 它基本上只保留一些输入,并根据id为#

我使用IE8引擎在MFC应用程序的CDialog中加载了一个html页面和一个CDHtmlDialog实例。html页面包含
元素,并包含jQuery。在上述jQuery中,我有以下代码:

$(function()
{$
  $('#Left').change(function()
  {
     $('[id$=left]').prop('disabled', ! $(this).is(':checked') );
  }).change();
});
它基本上只保留一些输入,并根据id为
#Left
的复选框禁用或启用(按id约定选择)

问题是:当我从C++代码中更改复选框时,如:

// Get pElements checkbox through doc->getElementsByTagName("input")
CComQIPtr<IHTMLInputElement> spInputElement(pElement);
spInputElement->put_checked(true);
//通过doc->getElementsByTagName(“输入”)获取元素复选框
CComQIPtr spInputElement(pElement);
spInputElement->put\u选中(true);

然后,更改事件不会触发(可能是为了避免无限递归),其他输入永远不会更新。有没有一种方法可以从C++中显式地触发更改事件?我不希望要求所有复选框都有特定的html代码(例如显式的onchange=“…”),因为这对于维护来说是不切实际的。

也许您可以使用onchange方法(请参阅)

更新:

不,这个方法可能没有帮助:(它为onchange事件设置自己的处理程序

更新2:


尝试等待文档完全加载后再触发任何事件(可以在中找到代码)

在IE8中,使用创建并触发事件


对于IE9,事件是使用IDocumentEvent::createEvent创建的,并使用IEventTarget::dispatchEvent激发的。

因此,多亏了amadeus,我找到了它。这是有效的代码,因此其他人可以在需要时复制粘贴它

void fireOnChangeEvent(IHTMLElement* pElement)
{
    // Create a new event-object
    IHTMLEventObj* eventObject;
    IDispatch* dispatch;
    pElement->get_document(&dispatch);
    CComQIPtr<IHTMLDocument4, &__uuidof(IHTMLDocument4)> doc = dispatch;
    dispatch->Release();
    VARIANT empty;
    VariantInit(&empty);
    doc->createEventObject(&empty, &eventObject);

    // fire event
    VARIANT eventref;
    VariantInit(&eventref);
    V_VT(&eventref) = VT_DISPATCH;
    V_DISPATCH(&eventref) = eventObject;

    VARIANT_BOOL cancellable;

    CComQIPtr<IHTMLElement3, &__uuidof(IHTMLElement3)> element3 = pElement;
    BSTR bstrChange = SysAllocString(L"onchange");
    element3->fireEvent(bstrChange, &eventref, &cancellable);
    SysFreeString(bstrChange);
}
void fireOnChangeEvent(IHTMlement*pElement)
{
//创建一个新的事件对象
IHTMLEventObj*事件对象;
IDispatch*调度;
PELENT->get_文件(发送和发送);
CComQIPtr doc=调度;
调度->发布();
变体为空;
VariantInit(&空);
doc->createEventObject(&empty,&eventObject);
//火灾事件
变体eventref;
VariantInit(&eventref);
V_VT(&eventref)=VT_调度;
V_分派(&eventref)=事件对象;
可取消的变体;
CComQIPtr element3=pElement;
BSTR bstrChange=SysAllocString(L“onchange”);
element3->fireEvent(bstrChange、&eventref、&Cancelable);
SysFreeString(bstrChange);
}

注意,这不会激发JQuery中描述的任何事件,但它会得到HTML中直接声明的所有这些信息,如<代码> OnChchange =“…”/Cux>

< P> >,有一种更简单的方法。绑定到JS侧和C++中的单击处理程序,执行如下操作:

IHTMLElement *pElement;
GetElement(L"whateverInputId", &pElement);
CString value = _T("123");
COleVariant vValue(value);
pElement->setAttribute(L"value", vValue);
pElement->click();
我在上面设置了一个值(我有一个文本输入),但是对于您的复选框,如果您知道它没有被选中,您可能只需要执行以下操作:

IHTMLElement *pElement;
GetElement(L"whateverInputId", &pElement);
pElement->click();

尚未选中,但对于复选框,就我所知,它甚至可能会触发
onchange

,这只允许我更改它,但我不知道如何执行它。可能事件未触发是因为事件发生时文档未完全加载。这需要一个IHTMLEventObj,我似乎无法找到如何获得它。比ks,这种方法是有效的,尽管它需要大量的低级代码才能做到这一点。@KajetanAbt如何获得IDocumentEvent?您是否从IHTMLDocument(n)获取信息?这是一种黑客行为,不是一个合适的解决方案,会干扰现有的点击处理程序,并且很容易导致没有任何意义的行为。可能,但它是有效的。此外,这也适用于jQuery。