You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Ma...@sanofi-aventis.com on 2008/11/26 15:14:40 UTC
Generating unique ids for t:checkbox
Hello,
Today we noticed that the t:checkbox component used inside a
t:selectManyCheckbox generates checkboxes all with the same ID. This is
a probably since we use h:outputLabel with the "for" attribute, mainly
for accessibility purposes, but the ids don't match. We have something
like this in the page.
<t:selectManyCheckbox
id="articlesChecked"
value="#{mbArticles.articlesChecked}"
layout="spread"
onclick="checkState(this,false,'articlesList')">
Then a bit further down we have this in a dataList
<h:outputLabel for="articleCheckbox">
<t:checkbox index="#{count}" for=":articlesForm:articlesChecked"
id="articleCheckbox"/>
So the checkboxes generated are like
<input type="checkbox" name="articlesChecked" id="articlesChecked" />
I know the HTML spec pretty well and for this case only the "name"
attribute really needs to be repeated, the id can be unique and should
be, it's actually invalid to have duplicate ids in the DOM (then again
so is an id starting with the "_" character. I'll never understand that
decision).
I extended the HtmlCheckboxRenderer and basically changed it such that
it will output the name attribute as the clientId of the UISelectMany
component and the ID as the clientId of the HtmlCheckBox component. I
override encodeEnd and kept it identical except I have my own
renderSingleCheckBox method, which is also identical except it calls my
version of renderCheckBox, which is nearly identical except for this
part:
if (renderId) {
if (StringUtils.isNotEmpty(checkboxClientId)) {
writer.writeAttribute(HTML.ID_ATTR, checkboxClientId,
null);
}
}
checkboxClientId is an extra parameter passed in.
So far this solution seems to work. The ids are correctly generated and
the functionality hasn't broken (meaning I can select a few checkboxes
and they're picked up on the other side).
So my questions here are:
Is there any possible side affect that I haven't though about? I
probably haven't tested every possible scenario of use here.
Has this been addressed already in a later version of tomahawk? I'm
using 1.1.6 here. If not then it should be updated in a future release
of Tomahawk.
Matt
Re: Generating unique ids for t:checkbox
Posted by alvaro tovar <al...@gmail.com>.
hello i try of make the same of you, if you can show me your code,
i try with this but don't run
*<tr:selectManyCheckbox value="#{reoffermanager.dealTypeSelected}"
converter="dealTypeConverter"
binding="#{reoffermanager.tableDealType}"
id="listDealType" >
<t:dataList value="#{constantManager.dealTypeList}"
var="item" rowIndexVar="row" forceIdIndex="true">
<tr:selectItem value="#{item}" />
</t:dataList>*
2008/11/26 Leonardo Uribe <lu...@gmail.com>
>
>
> On Wed, Nov 26, 2008 at 9:14 AM, <Ma...@sanofi-aventis.com>wrote:
>
>> Hello,
>>
>>
>>
>> Today we noticed that the t:checkbox component used inside a
>> t:selectManyCheckbox generates checkboxes all with the same ID. This is a
>> probably since we use h:outputLabel with the "for" attribute, mainly for
>> accessibility purposes, but the ids don't match. We have something like this
>> in the page.
>>
>>
>>
>> <t:selectManyCheckbox
>>
>> id=*"articlesChecked"*
>>
>> value="#{mbArticles.articlesChecked}"
>>
>> layout=*"spread"*
>>
>> onclick=*"checkState(this,false,'articlesList')"*>
>>
>>
>>
>>
>>
>> Then a bit further down we have this in a dataList
>>
>>
>>
>>
>>
>> <h:outputLabel for=*"articleCheckbox"*>
>>
>> <t:checkbox index="#{count}" for=*":articlesForm:articlesChecked"*
>> id=*"articleCheckbox"*/>
>>
>>
>>
>> So the checkboxes generated are like
>>
>>
>>
>> <input type="checkbox" name="articlesChecked" id="articlesChecked" />
>>
>>
>>
>> I know the HTML spec pretty well and for this case only the "name"
>> attribute really needs to be repeated, the id can be unique and should be,
>> it's actually invalid to have duplicate ids in the DOM (then again so is an
>> id starting with the "_" character. I'll never understand that decision).
>>
>>
>>
>> I extended the HtmlCheckboxRenderer and basically changed it such that it
>> will output the name attribute as the clientId of the UISelectMany component
>> and the ID as the clientId of the HtmlCheckBox component. I override
>> encodeEnd and kept it identical except I have my own renderSingleCheckBox
>> method, which is also identical except it calls my version of
>> renderCheckBox, which is nearly identical except for this part:
>>
>>
>>
>>
>>
>> *if* (renderId) {
>>
>> *if* (StringUtils.*isNotEmpty*(checkboxClientId)) {
>>
>> writer.writeAttribute(HTML.*ID_ATTR*, checkboxClientId, *
>> null*);
>>
>> }
>>
>> }
>>
>>
>>
>> checkboxClientId is an extra parameter passed in.
>>
>>
>>
>> So far this solution seems to work. The ids are correctly generated and
>> the functionality hasn't broken (meaning I can select a few checkboxes and
>> they're picked up on the other side).
>>
>>
>>
>> So my questions here are:
>>
>>
>>
>> Is there any possible side affect that I haven't though about? I probably
>> haven't tested every possible scenario of use here.
>>
>>
>>
>> Has this been addressed already in a later version of tomahawk? I'm using
>> 1.1.6 here. If not then it should be updated in a future release of
>> Tomahawk.
>>
>>
>>
> Hi
>
> Yes, see https://issues.apache.org/jira/browse/TOMAHAWK-1188 for details.
> I hope this helps.
>
> regards
>
> Leonardo Uribe
>
>
>> Matt
>>
>>
>>
>>
>>
>
>
Re: Generating unique ids for t:checkbox
Posted by Leonardo Uribe <lu...@gmail.com>.
On Wed, Nov 26, 2008 at 9:14 AM, <Ma...@sanofi-aventis.com>wrote:
> Hello,
>
>
>
> Today we noticed that the t:checkbox component used inside a
> t:selectManyCheckbox generates checkboxes all with the same ID. This is a
> probably since we use h:outputLabel with the "for" attribute, mainly for
> accessibility purposes, but the ids don't match. We have something like this
> in the page.
>
>
>
> <t:selectManyCheckbox
>
> id=*"articlesChecked"*
>
> value="#{mbArticles.articlesChecked}"
>
> layout=*"spread"*
>
> onclick=*"checkState(this,false,'articlesList')"*>
>
>
>
>
>
> Then a bit further down we have this in a dataList
>
>
>
>
>
> <h:outputLabel for=*"articleCheckbox"*>
>
> <t:checkbox index="#{count}" for=*":articlesForm:articlesChecked"*
> id=*"articleCheckbox"*/>
>
>
>
> So the checkboxes generated are like
>
>
>
> <input type="checkbox" name="articlesChecked" id="articlesChecked" />
>
>
>
> I know the HTML spec pretty well and for this case only the "name"
> attribute really needs to be repeated, the id can be unique and should be,
> it's actually invalid to have duplicate ids in the DOM (then again so is an
> id starting with the "_" character. I'll never understand that decision).
>
>
>
> I extended the HtmlCheckboxRenderer and basically changed it such that it
> will output the name attribute as the clientId of the UISelectMany component
> and the ID as the clientId of the HtmlCheckBox component. I override
> encodeEnd and kept it identical except I have my own renderSingleCheckBox
> method, which is also identical except it calls my version of
> renderCheckBox, which is nearly identical except for this part:
>
>
>
>
>
> *if* (renderId) {
>
> *if* (StringUtils.*isNotEmpty*(checkboxClientId)) {
>
> writer.writeAttribute(HTML.*ID_ATTR*, checkboxClientId, *
> null*);
>
> }
>
> }
>
>
>
> checkboxClientId is an extra parameter passed in.
>
>
>
> So far this solution seems to work. The ids are correctly generated and the
> functionality hasn't broken (meaning I can select a few checkboxes and
> they're picked up on the other side).
>
>
>
> So my questions here are:
>
>
>
> Is there any possible side affect that I haven't though about? I probably
> haven't tested every possible scenario of use here.
>
>
>
> Has this been addressed already in a later version of tomahawk? I'm using
> 1.1.6 here. If not then it should be updated in a future release of
> Tomahawk.
>
>
>
Hi
Yes, see https://issues.apache.org/jira/browse/TOMAHAWK-1188 for details. I
hope this helps.
regards
Leonardo Uribe
> Matt
>
>
>
>
>