我通過 IHTMLDocument2 接口生成和插入新的元素,可是,由於我使用的是 insertAdjacentHTML ,插入的元素素要不被置於當前元素的結尾,要不就在當前元素的開頭,但我想要的效果是將新元素(我衹要 image )插入到當前位置上(如果當前元素是文字,則把文字截斷插入我的元素)我google了很多資料,大家都說用 IMarkupServices, 網上也有一些例子,我沒有全看懂,似乎都是用它來 highlight 一些文字的。請問有沒有利用 IMarkupServices 在當前位置插入新元素的例子?
if(!pDoc)return;
VARIANT_BOOL vbb;
pDoc->execCommand(CComBSTR("InsertImage"),0,CComVariant("file:///D:/0010.gif"),&vbb);
// spDoc is IHTMLDocument2
CComPtr<IMarkupServices> pMS;
CComPtr<IMarkupContainer> pMarkup;
CComPtr<IMarkupPointer> pPtr;
CComPtr<IDisplayServices> pDispServices;
CComPtr<IHTMLCaret> spCaret; spDoc->QueryInterface(IID_IMarkupContainer, (void **)&pMarkup);
spDoc->QueryInterface(IID_IMarkupServices, (void **)&pMS);
pMS->CreateMarkupPointer(&pPtr);
spDoc->QueryInterface(IID_IDisplayServices, (void **)&pDispServices);CComPtr<IHTMLElement> newElem;
pDispServices->GetCaret(&spCaret);
spCaret->MoveMarkupPointerToCaret(pPtr);// _HTML_for_img 是 img 的 HTML 代碼。對其它 element, 修改第一個參數,填入相應的 ID,
// 當然 HTML 也要修改了
pMS->CreateElement(TAGID_IMG, CComBSTR(_HTML_for_img), &newElem);
pMS->InsertElement(newElem, pPtr, pPtr);這段代碼可以將圖片或其它單個element 插入到當前位置上,但如果 newElemt 是复合型的,例如<div><img src="..."></img></div>則無法直接插入。以 (div><img src="..."></img></div>) 為例,我試過幾種方法,但還是不行1) 用 node
CComPtr<IHTMLElement> imgElem;
pMS->CreateElement(TAGID_DIV, CComBSTR(HTML_for_div), &newElem); // 生成一個 div element
pMS->CreateElement(TAGID_IMG, CComBSTR(HTML_for_img), &imgElem); // 生成一個 img element CComPtr<IHTMLDOMNode> thisNode, childNode, retNode;
newElem->QueryInterface( IID_IHTMLDOMNode, (void **)&thisNode ); // 取得 div 的 node
imgElem->QueryInterface( IID_IHTMLDOMNode, (void **)&childNode ); // 取得 img 的 node
thisNode->appendChild( childNode, &retNode ); // 將 img 加到 div 裡面,返回 retNode
retNode->QueryInterface( IID_IHTMLElement, (void **)&newElem ); // 返回 retNode 對應的 element
pMS->InsertElement(newElem, pPtr, pPtr); // 此時插入為空,如果把 appendChild 注解掉,測可以插入一個空的div2) 先生成 div element,把它的 innerHTML 換成 HTML_for_img,然後用 pMS->InsertElement 插入,但這還是失敗3) 先用 pMS->InsertElement 將 div 插入,再利用 IMarkupServices 生成另一個 img element 然後用 pMS->InsertElement 插入,但這樣得的結果是<div></div><img src="..."></img>而不是我想畏的<div><img src="..."></img></div>請各位給點意見,看哪裡出錯了?特別是利用 Node 的方法,我檢查過所有返回值,沒有發現錯誤,實在不知道怎樣處理才對 :(
1.先用 pMS->InsertElement 將 div elem插入
//--------------------------------------
2.再
CComPtr<IHTMLElement2> uuu;
if(div elem.QueryInterface(&uuu)==S_OK)
{
uuu->applyElement(imgelem,L"inside",0);
}
CComPtr<IHTMLElement> uuu2;
pdoc2->createElement(CComBSTR("div"),&uuu1);
uuu1->put_innerHTML(L" ");
pdoc2->createElement(CComBSTR("img"),&uuu2);
uuu2->setAttribute(L"src",CComVariant("file:///c:/img.img"),0);
uuu2->put_innerHTML(CComBSTR(S));
CComPtr<IHTMLElement2> p2;//
if(pElem2->QueryInterface(&p2)!=S_OK||p2==NULL){return;}//pElem2可以是任何元素,所以可形成定位插入
p2->insertAdjacentElement(CComBSTR("afterEnd"),uuu1,&uuu1);
p2->insertAdjacentElement(CComBSTR("afterEnd"),uuu2,&uuu2);//----------------------------applyElement你要是不能用,可以
CComPtr<IHTMLDOMNode> n1;
CComPtr<IHTMLDOMNode> n2;
uuul->QueryInterface(IID_IHTMLDOMNode,(void**)&n1);
uuu2->QueryInterface(IID_IHTMLDOMNode,(void**)&n2);
接着
或者n1->appendChild(n2,NULL);
或者 n2->appendChild(n1,NULL);
n1->appendChild(n2,&n2/*NULL*/);
n2->appendChild(n1,&n1/*NULL*/);