我的门户网站xpage有几个链接。当用户打开链接时,我想调用一些SSJS来记录用户点击的链接。
到目前为止,我试图通过链接的onclick事件来做到这一点,但问题是window.open将被弹出窗口阻止程序阻止。
有人想知道如何实现这个目标吗?
答案 0 :(得分:1)
您可以像往常一样运行SSJS。在链接...
中将CSJS代码添加到事件处理程序的oncomplete
属性中
<xp:link ....>
....
<xp:eventHandler oncomplete="location.href='http://...url...'">
... other stuff ...
</xp:eventHandler>
</xp:link>
这将确保您的SSJS代码在客户端移出页面之前运行。
<强>更新强>
如果目标页面将在新选项卡上打开并且window.open被弹出窗口阻止程序阻止,则有一个选项可以通过向XAgent发送额外的Ajax请求来运行SSJS代码。我们在OpenNTF Collaboration Today网站上实施了这样的解决方案,Niklas Heidloff解释了它在NotesIn9视频中的工作原理:
http://notesin9.com/index.php/2012/09/25/notesin9-078-xpages-and-counting-clicks/
在我们显示内容链接的custom control中,我们运行一个CSJS函数logClick()
,该函数在导航之前运行:
<xp:link
value="#{javascript:compositeData.link}"
text="#{javascript:compositeData.title}"
target="_blank"
id="link6">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[
var baseUrl = "#{javascript:var baseUrl = context.getUrl().toString();baseUrl = baseUrl.substring(0, baseUrl.indexOf('.nsf')+4);baseUrl }";
var url = baseUrl + "/log.xsp?" + "nid=" + "#{javascript:compositeData.nID}";
logClick(url);
]]></xp:this.script>
</xp:eventHandler>
</xp:link>
logClick()
函数在layout custom control中定义,它只是抛出一个Ajax请求。如果您注意到,我们正在准备log.xsp?nid=ID_OF_ENTRY
中的网址。 log.xsp是一个XAgent,它接收id数据并保存“clicked”事件。我们在此示例中使用了缓存bean,但您可以在XAgent中运行任何SSJS或Java。它不需要返回数据。在这里,您还可以使用RPC组件。
答案 1 :(得分:0)
我想我明白了。它也可能通过异步调用得到修复,但也可以正常工作。
创建链接并在click事件上添加客户端。触发点击按钮一秒钟延迟。网页打开,SSJS随后开火。见附例:
<xp:link escape="true" text="Link" value="Link">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[id="#{javascript:MenuDocument.getDocument().getUniversalID()}";
setTimeout(function(){$(".Button"+id).click();},1000);
]]></xp:this.script>
</xp:eventHandler></xp:link>
<xp:button value="log" id="logbutton"
style="display:none;">
<xp:this.styleClass><![CDATA[#{javascript:"Button"+MenuDocument.getDocument().getUniversalID()}]]></xp:this.styleClass>
<xp:eventHandler event="onclick" submit="true"
refreshMode="partial" refreshId="Recent">
<xp:this.action><![CDATA[#{javascript://do whatever you want to do}]]></xp:this.action>
</xp:eventHandler>
</xp:button>