用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
CathyEagle的公告
<center><a href="http://blog.csdn.net/cathyeagle/gallery/image/55102.aspx"><img src="http://blog.csdn.net/images/blog_csdn_net/cathyeagle/32969/o_blog2.jpg" border="0" Title="又是一年春天"></a></center> <center><a href="mailto:eagleboost@21cn.com" title="与我联系">eagleboost@21cn.com</a></center> <P> <center><a href="mailto:eagleboost@msn.com" title="与我联系"><img src="http://blog.csdn.net/images/blog_csdn_net/cathyeagle/76313/o_emailmsn.jpg" border="0"></a></center> <P> <Font color="#FF0000">声明</Font>:本专栏之文章及照片,除特别注明外均为本人原创,如有转载,敬请注明出处。若需商业用途,请与本人联系。 <P> <center> <script type="text/javascript"><!-- google_ad_client = "pub-6698682337329793"; google_ad_width = 120; google_ad_height = 240; google_ad_format = "120x240_as"; google_ad_type = "text_image"; //2006-12-15: test google_ad_channel = "3373491194"; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </center> <center><script type="text/javascript"><!-- google_ad_client = "pub-6698682337329793"; google_ad_width = 120; google_ad_height = 60; google_ad_format = "120x60_as_rimg"; google_cpa_choice = "CAAQme-ujAIaCHu73azYxIDbKLHM93M"; google_ad_channel = ""; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script></center> <P> <!-- Search Google --> <center> <form method="get" action="http://www.google.cn/custom" target="google_window"> <table bgcolor="#ffffff"> <tr><td nowrap="nowrap" valign="top" align="left" height="32"> <a href="http://www.google.com/"> <img src="http://www.google.com/logos/Logo_25wht.gif" border="0" alt="Google" align="middle"></img></a> <br/> <label for="sbi" style="display: none">输入您的搜索字词</label> <input type="text" name="q" size="15" maxlength="255" value="" id="sbi"></input> </td></tr> <tr><td valign="top" align="left"> <label for="sbb" style="display: none">提交搜索表单</label> <input type="submit" name="sa" value="搜索" id="sbb"></input> <input type="hidden" name="client" value="pub-6698682337329793"></input> <input type="hidden" name="forid" value="1"></input> <input type="hidden" name="ie" value="GB2312"></input> <input type="hidden" name="oe" value="GB2312"></input> <input type="hidden" name="cof" value="GALT:#008000;GL:1;DIV:#336699;VLC:663399;AH:center;BGC:FFFFFF;LBGC:336699;ALC:0000FF;LC:0000FF;T:000000;GFNT:0000FF;GIMP:0000FF;FORID:1"></input> <input type="hidden" name="hl" value="zh-CN"></input> </td></tr></table> </form> </center> <!-- Search Google --> <P> <script language="javascript" type="text/javascript" src="http://js.users.51.la/723694.js"></script> <noscript><a href="http://www.51.la/?723694" target="_blank"><img alt="&#x6211;&#x8981;&#x5566;&#x514D;&#x8D39;&#x7EDF;&#x8BA1;" src="http://img.users.51.la/723694.asp" style="border:none" /></a></noscript> <!-- Start of StatCounter Code --> <script type="text/javascript" language="javascript"> var sc_project=2203549; var sc_invisible=1; var sc_partition=20; var sc_security="e72d365b"; </script> <script type="text/javascript" language="javascript" src="http://www.statcounter.com/counter/counter.js"></script><noscript><a href="http://www.statcounter.com/" target="_blank"><img src="http://c21.statcounter.com/counter.php?sc_project=2203549&amp;java=0&amp;security=e72d365b&amp;invisible=1" alt="counter customizable free hit" border="0"></a> </noscript> <!-- End of StatCounter Code -->
文章分类
C++
C++ Templates 中文
Effective STL 中文
周星星之Blog
Delphi
Delphi窑洞
Torry.net
大富翁论坛
源码空间
绝好的Delphi Tips
Java
!Java
Misc
SourceForge.org
Think in Patterns 中文
ZoCSoft.com
阿甘的家
友情链接
Stanley_Xu 的专栏
编程手札
综合
CodeGuru
The Code Project
存档

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

 
问========================================
 
你好:
 
       在你的博客上看到了一些关于操作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 )
        
{
            
//这样就行了
    }

    }

}

 
能抓到老鼠就是好猫:)
 
 
参考文献:
 

发表于 @ 2006年11月18日 12:17:00 | 评论( loading... ) | 编辑| 举报| 收藏

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

  • 发表评论
  • 评论内容:
  •  
Copyright © CathyEagle
Powered by CSDN Blog