2014-09-01 42 views
0

我有门户网站xpage有几个链接。当用户打开链接时,我想调用某个SSJS来记录用户点击了哪个链接。当您打开一个链接时触发SSJS

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

任何人有任何想法如何做到这一点?

回答

1

您可以照常运行您的SSJS。添加CSJS代码到事件处理程序的oncomplete财产内链接...

<xp:link ....> 
.... 
    <xp:eventHandler oncomplete="location.href='http://...url...'"> 
    ... other stuff ... 
    </xp:eventHandler> 
</xp:link> 

,将确保您的SSJS代码运行在客户端移出页之前。

UPDATE:

如果目标页面的新选项卡上打开,并window.open被弹出窗口拦截器堵塞,有一个选项,通过附加的Ajax请求的运行SSJS代码XAgent。我们已经实施了OpenNTF协作今天现场这样的解决方案和尼克拉斯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组件。

+0

但我想打开一个新的标签的链接。这将如何工作 – user2316219 2014-09-01 17:20:04

+0

在这种情况下,你会有两种选择。首先,您将创建一个中间页面,一个XAgent样式页面,记录哪个页面被点击并将用户重定向到所需的页面。其次,当用户导航到新选项卡上的其他页面时,您将使用RPC组件异步提交“页面已单击”事件。我们已经在CollaborationToday上实施了第二种方法,我会用链接更新答案。 – 2014-09-01 17:29:00

+0

更新了答案。对不起我的错误,我再次查看了代码,我们没有在CT中使用RPC组件。但它也可以替代我们的方法。 – 2014-09-01 17:49:54

0

我想我明白了。它也可能通过异步调用得到解决,但也可以正常工作。

创建链接并在点击事件中添加客户端。用一秒钟的时间触发一个按钮的点击。网页打开,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>

相关问题