MSHTML 出现在编辑
Posted
技术标签:
【中文标题】MSHTML 出现在编辑【英文标题】:MSHTML appear on editing 【发布时间】:2015-01-18 00:00:36 【问题描述】:我想添加另一个 MShtml 问题。感谢所有回复。
我们在 Delphi 中使用标准的 TWebbrowser 组件,该组件在内部使用 mshtml.dll。另外,我们使用注册表来确保页面使用新的渲染引擎(Web-Browser-Control-Specifying-the-IE-Version、MSDN: FEATURE_BROWSER_EMULATION)进行渲染。所以我们使用 IE 10 的渲染,但是使用 ie 8 到 ie 11 的结果是一样的。
使用标准的 MSHTML (IE7) 渲染机器可以正常工作,但由于新的渲染选项,我们需要新的 MSHTML 渲染。
我们使用控件的设计模式使用户能够对文档进行更改:
var
mDocument: IHTMLDocument2;
begin
mDocument := ((ASender as TWebBrowser).Document as IHTMLDocument2);
mDocument.designMode := 'on';
现在我们有以下问题: 我们通过 IPersistStreamInit.Load(...) 将以下(简化的)HTML 加载到 WebBrowser 中:
<html>
<body>
What should I do
with some of the
spaces.
</body>
</html>
在 WebBrowser 用户可以看到以下内容:
现在,当在编辑模式下的 WebBrowser 中选择单词“with”并键入一个字符时,会出现一些空格。 HTML 现在有 在其中 - 与编辑前 HTML 中的空格一样多:
代码是:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv="Content-Type" content="text/html; charset=unicode">
<META name="GENERATOR" content="MSHTML 10.00.9200.16540"></HEAD>
<BODY> What should I do n some of the spaces.
</BODY></HTML>
在WebBrowser中替换“空格”这个词也可以达到同样的效果。
这对于使用我们应用程序的用户来说是一种不良行为。
每个文本前面有空格的 HTML 代码都有相同的行为。麻烦的是,MSHTML 本身会生成这样的 HTML。
现在我们想到了一个解决方案来删除每行左侧的所有空格,但我们认为这样的解决方法可能会导致更大的混乱,因为它们会改变 HTML。这可能会导致呈现的一些不同行为。
【问题讨论】:
我建议您将这个关于IPersistStreamInit.Load
的“子问题”添加到上一个问题中,然后删除这个问题,而不是提出新问题。显然这是相关的。在任何情况下,IMO 你要么通过IPersistStreamInit
读/写而忘记MSHTML 编辑,或者使用MSHTML 编辑和解决它的“设计”行为......正如我已经提到的,这是一个有趣的问题。
我不认为这是一个子问题。行为不同。这里我们只使用 IPresistStreamInit.Load(...) 而没有使用 PasteHTML()。在这里,我们希望为用户提供更改内容的可能性。但是当他更改内容时,就会出现空格。
好吧,你从认为(和我一样)相同行为的人那里得到了 -1。是否进行 PasteHTML
或任何其他 DOM 操作都没有关系。一旦 DOM 本身发生变化(在设计模式下),IE 将重构 HTML。进入设计模式后,通过 reading 从IPersistStreamInit
测试/记录源代码。看看你有什么......
问题更进一步。我可以获取一个在编辑模式下使用 WebBrowser 完全生成的文档(应该重组为与 DOM 兼容的 HTML)并通过 IPersistStreamInit 再次加载它并具有相同的行为。
【参考方案1】:
考虑删除每行之前的空格,会让您朝着正确的方向前进,但与您应该做的事情相去甚远:在@之前转换数据info HTML 987654322@.
由于HTML specification 规定 HTML 代码中的任何空白都应被视为空白的单个实例(<pre>
标记内除外),因此当您使用这些额外的空格时,IE 的设计模式会混淆这些额外的空格是可以理解的在他们周围编辑。你偶然发现了一个边境案件。
我建议你要么不要使用IPersistStreamInit.Load
但是Navigate('about:<html><body></body></html>');
和document.body.innerText:=...
代替,
或注意正确格式化初始 HTML:
解析文本以折叠任何/所有连续的空格, 将所有&amp;
替换为&amp;
,将&lt;
替换为&lt;
等等...
(也许还有#13#10
和'<br />'
和#13#10#13#10
和'</p><p>'
?)
【讨论】:
感谢您的回复。现在我尝试了另外两种方法,但都没有奏效。第一种是将文件写入磁盘并使用WebBrowser.Navigate2(...)
加载它。第二种是按照@Stijn Sanders 的建议使用document.body.innerText := ....
以上是关于MSHTML 出现在编辑的主要内容,如果未能解决你的问题,请参考以下文章
用Twebbrowser做可控编辑器与MSHTML(调用js)
mshtml.dll被瑞星查毒删除,网页无法打开,瑞星也进不来如何修复
我的系统是XP,我打开记事本的时候出现错误提示,说啥拒绝访问?怎么回事啊?