Problem
The JavaScript object represented by ‘this’ does not appear to be as expected.
The problem is caused because of the way that XPages adds events to DOM objects through the <xp:eventHandler>
The Situation
I wanted to pass the id from a button to a function. Outside of XPages I would normally acheive this by passing a reference to the button(this) to a function (saySomething in this case) and then extracting the id from the object passed:
function saySomething(obj){ alert("This is my object - "+this +"nnThis is my id - "+ this.id) }

<button id="markyButton" onclick="saySomething(this)"></button>
In this case I am passing the “this” object to the function.
this
is an object reference to the DOM element which it was generated from – for some serious stuff on ‘this’ check out this article
http://www.quirksmode.org/js/this.html
XPages fail 😦
However when I add the JavaScript to the XPages button and add the code through the GUI Designer interface

I do not get the expected result when I click on the button……

The Explanation…
The reason this happens is because of the way that XPages assigns events to objects in the webpage. If you have ever looked at the source of an XPages you will almost certainly have seen a whole load code like this at the end of the page
XSP.addOnLoad(function() { XSP.attachEvent("..... }
and this is how the XPage adds the event to the object – in the case of this example the XPages creates our button in the HTML but as you can see there is no onclick event initially assigned to it
<button class="lotusBtn" type="button" name="view:_id1:_id2:_id37:button1" id="view:_id1:_id2:_id37:button1">Click This</button>
and then at the bottom of the web page source code we can see the assignment of the event after during the “addOnLoad” which means after the page has loaded.
<script type="text/javascript"> function view__id1__id2__id37__id40_clientSide_onclick(thisEvent) { alert("This is my object - "+this+"nnThis is my id - "+this.id) } XSP.addOnLoad(function() { XSP.attachEvent("view:_id1:_id2:_id37:_id40", "view:_id1:_id2:_id37:button1", "onclick", view__id1__id2__id37__id40_clientSide_onclick, false, 2); }); </script>
What is happening?
The XPage is adding the function “view__id1__id2__id37__id40_clientSide_onclick” to the “onclick” event of the “view:_id1:_id2:_id37:button1” DOM element (our button in this case).
The nuances of this are subtle but important – the code is not adding “alert(whetever)” to the onclick event it is adding a function call to the onclick event.
So. when the button is clicked the function view__id1__id2__id37__id40_clientSide_onclick executes it’s code and in that situation ‘this’ no longer refers to the button.
The difference is clear when we look at the resulting code side by side
<button value="or Click this" id="button3" onclick='alert("This is my object - "+this+"nnThis is my id - "+this.id)'></button> or <button value="or Click this" id="button3" onclick='view__id1__id2__id37__id40_clientSide_onclick()'></button>
“this” is never passed to the view__id1__id2__id37__id40_clientSide_onclick() function and therefore any reference to the button is lost.
When the function executes – “this” refers to the function (which isn’t an object) and therefore we get the window (the webpage) as a failover.
The solution
If you need to do something like this then add the onclick event to the source pane.
Here is the XML markup for the XPages generated event (which fails me)
<xp:button value="Click This" id="button1"> <xp:eventHandler event="onclick" submit="false"> <xp:this.script> <![CDATA[alert("This is my object - "+this+"\nThis is my id - "+this.id)]]> </xp:this.script> </xp:eventHandler> </xp:button>
and the XML markup for the manually added onclick event (which works)
<xp:button value="or Click this" id="button2" onclick='alert("This is my object - "+this+"\nThis is my id - "+this.id)'> </xp:button>
The demonstration
Have you tried passing thisEvent instead of this?
Rajeev – good idea
thisEvent is passed to the view__id1__id2__id37__id40_clientSide_onclick function as part of the XPages generated function call.
I added a button to the demo to alert thisEvent – it is the mouse click event and you could probably trace back the event to find what triggered it but it is way harder than just adding the onclick through the source pane 🙂
Those inline on* properties are handy, especially if you want to do something like “return false” to make sure the action doesn’t actually happen (like in onkeypress to prevent some keys from working).
If you’re in a situation where using an eventHandler makes more sense (or you don’t have the option), I think you can get to the desired element using “thisEvent.target”. In the case of a button click, that value will be the button itself, much like you’d get with “this” in a normal situation. “thisEvent” is also important for getting a handle on the current event, since not all browsers (Firefox, I believe) will let you use “event” in that context.
Jesse – you got it
alert(“This is my object – “+thisEvent.target+”\n\nThis is my id – “+thisEvent.target.id)
Just as I posted above in response to Rajeev – I have updated the demo page with a 4th button illustrating this
thanks 🙂