如何动态创建并访问网页元素
问========================================
你好:
在你的博客上看到了一些关于操作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 spdoc(lpdisp);
if ( spdoc )
...{
ccomptr
hresult hr = spdoc->createelement(l"applet", &spelem);
if ( failed(hr) !spelem )
return;
ccomptr
hr = spdoc->get_body(&pbodyelem);
if ( failed(hr) !pbodyelem )
return;
ccomptr
if ( !pbodynode )
return;
ccomptr
ccomptr
hr = pbodynode->appendchild(pnewchild, &prefchild);
if ( failed(hr) !prefchild )
return;
[来源www.iocblog.net]
ccomqiptr 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 spdoc(lpdisp);
if ( spdoc )
...{
ccomptr
hresult hr = spdoc->get_body(&spbodyelem);
if ( failed(hr) !spbodyelem )
return;
//我们先创建网页元素,注意给一个id
hr = spbodyelem->insertadjacenthtml(l"beforeend", l"");
if ( failed(hr) )
return;
//再通过ihtmldocument3来访问它
ccomqiptr spdoc3(lpdisp);
if ( !spdoc3 )
return;
ccomqiptr
hr = spdoc3->getelementbyid(l"my applet", &spelemtemp);
if ( failed(hr) !spelemtemp)
return;
//把applet作为ihtmlobjectelement来处理
ccomqiptr papplet(spelemtemp);
if ( papplet )
...{
//这样就行了
}
}
}
能抓到老鼠就是好猫:)
[来源www.iocblog.net]
Tag: ihtmldomnode
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。