<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>MyFaces Weblog &#187; myfaces</title>
	<atom:link href="http://sidslog.wordpress.com/tag/myfaces/feed/" rel="self" type="application/rss+xml" />
	<link>http://sidslog.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 17 Feb 2009 23:52:02 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='sidslog.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/5d50aba598cdccda48488f30ffde5200?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>MyFaces Weblog &#187; myfaces</title>
		<link>http://sidslog.wordpress.com</link>
	</image>
			<item>
		<title>Отслеживаем нажатие ENTER внутри формы</title>
		<link>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/</link>
		<comments>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/#comments</comments>
		<pubDate>Sun, 25 May 2008 12:21:48 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[enter]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[myfaces]]></category>
		<category><![CDATA[onkeypress]]></category>
		<category><![CDATA[renderer]]></category>
		<category><![CDATA[tomahawk]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=13</guid>
		<description><![CDATA[На форме jsf-страницы может быть расположено несколько UICommand компонент. Необходима возможность указать, какая компонента должна срабатывать при нажатии ENTER в одном из полей ввода.
Для этого будем обрабатывать onkeypressed  внутри формы. То, какая компонента будет срабатывать и в каком контейнере, будем указывать  с помощью классов &#171;control&#187; и &#171;container&#187;.
Также разработаем jsf-компоненту, которая будет показывать, внутри [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&blog=3036223&post=13&subd=sidslog&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="font-size:10pt;">На форме jsf-страницы может быть расположено несколько UICommand компонент. Необходима возможность указать, какая компонента должна срабатывать при нажатии ENTER в одном из полей ввода.</p>
<p style="font-size:10pt;">Для этого будем обрабатывать onkeypressed  внутри формы. То, какая компонента будет срабатывать и в каком контейнере, будем указывать  с помощью классов &laquo;control&raquo; и &laquo;container&raquo;.</p>
<p style="font-size:10pt;">Также разработаем jsf-компоненту, которая будет показывать, внутри какого контейнера должен вызываться данный UICommand при нажатии ENTER в поле ввода.</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;h:form id=&raquo;default&raquo;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:panelGrid id=&raquo;cont&raquo; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:inputText value=&raquo;#{testInfo.name}&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandButton type=&raquo;button&raquo; action=&raquo;#{testInfo.act1}&raquo; value=&raquo;button&raquo; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandLink action=&raquo;#{testInfo.act2}&raquo; value=&raquo;link&raquo; &gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsfaces:test forId=&raquo;cont&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:commandLink&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:panelGrid&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:panelGrid id=&raquo;cont2&#8243;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:inputText value=&raquo;#{testInfo.name}&raquo;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandButton  action=&raquo;#{testInfo.act1}&raquo; value=&raquo;button&raquo;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsfaces:test forId=&raquo;cont2&#8243; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:commandButton&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;t:commandLink action=&raquo;#{testInfo.act2}&raquo; value=&raquo;link&raquo; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/t:panelGrid&gt;<br />
&lt;/h:form&gt;
</p>
<p style="font-size:10pt;">Внутри сont все нажатия ENTER должны обрабатыватся с помощью CommandLink, внутри cont2 &#8211; CommandButton.</p>
<p style="font-size:10pt;">Код JS для обработки нажатия ENTER:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
var onloadFunctions = new Array() ;<br />
<br />
var FindHandler = new Object() ;<br />
<br />
FindHandler.testClass = function(className) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var classN = new RegExp(&laquo;(^|\\s)&raquo; + className + &laquo;(\\s|$)&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return classN.test(className) ;<br />
}<br />
<br />
FindHandler.getParentByClass = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (tag.parentNode) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tag.className &amp;&amp; this.testClass(tag.className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tag ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag = tag.parentNode ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return null ;<br />
}<br />
<br />
FindHandler.getElementsByClassName = function(className, tag) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var returnElements = new Array() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tag.childNodes[i].className &amp;&amp; this.testClass(tag.childNodes[i].className)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnElements.push(tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; tag.childNodes.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var ret = this.getElementsByClassName(className, tag.childNodes[i]) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ret) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (var j = 0 ; j  0 ? returnElements : null ;<br />
}<br />
<br />
var KeyCode = new Object() ;<br />
KeyCode.VK_ENTER = 13 ;<br />
<br />
var f1 =  function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;var form = document.forms[0] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (form) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;form.onkeypress = function(e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (window.event)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = window.event.keyCode;     //IE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = e.which;     //firefox<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key == KeyCode.VK_ENTER) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (window.event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target = window.event.srcElement ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target = e.target ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var parent = FindHandler.getParentByClass(&laquo;container&raquo;, target) ;<br />
//                alert(parent) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var controls = FindHandler.getElementsByClassName(&laquo;control&raquo;, parent) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (controls &amp;&amp; controls[0]) {<br />
//                        alert(controls[0].tagName) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (controls[0].tagName == &laquo;INPUT&raquo; || controls[0].tagName == &laquo;BUTTON&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls[0].click() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controls[0].onclick() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
onloadFunctions.push(f1) ;<br />
<br />
window.onload = function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0 ; i &lt; onloadFunctions.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onloadFunctions[i]() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p style="font-size:10pt;">Классы компоненты:</p>
<p style="font-size:10pt;">UITest.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class UITest extends UIComponentBase implements NamingContainer {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void restoreState(FacesContext facesContext, Object object) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (object instanceof Object[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[] state = (Object[]) object ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.restoreState(facesContext, state[0]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forId = (String) state[1] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.restoreState(facesContext, object);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public Object saveState(FacesContext facesContext) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[] state = new Object[2] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state[0] = super.saveState(facesContext) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state[1] = forId ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return state ;    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String COMPONENT_TYPE = &laquo;ru.js.faces.component.test.Test&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String COMPONENT_FAMILY = &laquo;ru.js.faces.component.test.Test&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static final String RENDERER_TYPE = &laquo;ru.js.faces.component.test.TestRenderer&raquo; ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public UITest() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setRendererType(RENDERER_TYPE) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getFamily() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return COMPONENT_FAMILY ;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String forId ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getForId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setForId(String forId) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.forId = forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p style="font-size:10pt;">TestTag.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class TestTag extends UIComponentTag {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getComponentType() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return UITest.COMPONENT_TYPE;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getRendererType() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return UITest.RENDERER_TYPE;  //To change body of implemented methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String forId;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getForId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void setForId(String forId) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.forId = forId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected void setProperties(UIComponent uiComponent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setProperties(uiComponent);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (null != getForId()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((UITest)uiComponent).setForId(getForId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}
</p>
<p style="font-size:10pt;">TestRenderer.java:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
public class TestRenderer extends Renderer {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.encodeBegin(facesContext, uiComponent);    //To change body of overridden methods use File | Settings | File Templates.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UITest testComponent = (UITest) uiComponent ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseWriter writer = facesContext.getResponseWriter();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.startElement(&laquo;script&raquo;, testComponent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writeAttribute(&laquo;type&raquo;, &laquo;text/javascript&raquo;, null);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String containerId = ((UITest)uiComponent).getForId() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIComponent parent = uiComponent.getParent() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String controlId = parent.getId() ;<br />
<br />
//JavaScript в данном  случае добавляет к фунциям, которые выполнятся при загрузке еще одну. В ней элементам контейнера и контрола будут присваиваться соответствующие классы<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writeText(&laquo;var &laquo;+ controlId +&raquo;UseOnEnter = function () {  var container = document.getElementById(document.forms[0].id + &#8216;:&#8217; + &#8216;&raquo;+ containerId + &laquo;&#8216;) ;\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;var control = document.getElementById(document.forms[0].id + &#8216;:&#8217; + &#8216;&raquo; + controlId + &laquo;&#8216;); \n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;container.className = container.className + &#8216; container&#8217; ;\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;control.className = control.className + &#8216; control&#8217;; }\n&raquo; +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&raquo;onloadFunctions.push(&laquo;+ controlId +&raquo;UseOnEnter)&raquo;, null) ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.endElement(&laquo;script&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}
</p>
<p style="font-size:10pt;">Описание компоненты и рендерера в faces-config.xml:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;component&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-type&gt;ru.js.faces.component.test.Test&lt;/component-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-class&gt;ru.js.faces.component.test.UITest&lt;/component-class&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property-name&gt;value&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property-class&gt;java.lang.String&lt;/property-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
<br />
&lt;/component&gt;<br />
<br />
&lt;render-kit&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;component-family&gt;ru.js.faces.component.test.Test&lt;/component-family&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer-type&gt;ru.js.faces.component.test.TestRenderer&lt;/renderer-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;renderer-class&gt;ru.js.faces.component.test.TestRenderer&lt;/renderer-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/renderer&gt;<br />
&lt;/render-kit&gt;
</p>
<p style="font-size:10pt;">Описание тега в components.tld:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;tag&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;test&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;tag-class&gt;ru.js.faces.component.test.TestTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;forId&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;type&gt;java.lang.String&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;true&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;id&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;type&gt;java.lang.String&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;false&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/attribute&gt;<br />
&lt;/tag&gt;
</p>
<p style="font-size:10pt;">Подключение components.tld в web.xml:</p>
<p style="font-size:10pt;margin-left:25px;background-color:#EEEEEE;padding-left:10px;">
&lt;jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;http://jsfaces&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/WEB-INF/components.tld&lt;/taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;<br />
&lt;/jsp-config&gt;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&blog=3036223&post=13&subd=sidslog&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/25/keypress-in-form/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
		<item>
		<title>Myfaces Tomahawk и Javascript изменение надписи при наведении фокуса</title>
		<link>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/</link>
		<comments>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/#comments</comments>
		<pubDate>Fri, 23 May 2008 12:09:48 +0000</pubDate>
		<dc:creator>sidslog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[myfaces]]></category>
		<category><![CDATA[tomahawk]]></category>

		<guid isPermaLink="false">http://sidslog.wordpress.com/?p=11</guid>
		<description><![CDATA[На странице расположена таблица с некоторыми данными. Над ней фильтр с полем ввода и кнопкой найти. Изначально в поле ввода значение &#171;Поиск&#8230;&#187;, при наведении фокуса значение пропадает. На то, какое поле ввода будет обрабатываться, будет указывать с помощью класса.
Код jsf:

&#60;h:inputText value=&#187;#{searchInfo.searchName}&#187; styleClass=&#187;search-value-container&#187; /&#62;

&#60;h:commandLink value=&#187; #{resources['command.FIND']} &#187; action=&#187;#{searchInfo.find}&#187; /&#62;

Класс search-value-container указывает на то, что наведение и [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&blog=3036223&post=11&subd=sidslog&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="font-size:10pt;">На странице расположена таблица с некоторыми данными. Над ней фильтр с полем ввода и кнопкой найти. Изначально в поле ввода значение &laquo;Поиск&#8230;&raquo;, при наведении фокуса значение пропадает. На то, какое поле ввода будет обрабатываться, будет указывать с помощью класса.</p>
<p style="font-size:10pt;">Код jsf:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
&lt;h:inputText value=&raquo;#{searchInfo.searchName}&raquo; styleClass=&raquo;search-value-container&raquo; /&gt;<br />
<br />
&lt;h:commandLink value=&raquo; #{resources['command.FIND']} &raquo; action=&raquo;#{searchInfo.find}&raquo; /&gt;
</p>
<p>Класс search-value-container указывает на то, что наведение и уход фокуса будут обрабатываться у inputText.</p>
<p style="font-size:10pt;">В бине :</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
public String getSearchName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (getName() == null || getName().equals(&laquo;&raquo;)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Util.getResource(Messages.SEARCH_CODE) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getName();<br />
}<br />
<br />
public void setSearchName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (name == null || name.equals(Util.getResource(Messages.SEARCH_CODE)) || name.equals(&laquo;&raquo;)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setName(null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setName(name.trim()) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
public String getName() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return name;<br />
}<br />
<br />
public void setName(String name) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.name = name;<br />
}
</p>
<p style="font-size:10pt;">
Код JS для обработки фокуса:</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
var el = new Array() ;<br />
var searchValue = &laquo;&raquo; ;<br />
<br />
function getElementsByClassName(className, tag, elm){<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var testClass = new RegExp(&laquo;(^|\\s)&raquo; + className + &laquo;(\\s|$)&raquo;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var tag = tag || &laquo;*&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;   var elm = elm || document ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var elements = (tag == &laquo;*&raquo; &amp;&amp; elm.all) ? elm.all : elm.getElementsByTagName(tag) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var returnElements = [] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var current ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var length = elements.length ;<br />
 &nbsp;&nbsp;&nbsp;&nbsp;   for ( var i = 0; i &lt; length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        current = elements[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        if (testClass.test(current.className)) {<br />
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;           returnElements.push(current) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    return returnElements ;<br />
}<br />
<br />
function focusSearch() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;    if (this.value == searchValue) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        this.value = &laquo;&raquo; ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
}<br />
<br />
function blurSearch() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;    if (this.value == &laquo;&raquo;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        this.value = searchValue ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
}<br />
<br />
function load() {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;    var allElements = getElementsByClassName(&#8217;search-value-container&#8217;, null, null) ;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;    for (var i = 0; i &lt; allElements.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        el[i] = allElements[i] ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        if (el[i]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            el[i].onfocus = focusSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;            el[i].onblur = blurSearch ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        }<br />
&nbsp;&nbsp;&nbsp;&nbsp;    }<br />
<br />
}<br />
<br />
window.onload = load ;
</p>
<p style="font-size:10pt;">
Для того, чтобы указать, какое значение должно быть в поле ввода, необходимо перед inputText&#8217;ом поместить
</p>
<p style="font-size:10pt;background-color:#EEEEEE;margin-left:25px;">
        &lt;t:jsValueSet name=&raquo;searchValue&raquo; value=&raquo;#{resources['message.SEARCH_CODE']}&raquo; /&gt;</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/sidslog.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/sidslog.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sidslog.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sidslog.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sidslog.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sidslog.wordpress.com&blog=3036223&post=11&subd=sidslog&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sidslog.wordpress.com/2008/05/23/myfaces-focus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f9a7ed301c1e0612c8e5751c7f24417e?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sidslog</media:title>
		</media:content>
	</item>
	</channel>
</rss>