Ok so when you create your fields or divs in XPage and you give them a sane Id, when XPage then renders them you get ids like:
id=”view:_id1:_id2:ContentControl:CompanyName”
I do see why it is necessary, since you can have multiple forms in one XPage and it would be impossible to keep them apart if fields did not have unique names.
But what if you have your JavaScript libraries which uses functions like getElementById or if you are smarter than that and uses the dojo.byId which is browser independent.
There is no way using the client side syntax (#{id:comboBox}) you can use in the XPage and custom controls.
At the moment I see two approaches, the first is to create a global variable which is then used in the JavaScript library. This method is described here!
http://www-10.lotus.com/ldd/ddwiki.nsf/dx/element_ids_in_client_side_javascript_on_xpages.htm
The second method is to use dojo.query().
dojo.query can be used to “query” the DOM tree, a really powerful function which is well worth digging into.
But in this case we will use it to find our html element by querying for the elements where id ends with the id we are looking for.
The syntax would be dojo.query(“[id$=’:CompanyName’]”).
Let’s take it apart. The brackets means we are searching for a tag with the name “id” ([id$=’…), which value ends with our search string, ‘$=’ stands for ends with.
The search string begins with a colon since we want to be sure we do not get fields with ids like ‘FirstCompanyName’, since they also ends with ‘CompanyName’.
The result will be an array of html elements, with multiple entries if more than one element id ends with ‘:CompanyName’, which very well may be the case, see when to use section below.
So when do we use which one:
The first method is preferred if you have multiple forms as data sources for your fields or when you cannot be absolutely sure that the ids are unique over all elements you need to use in your JavaScript library!
In all other cases the second method should work fine.
So now you have to rewrite all your JavaScript libraries! Yes you do and when you do that try to skip everything which takes an id string as a parameter, rewrite it to use elements or better to take both types as an argument.
Function doSomthingWithElement(elmnt){
if(typeof(elmnt) === ‘string’){
elmnt = dojo.byId(elmnt);
}
// use the element
alert(elmnt.innerHTML);
}
What you also can do is to replace the XSP objects method getElementById with your own implantation of it using the dojo.query().
Either put the code inside addOnLoad in the client side XPage event onClientLoad or better put the code below in to a JavaScript library which is added as a resource into the XPage. Be sure to put in the JavaScript library early in the code so that it is loaded before used.
The XSP object is created by Domino server and contains different convenient functions like a getElementsById which actually only is a wrapper around dojo.byId()!
dojo.addOnLoad(function(){
dojo.mixin(XSP, {
getElementById: function(idName){
var result = dojo.byId(idName);
if (!result){
result = dojo.query("[id$=':" + idName + "']");
if (result){
result = result[0];
}
}
return result;
}
})
});
I’ll try to explain what happens: First the dojo.addOnLoad() will run the function given as a parameter when the page has loaded in the client. Then by using dojos mixin the script replaces the object literal entry for “getElementById” with the code given as a second parameter. The code itself doing the magic first tries to find the element the classic way by using dojo.byId(). In this way we do not break the previous functionality. If nothing is found it tries to find the element by using the dojo.query() method described above.
So now if you want to find an element where the id has been replaced by the Domino XPage rendering engine you can use XSP.getElementById(‘CompanyName’) as you hopefully are used to.
An alternativ can be to mixin xspById() into dojo.
If someone knows of a function which can be used instead in custom JavaScript libraries please tell me since I’ve been searching a lot for a solution to this problem.