2014-09-01 3 views
0

У меня есть портал xpage, который имеет пару ссылок. Когда пользователь открывает ссылку, я хочу вызвать некоторый SSJS для регистрации ссылки, которую пользователь нажал.Trigger 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 блокируется блокировщики всплывающих окон, есть один вариант для запуска SSJS кода с помощью дополнительного запроса Ajax к XAgent. Мы реализовали такое решение на OpenNTF Collaboration Сегодня сайт и Никлас Хайдлофф объясняет, как это работает в 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. Если вы заметили, мы готовим URL-адрес в log.xsp?nid=ID_OF_ENTRY. log.xsp - это XAgent, и он принимает данные идентификатора и сохраняет событие 'clicked'. В этом примере мы использовали кеширующий компонент, но вы можете запускать любые SSJS или Java в XAgent. Ему не нужно возвращать данные. Здесь вы также можете использовать компонент RPC.

+0

, но я хочу, чтобы открыть ссылку в новой вкладке. как это работает – user2316219

+0

В таком случае у вас будет два варианта. Во-первых, вы создали бы промежуточную страницу, страницу стиля XAgent, которая записывает, какая страница будет нажата и перенаправляет пользователя на нужную страницу. Во-вторых, вы должны использовать компонент RPC, асинхронно отправляя событие «нажатие на страницу», когда пользователь переходит на другую страницу на новой вкладке. Мы внедрили второй метод CollaborationToday, я обновляю ответ ссылками. –

+0

Обновлен ответ. Извините за мою ошибку, я снова посмотрел на код, мы не используем RPC-компонент в CT. Но это также было бы альтернативой нашему подходу. –

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>

Смежные вопросы