2

所以我只花了一个小时试图让它工作。我正在对 TWebBrowser 进行一些测试,因此我可以将我的发现应用到一个项目中。我想测试将内容加载到其中的不同方式(URL、LoadFromStrings() 和 EvaluateJavaScript())。问题是,无论如何我都不能将一个简单的字符串传递给最后一个方法,而不会错误地陷入撇号中。

procedure TForm1.FormCreate(Sender:TObject);
const S='<span style="color:red">ABC</span><span style="color:green">ABC</span><span style="color:blue">ABC</span>';
begin
WebBrowser1.LoadFromStrings('<html><body><div id="target">[x]</div></body></html>','');
WebBrowser1.EvaluateJavaScript('document.getElementById("target").insertAdjacentHTML('+
'"beforend",'#39+S+#39');');
end;

看到#39了吗?如果没有它们,则发送的字符串根本不带撇号,因此生成的 JavaScript 脚本无效。如果它们仍然存在,我会在字符串的每一端得到两个撇号,仍然会弄乱脚本。这是什么?

4

1 回答 1

6

我的心理调试告诉我您正在查看调试器中的字符串。单引号是字符串分隔符。所以需要逃避。它通过加倍逃脱。所以当调试器显示这样的字符串时:

'a''b'

这实际上是三个字符长,中间字符是一个单引号。

所以

Writeln('a''b');

输出

a'b

或者要在您的代码中使用示例,请考虑以下完整程序:

{$APPTYPE CONSOLE}
const
  S = '<span style="color:red">ABC</span>';
begin
  Writeln(#39 + S + #39);
end.

该程序输出:

'<span style="color:red">ABC</span>'

如果你想避免使用硬编码的字符代码,你可以使用这样的转义单引号:

  Writeln('''' + S + '''');
于 2015-06-07T09:33:06.307 回答