如何填写javascript编辑器?

时间:2012-03-14 11:23:44

标签: javascript delphi browser autofill

我使用TEmbeddedWebBrowser使用FillForm方法填充html表单。但我的html表单包含一个完全基于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);" />

2 个答案:

答案 0 :(得分: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上使用普通Javascript / IE进行测试时出现了虚假结果

答案 1 :(得分:1)

我没有关于这个TEmbeddedWebBrowser工具的经验,但根据你的帖子,我正在考虑一种检索表单字段的方法。一旦你知道它包含哪些字段,我想你可以填写它们,因为它似乎不是你帖子的目的。

  1. 假设有一个声明的表单并且可以访问:您可以获取表单和 解析其.elements集合:如果在您的页面中声明它,则很容易 (给它一个id属性,然后使用document.getElementById()), 如果表单由/ inside声明,它仍然可行 editor.js,然后使用document.forms

  2. 否则:您可以获得转储 来自网络的脚本 - 如this one - 并查看通话时打印的内容(包括editor.js后) 自然地dump(data)dump(data[body])。正如data[]那样 用作提交按钮调用的rtevalue()的参数 onclick,它应包含表单的键/值对。这种方法的坏处是data[]必须 由Javascript填充,所以如果你的表单有单选按钮或 复选框你可能只看到所选的那些,这就是为什么我会在尝试这个技巧之前尝试第一个选项。

  3. 关于评论,您不应直接使用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