[
https://issues.apache.org/jira/browse/MYFACES-3904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14042859#comment-14042859
]
Leonardo Uribe commented on MYFACES-3904:
-----------------------------------------
I have checked the problem and it is valid. I can remember long time ago, we
decided to use document.getElementById(...) to be sure to get the right id,
because early versions of the reference implementation, in that case Mojarra do
that. But I did a quick check and it seems now they are using "this", so the
code should be simplified to this:
{code}
<input id="form:shipmentDateCriteriaOption:0" type="radio"
name="form:shipmentDateCriteriaOption" value="NEXT_WEEK"
onchange="jsf.util.chain(this, event,'$(this).val(\'\')',
'jsf.ajax.request(this,event,{\'javax.faces.behavior.event\':\'valueChange\'})');">
{code}
Unfortunately, the solution is not so simple, because we have cases where we
want to set sourceId parameter.
The solution involves make some changes over the renderer utilities, to pass
sourceId as null value too, so the client behavior ajax implementation can have
the chance to set it as this too.
> jsf.util.Chain() is rendered with wrong event source
> ----------------------------------------------------
>
> Key: MYFACES-3904
> URL: https://issues.apache.org/jira/browse/MYFACES-3904
> Project: MyFaces Core
> Issue Type: Bug
> Affects Versions: 2.2.0
> Reporter: Sven Linstaedt
>
> When applying multiple behaviors to an component, they are rendered to be
> executed in chain by using jsf.util.chain(). So far so good.
> When applying a behavior to a component, that renders multiple html input
> elements like h:selectManyCheckbox or h:selectOneRadio, the javascript is
> generated for every html elements, from which everyone gets it's own id
> rendered by appending a ongoing number to the clientId of the component. In
> the myfaces renderer code these Ids are called itemId.
> The problem is, when you apply multiple behaviors to components, which render
> multiple html input elements: in this case all behaviors are wrapped in a
> chained call, which unfortunately receives not the itemId of the currently
> rendered html element as the source parameter, but the clientId of the
> component. According to the spec, the source parameter should contain "the
> DOM element that triggered this Ajax request, or an id string of the element
> to use as the triggering element."
> Because the event handler is bound to the html input element and not to it's
> parent html "wrapping" element used for layouting, the wrong event source is
> rendered in my option, which leads to the following side effect: Behavior
> scripts, that reference the current event producing html element via "this"
> will receive a different calling context ("this), if chain together with
> multiple behaviors than, if they would as single behavior, leading to all
> behavior scripts referencing "this" to run in the wrong context and often
> doing nothing meaningful at all.
> E.g.: chained invocation of
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio"
> name="form:shipmentDateCriteriaOption" value="NEXT_WEEK"
> onchange="$(this).val('')">
> {code}
> and
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio"
> name="form:shipmentDateCriteriaOption" value="NEXT_WEEK"
> onchange="jsf.ajax.request('form:shipmentDateCriteriaOption',event,{'javax.faces.behavior.event':'valueChange'})">
> {code}
> is rendered as:
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio"
> name="form:shipmentDateCriteriaOption" value="NEXT_WEEK"
> onchange="jsf.util.chain(document.getElementById('form:shipmentDateCriteriaOption'),
> event,'$(this).val(\'\')',
> 'jsf.ajax.request(\'form:shipmentDateCriteriaOption\',event,{\'javax.faces.behavior.event\':\'valueChange\'})');">
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)