javascript-使用IE插件浏览器帮助器对象(BHO)访问iframe中的正文(至少一些数据)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-使用IE插件浏览器帮助器对象(BHO)访问iframe中的正文(至少一些数据),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3075字,纯文字阅读大概需要5分钟。
内容图文
![javascript-使用IE插件浏览器帮助器对象(BHO)访问iframe中的正文(至少一些数据)](/upload/InfoBanner/zyjiaocheng/695/627b99f5022c48f2b2025369c6ba28dd.jpg)
我正在开发IE8 BHO插件.现在,我只是想将文本插入另一个iframe(id =“ canvas_frame”)所包含的iframe(class =“ Al Ai Editable”)中.
我设法获得了要向其添加文本的iframe的IHTMLElement(class =“ Al Ai editable”).我可以通过类型为IHTMLElement的el变量来证明这一点:
el->get_className(&cl); //Al Ai editable
在MessageBox中正确显示iframe的类.
我现在遇到的问题是我无法访问相应iframe的body元素.
例如,当我尝试使用以下代码访问带有ID的iframe主体时,这将导致浏览器崩溃:
el->getElementById(L":d6", &el); // ":d6" is the id of the body inside the iframe
另外,尝试获取内部HTML或内部Text,我只是获得一个空字符串:
el->get_innerHTML(&htm);
MessageBox(hwnd, htm, L"BHO cl", MB_OK);
要么
el->get_innerText(&htm);
MessageBox(hwnd, htm, L"BHO cl", MB_OK);
不显示任何内容(“”).
我什至尝试了el-> get_children方法,但这也没有帮助.
这是整个功能:
void CgmailAdderBHO::checkIframes(HWND hwnd, IDispatch *lpDisp) {
USES_CONVERSION;
if (lpDisp) {
IOleContainer* pContainer;
// Get the container
HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer,
(void**)&pContainer);
lpDisp->Release();
if (FAILED(hr)) {
return;
}
IEnumUnknown* pEnumerator;
// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();
if (FAILED(hr)) {
return;
}
IUnknown* pUnk;
ULONG uFetched;
// Enumerate and refresh all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
IWebBrowser2* pBrowser;
hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pUnk->Release();
if (SUCCEEDED(hr))
{
// process the iframe
CComPtr<IDispatch> docDisp;
pBrowser->get_Document(&docDisp);
CComQIPtr<IHTMLDocument3> doc = docDisp;
CComQIPtr<IHTMLElementCollection> iframes;
HRESULT hr = doc->getElementsByTagName(SysAllocString(L"body"), &iframes);
long length;
iframes->get_length(&length);
CComVariant itemIndex(0);
CComVariant empty;
CComQIPtr<IDispatch> htmlEl;
iframes->item(itemIndex, empty, &htmlEl);
CComQIPtr<IHTMLElement> el = htmlEl;
BSTR cl;
BSTR cln(L"cP");
el->get_className(&cl);
if (cl && strcmp(OLE2A(cl), "cP") == 0) {
//this is the canvas_frame
// check if it has any other subframes
BSTR html;
el->get_innerHTML(&html);
doc->getElementsByTagName(SysAllocString(L"iframe"), &iframes);
if (iframes) {
iframes->get_length(&length);
if (length > 0) {
//MessageBox(hwnd, L"We are on compose!", L"BHO", MB_OK);
//add encrypt button code here
iframes->item(itemIndex, empty, &htmlEl);
el = htmlEl;
el->get_className(&cl); //Al Ai editable
BSTR htm;
el->get_innerHTML(&htm);
MessageBox(hwnd, cl, L"BHO cl", MB_OK);
MessageBox(hwnd, htm, L"BHO cl", MB_OK);
CComQIPtr<IHTMLDocument3> docul = htmlEl;
//docul->getElementById(L":d6", &el);
break; // found iframe ; now exit for
}
}
}
pBrowser->Release();
}
}
pEnumerator->Release();
}
}
解决方法:
该错误的原因是安全限制.您正在访问嵌套的iframe,因此需要重新配置函数以递归工作以绕过限制.
了解如何使用来访问第一级iframe
hr = pContainer-> EnumObjects(OLECONTF_EMBEDDINGS,& pEnumerator);
但是然后使用
doc->getElementsByTagName(SysAllocString(L"iframe"), &iframes);'
访问嵌套的iframe?这就是错误,您需要使用EnumObjects和第一个相同的嵌套iframe来访问嵌套iframe,然后获取IWebBrowser2接口.
内容总结
以上是互联网集市为您收集整理的javascript-使用IE插件浏览器帮助器对象(BHO)访问iframe中的正文(至少一些数据)全部内容,希望文章能够帮你解决javascript-使用IE插件浏览器帮助器对象(BHO)访问iframe中的正文(至少一些数据)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。