FAQ: 如何动态创建并访问网页元素收藏

news/2025/2/22 18:01:43
 

 FAQ: 如何动态创建并访问网页元素收藏

新一篇: Internet Explorer 编程简述(十三)调用IE隐藏的命令(续) | 旧一篇: Internet Explorer 编程简述(十二)正确地设置和转移焦点

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>  
问========================================
 
你好:
 
       在你的博客上看到了一些关于操作Internet Explorer的代码,有个问题请教
目的:在html页面中创建一个控件,程序动态创建。
我已经获得要创建页面的IHTMLDocument2指针,看msdn提示使用createElement函数调用后能够创建以及设置属性,创建为一个element我如何把它设置为一个对象或者applet对象或一个embed对象
我调用原有页面上的控件发现为一个applet对象,以下为动态创建的函数:
void InsertElement(IHTMLDocument2 * pIHTMLDocument2 )
{
       HRESULT hr;
       IHTMLElement *pHtmlElement = NULL;
      
       CComBSTR bstrTitle = L"applet";
 
       pIHTMLDocument2->createElement(bstrTitle, &pHtmlElement);
 
       //创建后不知道如何设置成一个applet的对象或者embed对象
 
       VARIANT           vRet;
       VariantInit(&vRet);
       CComBSTR bstrClassID = L"classid";  
       vRet.bstrVal = L"clsid:75B6E755-01FB-46C0-BA16-27350A1855B1";
       vRet.vt = VT_BSTR;
       hr = pHtmlElement->setAttribute(bstrClassID, vRet);
       if ( FAILED( hr ) )
       {
              cout << _T("setAttribute错误") << endl;
              return;
       }
      
       CComBSTR bstrID = L"id";
       vRet.bstrVal = L"myocx1";
       vRet.vt = VT_BSTR;
 
       hr = pHtmlElement-> setAttribute (bstrID, vRet);
       if ( FAILED( hr ) )
       {
              cout << _T("setAttribute错误") << endl;
              return;
       }
 
       CComBSTR bstrName = L"name";
       vRet.bstrVal = L"myocx1";
       hr = pHtmlElement-> setAttribute (bstrName, vRet);
       if ( FAILED( hr ) )
       {
              cout << _T("setAttribute错误") << endl;
              return;
       }
//如果创建applet对象,是否需要其他的属性或者设置,其他方法????
。。。
}
 
答========================================
 
创建Element之后,应通过IHTMLDOMNode::insertBefore或IHTMLDOMNode::appendChild把元素添加到DOM树中去,所以代码本来应该是这样的:

LPDISPATCH lpDisp  =  GetHtmlDocument();
if  (lpDisp)

    CComQIPtr
<IHTMLDocument2, &IID_IHTMLDocument2>    spDoc(lpDisp);
    
if ( spDoc )
    
{
        CComPtr
<IHTMLElement>    spElem;
        HRESULT hr 
= spDoc->createElement(L"applet"&spElem);
        
if ( FAILED(hr) || !spElem )
            
return;
            
        CComPtr
<IHTMLElement>    pBodyElem;
        hr 
= spDoc->get_body(&pBodyElem);
        
if ( FAILED(hr) || !pBodyElem )
            
return;
            
        CComPtr
<IHTMLDOMNode>    pBodyNode(pBodyElem);
        
if ( !pBodyNode )
            
return;
            
        CComPtr
<IHTMLDOMNode>    pNewChild(pElem);
        CComPtr
<IHTMLDOMNode>    pRefChild;
        hr 
= pBodyNode->appendChild(pNewChild, &pRefChild);
        
if ( FAILED(hr) || !pRefChild )
            
return;
            
        CComQIPtr
<IHTMLObjectElement, &IID_IHTMLObjectElement> pObj(pRefChild);
        
if ( pObj )
        
{
            
//修改属性等等
    }

    }

}

 
但试验下来最后一步总是不能成功,从pRefChild得不到pObj,尽管类似的代码用脚本实现没有什么问题:
 
< HTML >
< HEAD >
< SCRIPT >
function createRadioButton(){
    
// Create radio button object with value="First Choice" and then insert 
    // this element into the document hierarchy.
    var newRadioButton = document.createElement("<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='First Choice'>")
    document.body.insertBefore(newRadioButton);
    
// Create radio button object with value="Second Choice" and then insert 
    // this element into the document hierarchy. 
    newRadioButton = document.createElement("<INPUT TYPE='RADIO' NAME='RADIOTEST' VALUE='Second Choice'>")
    document.body.insertBefore(newRadioButton);
}

</ SCRIPT >
</ HEAD >

< BODY >
< INPUT  TYPE ="BUTTON"  ONCLICK ="createRadioButton()"  VALUE ="Create two Radio Buttons" >< BR >
< INPUT  TYPE ="BUTTON"  ONCLICK ="alert ( document.body.outerHTML )"  VALUE ="Click here to see HTML" >
< BODY >
</ HTML >
 
看来我们只能用另外一种办法了——insertAdjacentHTML,如下:

LPDISPATCH lpDisp  =  GetHtmlDocument();
if  (lpDisp)

    CComQIPtr
<IHTMLDocument2, &IID_IHTMLDocument2>    spDoc(lpDisp);
    
if ( spDoc )
    
{
        CComPtr
<IHTMLElement>    spBodyElem;
        HRESULT hr 
= spDoc->get_body(&spBodyElem);
        
if ( FAILED(hr) || !spBodyElem )
            
return;
        
        
//我们先创建网页元素,注意给一个ID
        hr = spBodyElem->insertAdjacentHTML(L"beforeEnd", L"<applet code='RainbowText.class' ID='my applet' width='297' height='48' codebase='class/' name='rainbowText'><param name='TEXT' value='test' ></applet>");
        
if ( FAILED(hr) )
            
return;
        
        
//再通过IHTMLDocument3来访问它
        CComQIPtr<IHTMLDocument3, &IID_IHTMLDocument3>    spDoc3(lpDisp);
        
if ( !spDoc3 )
            
return;
            
        CComQIPtr
<IHTMLElement>    spElemTemp;
        hr 
= spDoc3->getElementById(L"my applet"&spElemTemp);
        
if ( FAILED(hr) || !spElemTemp)
            
return;
        
        
//把Applet作为IHTMLObjectElement来处理
        CComQIPtr<IHTMLObjectElement, &IID_IHTMLObjectElement> pApplet(spElemTemp);
        
if ( pApplet )
        
{
            
//这样就行了
    }

    }

}

 
能抓到老鼠就是好猫:)
 

http://www.niftyadmin.cn/n/4819758.html

相关文章

Using OpenGL with MFC

[Topic] OpenGL and MFC[Viewed] 7310[Feedback] 17[Downloaded] 1941 From Francis Shanahan[.com] : http://www.francisshanahan.com/detail.aspx?cid137 This tutorial is intended to describe how to setup MFC with OpenGL or how to setup OpenGL with MFC. 请想查…

WPC大会新动态:合作伙伴采纳Windows Azure

公告&#xff1a;本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题&#xff0c;会影响阅读体验。如遇此情况&#xff0c;请访问原博客。 在华盛顿特区召开的 Worldwide Partner Conference (WPC) 大会上&#xff0c;合作伙伴们履行了它们对于"云"的…

PyQt5之俄罗斯方块

上个礼拜有个需求&#xff0c;对csv里的数据按条件进行拆分计算。一想到要做计算&#xff0c;少不了pandas。还有个要求最好是生成命令行工具或者带有界面。 于是尝试下&#xff0c;使用PyQt5做了个简单的UI界面给程序包个壳子&#xff0c;然后用pyinstaller进行打包成exe&…

SQL Azure 入门教学(一):SQL Azure之初体验

公告&#xff1a;本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题&#xff0c;会影响阅读体验。如遇此情况&#xff0c;请访问原博客。 SQL Azure 是微软基于 Microsoft SQL Server 2008构建的云端关系型数据库服务。SQL Azure服务具有高可用性和可伸缩性的…

python json unicode utf-8处理总结

1.直接输出字典中文 在python中经常遇见直接print dict&#xff08;字典&#xff09;&#xff0c;或者dict转json&#xff0c;但是没有给特定的参数&#xff0c;然后打印json字符串&#xff0c;输出的中文就成了unicode码的情况&#xff0c;如下&#xff1a; d {name: 张三, a…

Windows Azure 架构指南 – 第 1卷 发布

公告&#xff1a;本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题&#xff0c;会影响阅读体验。如遇此情况&#xff0c;请访问原博客。 正如 David Aiken 最近在其博客中提到的&#xff0c; Microsoft Patterns & Practices 团队发布了Windows Azure 架…

再谈动态创建网页元素收藏

再谈动态创建网页元素收藏 | 旧一篇: 代码重温&#xff1a;TZoCInetChecker——一个检测网络连接的类 <script>function StorePage(){ddocument;td.selection?(d.selection.type!None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyi…

VC++6.0中使用OpenGL

来源:计算机世界:http://www2.ccw.com.cn/99/9934/9934b16.asp VC &#xff0b; &#xff0b; 6.0 中使 用OpenGL 清 华 大 学 李 勇 ----要 学 习OpenGL 编 程&#xff0c; 希 望 读 者 具 备 基 本 的 图 形 知 识。 本 文 使 用 基 于Visual C &#xff0b; &#xff0b; …