Sven Linstaedt created MYFACES-3904:
---------------------------------------
Summary: 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 behaviors 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)