Details
Description
When myfaces handles an ajax request, the script tags of the rendered xhtml fragments are executed from last to first which is the opposite of what would happen during a regular page load. I encountered this problem because one of my components references another component in it's constructor and the referenced component didn't exist yet during an ajax call because of reverse execution. I found the problem code:
.sort((node1, node2) => node1.compareDocumentPosition(node2) - 3) // preceding 2, following == 4)
The compareDocumentPosition method compares the node2 position relative to node1's position. If node2 is preceding node1 then the sort return value should be 1 but in this case it will be -1 as 2 (return of compareDocumentPosition) minus 3 is -1. The correct code should be:
.sort((node1, node2) => node2.compareDocumentPosition(node1) - 3) // preceding 2, following == 4)
Here is a jsfiddle - JSFiddle - Code Playground