2011-12-12 66 views
0

我需要谷歌的广告使用DOM API在任何语言(DELPHI,C++,C#)添加到页面。我可以使用DOM将Adsense代码添加到网页中,但是如何随后触发它运行?如何在AdSense代码插入嵌入式浏览器后运行?

广告代码通常运行在document.load事件。我如何将函数附加到该事件? (我也可以使用文档下载事件,但这个事件与DOM不兼容。)

我需要将我的函数附加到document.load,我需要在运行Adsense Javascript代码之前使用DOM功能来解析HTML代码。

+1

你有例如检验[this](http://stackoverflow.com/questions/153748/how-to-inject-javascript-in-webbrowser-control)发布。看来你会做类似的事情。 – TLama

+0

感谢TLama,你是一位非常优秀的程序员,我以同样的方式解决了你的问题:) doc.onreadystatechange:=(TEventObject.Create(DocReadyStateChangeProc)as IDispatch); – relativ

+0

@TLama,很好的链接:)你有没有实现过'WebBrowser1.Document.InvokeScript'? – kobik

回答

0

这听起来更像是一个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处理程序的主页面。

+0

这是不可能的:(在系统编程之前,我无法访问DOM在系统编程之前,也许我可以访问但我没有像document.load之前的事件,如果我有就像那个事件一样,是的,我可以使用你的示例,但是准备好的状态已经准备就绪的html文档已经准备就绪了( – relativ

+0

)然后直接将注意力集中到元素上,例如[IHTMLElement2 :: onreadystatechange'](http:/ /msdn.microsoft.com/en-us/library/aa704023%28v=VS.85%29.aspx) – TLama

+0

感谢TLama,你是一位非常优秀的程序员,我解决了我的问题,就像你向我展示的一样:) doc .onreadystatechange:=(TEventObject.Create(DocReadyStateChangeProc)as IDispatch); – relativ

1

用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)

+2

为什么不接受和downvote? – kobik

0

如果您需要从外部访问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'); 
+0

我已经使用EmbeddedWB核心库:)但我无法使用VCL组件(TEmbeddedWB)。我需要找到活动的Internet Explorer中用于操作活动Internet Explorer中的HTML代码的活动Internet Explorer窗口。 – relativ