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

原创 2008年09月28日 11:40:00
 

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

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

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

    }

}

 
能抓到老鼠就是好猫:)
 

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

  问======================================== 你好:        在你的博客上看到了一些关于操作Internet Explorer的代码,有个问题请教目的:...
  • CathyEagle
  • CathyEagle
  • 2006年11月18日 12:17
  • 6951

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

 再谈动态创建网页元素收藏 | 旧一篇: 代码重温:TZoCInetChecker——一个检测网络连接的类function StorePage(){d=document;t=d.selection?(...
  • skyremember
  • skyremember
  • 2008年09月28日 11:46
  • 1370

javascript动态创建页面元素

    function createDiv(){        var chileE1 = document.createElement("div");                var txt...
  • winson4282000
  • winson4282000
  • 2008年02月17日 14:41
  • 4327

网页中如何设置在网页地址栏中的小图标(收藏)

网页中如何设置在网页地址栏中的小图标:(推荐在线制作:http://free.logomaker.cn/tools/icoMaker.aspx ) 下面我们就讲讲:       eg. ...
  • jpr1990
  • jpr1990
  • 2011年08月20日 13:58
  • 4156

再谈动态创建网页元素

  关键字:IHTMLOptionElementFactory,IHTMLImageElementFactory,createElement 1、概述在《FAQ:操纵下拉列表》中我曾写到如何调用IHT...
  • CathyEagle
  • CathyEagle
  • 2006年12月10日 11:03
  • 8572

jQuery向页面中添加元素

利用jQuery向页面中添加元素是常用的功能,我现在遇到的有几种情况,总结一下。 1、如何在文本框后面添加提示信息? [javascript] view plain cop...
  • iOS_Man
  • iOS_Man
  • 2016年08月23日 09:17
  • 187

好的博客和网页收藏

博客: WordPress主题:Wordpress主题之家 ALENG博客:ALENG博客 运维博客:运维生存时间 Kumu's Blog [docker, 等] : Kumu's...
  • woshizhangliang999
  • woshizhangliang999
  • 2016年03月18日 13:54
  • 590

FAQ:如何访问WebBrowser的滚动条收藏

FAQ:如何访问WebBrowser的滚动条收藏 新一篇: 多层数据库开发三:创建多层应用程序 | 旧一篇: TEmbeddedwb的一个小bug function StorePage()...
  • skyremember
  • skyremember
  • 2008年10月01日 22:21
  • 587

用jQuery实现简单的加入收藏页面的功能

原文地址:http://blog.csdn.net/newsxy/article/details/8692491  加入收藏功能是我们常见的功能,今天研究学习了一下,写了一个简单的例子,主要实现加入...
  • tanga842428
  • tanga842428
  • 2017年08月10日 09:14
  • 649

运维路上的FAQ

遇到的看见的,长期更新~~~ 1.linux乱码问题     [root@vps software]# vi  /etc/sysconfig/i18n     LANG='zh_...
  • u010718976
  • u010718976
  • 2017年01月10日 11:00
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: FAQ: 如何动态创建并访问网页元素收藏
举报原因:
原因补充:

(最多只允许输入30个字)