2012-03-14 38 views
4

我用TEmbeddedWebBrowser來填寫一個html表格,用FillForm方法。但是我的html表單包含一個完全基於javascript的編輯器,我不知道如何填寫。如何填寫JavaScript編輯器?

事情是這樣的:

your comment : 
<script type='text/javascript' src='public/scripts/src/editor.js?1'></script> 

並提交btton:

<input type="submit" name="btnSubmit" id="btnSubmit" value="Send" class="btn" onclick="rtevalue(&quot;data[body]&quot;,437934);" /> 
+0

謝謝,該示例使用了'SetFieldValue'方法。但正如我所說的那樣,問題在於表單中沒有字段。編輯器是基於js的。我怎麼能找到它的領域? – Kermia 2012-03-14 11:49:29

+0

我試圖用'innerHtml'和'innerText'屬性填充'iframe',但是我得到這個錯誤:找不到成員。看起來'iframe'沒有這些屬性。 – Kermia 2012-03-14 16:01:40

+0

而'IHTMLElement'類沒有'execCommand'方法。 – Kermia 2012-03-15 07:13:49

回答

4

編輯器本身是一個DIV(也可以是其他HTML元素)或IFRAME集到contentEditable/designMode = on
如果元素是DIV,您可以使用它的InnerHTML屬性。
對於具有IFRAME最佳效果,請使用下面的代碼:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    editorDoc: OleVariant; 
    range: OleVariant; 
    id: OleVariant; 
begin 
    id := 'editor'; // frame ID 
    editorDoc := (WebBrowser1.Document as IHTMLDocument2).parentWindow.frames.item(id).Document; 
    range := editorDoc.body.createTextRange(); 
    // range.collapse(false); // if you need to append 
    range.select(); 
    range.pasteHTML('<b>Boo!</b>'); 
end; 

注:

  • 沒有錯誤檢查,以簡化代碼。
  • 您也可以嘗試range.execCommand('inserthtml', false, MyText)(未使用TEmbeddedWebBrowser進行測試,但是當我使用HTML/JavascriptIE進行了嘗試時發現了虛假結果)。
1

我有一個關於這個TEmbeddedWebBrowser工具沒有經驗,而是根據你的文章中,我想了一個辦法,檢索表單的字段。一旦你知道它包含什麼字段,我想你可以填充它們,因爲它似乎不是你的文章的目的。

  1. 假設有聲明的形式,它是可到達:你可以抓住的形式和 分析它.elements集合:容易,如果它在你的頁面 被聲明(給它一個id屬性,然後用document.getElementById()) , 如果表格是由 editor.js /內部聲明,那麼使用document.forms時仍可行。

  2. 否則:你可以從網上獲取轉儲 腳本 - 像this one - ,看看當你所說的打印dump(data)dump(data[body])(包括editor.js 後自然)。由於data[]爲 ,因此用作提交按鈕 onclick調用的參數rtevalue(),它應該包含表單的鍵/值對。這種方法的壞處是,data[]必須由Javascript填充,所以如果你的表單有單選按鈕或 複選框,你可能只會看到選中的,這就是爲什麼我會在嘗試這個技巧之前先嚐試第一個選項。

關於意見,你不應該直接使用innerHTML插入一個HTML子樹的文件,因爲大多數時候,它不工作(尤其是當形式參與),有一個appendChild()重做工作確保正確的文件,這樣的:

var dummyContainer=document.createElement("span"); 
var dummyContainer.innerHTML="..."; //insert stuff here, because it's easy to use ;) 
myContainer.innerHTML=""; //clearing your "real" container doesn't add anything to the HTML tree, it'll work - you can also use removeChild() in a loop (but it's not as easy to use!) 
myContainer.appendChild(dummyContainer); //appendChild will translate properly the text inserted by innerHTML in dummyContainer into a clean HTML subtree 
+0

當'innerHTML'無法插入HTML子樹時,您能給我們一個示例/參考嗎? 'myContainer.innerHTML =「什麼錯?」'? – kobik 2012-03-16 14:16:43

+0

@kobik我知道,從我自己的經歷(幾年前,但如果我用縮水術,我會定期告訴他/她),我浪費了很多時間試圖理解爲什麼那個愚蠢的innerHTML沒有完成它的工作。首先,爲了回答你的問題,我只搜索了「innerHTML插入問題」,並找到了其他相關結果 - 這篇有趣的文章:http://domscripting.com/blog/display/99其次,引用W3Schools的http:///www.w3schools.com/htmldom/dom_methods.asp「innerHTML不是W3C DOM規範的一部分」,也就是說,還有其他特殊友好的方法來修改HTML樹(appendChild ...) – 2012-03-17 02:45:03

+0

感謝您的信息。 – kobik 2012-03-17 13:32:01

相關問題