我需要谷歌的广告使用DOM API在任何语言(DELPHI,C++,C#)添加到页面。我可以使用DOM将Adsense代码添加到网页中,但是如何随后触发它运行?如何在AdSense代码插入嵌入式浏览器后运行?
广告代码通常运行在document.load
事件。我如何将函数附加到该事件? (我也可以使用文档下载事件,但这个事件与DOM不兼容。)
我需要将我的函数附加到document.load
,我需要在运行Adsense Javascript代码之前使用DOM功能来解析HTML代码。
我需要谷歌的广告使用DOM API在任何语言(DELPHI,C++,C#)添加到页面。我可以使用DOM将Adsense代码添加到网页中,但是如何随后触发它运行?如何在AdSense代码插入嵌入式浏览器后运行?
广告代码通常运行在document.load
事件。我如何将函数附加到该事件? (我也可以使用文档下载事件,但这个事件与DOM不兼容。)
我需要将我的函数附加到document.load
,我需要在运行Adsense Javascript代码之前使用DOM功能来解析HTML代码。
这听起来更像是一个JavaScript的问题。
如果你使用一些像jQuery这样的框架,所有这些都会容易得多:它可以让你轻松地从JavaScript代码访问DOM。
例如见http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery进行正式教程轻松地操纵你的页面的DOM。
下面是此页的摘录:
我们先从一个空的HTML页面:
<html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> // we will add our javascript code here </script> </head> <body> <!-- we will add our HTML content here --> </body> </html>
此页面只是加载的jquery.js库(确保URL指向 到您保存您的jQuery的副本!这个例子假设你 其存储在同一目录这个例子文件)。两条评论 指示我们将在哪里用代码扩展此模板。由于几乎我们在使用jQuery时读取或操作文档对象模型(DOM)时所做的一切,我们需要确保在DOM准备就绪后立即添加 事件等。
要做到这一点,我们注册的文件ready事件。
$(document).ready(function() { // do stuff when DOM is ready });
把警报到该功能并没有太大的意义,因为一个 警报并不需要加载的DOM。因此,让我们尝试一下 稍微复杂一点:单击链接时显示警报。
添加以下到
<body>
:<a href="">Link</a>
现在更新
$(document).ready
处理程序:$(document).ready(function() { $("a").click(function() { alert("Hello world!"); }); });
然后你只需要添加这个JavaScript在Delphi,C++或C#代码生成它,作为纯文本。您必须将Google AdSense代码插入$(document).ready
处理程序的主页面。
这是不可能的:(在系统编程之前,我无法访问DOM在系统编程之前,也许我可以访问但我没有像document.load之前的事件,如果我有就像那个事件一样,是的,我可以使用你的示例,但是准备好的状态已经准备就绪的html文档已经准备就绪了( – relativ
)然后直接将注意力集中到元素上,例如[IHTMLElement2 :: onreadystatechange'](http:/ /msdn.microsoft.com/en-us/library/aa704023%28v=VS.85%29.aspx) – TLama
感谢TLama,你是一位非常优秀的程序员,我解决了我的问题,就像你向我展示的一样:) doc .onreadystatechange:=(TEventObject.Create(DocReadyStateChangeProc)as IDispatch); – relativ
用delphi你可以这样做:
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://stackoverflow.com');
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
Script: WideString;
begin
Script := 'document.onload=alert("boo!");';
if (pDisp as IWebBrowser) <> nil then
((pDisp as IWebBrowser).Document as IHTMLDocument2).parentWindow.execScript(Script, 'JScript');
end;
这里也即将sinking events with TWebBrowser一些额外的信息。这对你的情况可能有用。 注意的:
TEventObject = class(TDebugInterfacedObject, IDispatch)
应被声明为: TEventObject = class(TInterfacedObject, IDispatch)
为什么不接受和downvote? – kobik
如果您需要从外部访问DOM(不喜欢里面用jQuery),那么你可以很容易地用Delphi做。但是您应该首先安装bsalsa的优秀嵌入式Web浏览器组件TEmbeddedWB
,这使得使用浏览器非常容易。
将TEmbeddedWB
组件拖放到窗体上,并为其添加处理程序。 OnDocumentComplete
这是引发当文档的DOM完全访问:
procedure TForm1.EmbeddedWB1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
// check that the event is raised for the outermost browser (not frames or iframes)
if (pDisp as IUnknown) = (EmbeddedWB1.ControlInterface as IUnknown) then
begin
// do your work here
// example: show a message
EmbeddedWB1.ExecScript('eval("alert(''Hello'')")', '');
end;
end;
启动导航测试:
EmbeddedWB1.Navigate('http://www.google.com');
我已经使用EmbeddedWB核心库:)但我无法使用VCL组件(TEmbeddedWB)。我需要找到活动的Internet Explorer中用于操作活动Internet Explorer中的HTML代码的活动Internet Explorer窗口。 – relativ
你有例如检验[this](http://stackoverflow.com/questions/153748/how-to-inject-javascript-in-webbrowser-control)发布。看来你会做类似的事情。 – TLama
感谢TLama,你是一位非常优秀的程序员,我以同样的方式解决了你的问题:) doc.onreadystatechange:=(TEventObject.Create(DocReadyStateChangeProc)as IDispatch); – relativ
@TLama,很好的链接:)你有没有实现过'WebBrowser1.Document.InvokeScript'? – kobik