打开链接时触发SSJS

时间:2014-09-01 12:50:08

标签: xpages xpages-ssjs

我的门户网站xpage有几个链接。当用户打开链接时,我想调用一些SSJS来记录用户点击的链接。

到目前为止,我试图通过链接的onclick事件来做到这一点,但问题是window.open将被弹出窗口阻止程序阻止。

有人想知道如何实现这个目标吗?

2 个答案:

答案 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>