【问题标题】:How do I fill a javascript editor?如何填写 javascript 编辑器?
【发布时间】:2012-03-30 20:30:47
【问题描述】:

我使用TEmbeddedWebBrowser 使用FillForm 方法填写html 表单。但是我的 html 表单包含一个完全基于 javascript 的编辑器,我不知道如何填写。

类似这样的:

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

还有提交按钮:

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

【问题讨论】:

  • 谢谢,例子中使用了SetFieldValue的方法。但正如我所说,问题是表单中没有字段。编辑器是基于 js 的。我怎样才能找到它的领域?
  • 我尝试使用innerHtmlinnerText 属性填充iframe,但出现此错误:找不到成员。 iframe 似乎没有这些属性。
  • IHTMLElement 类没有execCommand 方法。
  • @Kermia,向我们展示javascript 源或指向它的链接,以及您的Delphi 代码...顺便说一句,当您回复评论时使用@,后跟用户名,所以他/她会收到通知。

标签: javascript delphi browser autofill


【解决方案1】:

编辑器本身是 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 进行测试,但是当我在IE 上使用普通HTML/Javascript 进行测试时得到了虚假结果。

【讨论】:

    【解决方案2】:

    我没有使用此 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 填充,因此如果您的表单有单选按钮或 你可能只会看到选中的复选框,这就是为什么我会在尝试这个技巧之前先尝试第一个选项。

    关于 cmets,您不应直接使用 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
    

    【讨论】:

    • innerHTML 不能插入 HTML 子树时,你能给我们一个例子/参考吗? myContainer.innerHTML="&lt;span&gt;whatever&lt;/span&gt;" 怎么了?
    • @kobik 我从我自己的经验中知道(几年前,但如果我使用收缩器,我会定期告诉他/她),我浪费了几天时间试图理解为什么那个愚蠢的 innerHTML 没有不做它的工作。首先,为了回答您的问题,我刚刚搜索了“innerHTML 插入问题”,并在其他相关结果中发现了这篇有趣的文章:domscripting.com/blog/display/99 其次,引用 W3Schools w3schools.com/htmldom/dom_methods.asp“innerHTML 不是 W3C DOM 的一部分规范。”,即有其他规范友好的方式来改变 HTML 树(appendChild...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多