Comment puis-je connaître l'id d'un composant JSF donc je peux l'utiliser en Javascript
Problème: Parfois, vous voulez accéder à un composant à partir de javascript avec
getElementById
, mais id sont générés dynamiquement dans JSF, de sorte que vous
besoin d'une méthode pour obtenir de l'un des objets de l'id. Je réponds ci-dessous sur comment vous pouvez le faire.
Question D'Origine:
Je veux utiliser un code comme ci-dessous. Comment puis-je référence de la inputText JSF dans mon Javascript?
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title>Input Name Page</title>
<script type="javascript" >
function myFunc() {
//how can I get the contents of the inputText component below
alert("Your email address is: " + document.getElementById("emailAddress").value);
}
</script>
</head>
<h:body>
<f:view>
<h:form>
Please enter your email address:<br/>
<h:inputText id="emailAddresses" value="#{emailAddresses.emailAddressesStr}"/>
<h:commandButton onclick="myFunc()" action="results" value="Next"/>
</h:form>
</f:view>
</h:body>
</html>
Mise à jour: ce post Identificateurs de Client dans JSF2.0 décrit à l'aide d'une technique telle que:
<script type="javascript" >
function myFunc() {
alert("Your email address is: " + document.getElementById("#{myInptTxtId.clientId}").value);
}
</script>
<h:inputText id="myInptTxtId" value="backingBean.emailAddress"/>
<h:commandButton onclick="myFunc()" action="results" value="Next"/>
Ce qui suggère que l'attribut id
sur le inputText
composant
crée un objet qui peut être consulté avec EL à l'aide de #{myInptTxtId}
,
dans l'exemple ci-dessus. L'article poursuit en affirmant que les JSF 2.0 ajoute
le zéro argument getClientId()
méthode à la UIComponent
classe.
Permettant ainsi à la #{myInptTxtId.clientId}
construire suggéré
ci-dessus pour obtenir le réel généré id du composant.
Bien que dans mes tests, cela ne fonctionne pas. D'autres personnes peuvent confirmer ou de nier.
Les réponses suggérées ci-dessous souffrent d'inconvénient que ci-dessus
la technique ne fonctionne pas. Donc, il serait bon de savoir si la technique ci-dessus
en fait, il fonctionne.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'utiliser exactement le code JSF a attribué dans le code HTML généré en sortie. Cliquez avec le bouton droit de la page dans votre navigateur et choisissez l'Affichage de la Source. C'est exactement le code HTML JS qui voit (vous savez, le JS s'exécute dans le navigateur web et intercepte sur DOM HTML arbre).
Donné un
Ça va ressembler à quelque chose comme ceci:
Où
j_id0
est l'IDENTIFIANT généré de l'HTML généré<form>
élément.Vous préférez donner à tous les JSF
NamingContainer
composants fixeid
de sorte que JSF ne pas générer automatiquement entre eux. Le<h:form>
est l'un d'entre eux.De cette façon, le formulaire ne sera pas obtenir un ID généré automatiquement comme
j_id0
et le champ de saisie sera fixe ID deformId:emailAddress
. Vous pouvez ensuite vous suffit de référence en tant que tel en JS.Partir de ce point, vous pouvez continuer à utiliser du code JS comme d'habitude. E. g. l'obtention de la valeur via
input.value
.Voir aussi:
Mise à jour que par votre mise à jour: vous avez mal compris l'article du blog. Le spécial
#{component}
de référence se réfère à la actuel composant où l'expression EL est évalué et cela ne fonctionne qu'à l'intérieur de tous les attributs du composant lui-même. Tout ce que vous voulez peut également être réalisé comme suit:(notez le
binding
à la vue, vous devriez absolument pas lier à un haricot)mais c'est laid. Mieux utiliser l'approche suivante dans laquelle vous passez le code HTML généré élément du DOM en JavaScript
this
référence à la fonctionavec
Si vous utilisez jQuery, vous pouvez même aller plus loin en faisant abstraction de leur utilisation d'un style de classe en tant que marqueur de l'interface
avec
Réponse: Donc, c'est la technique que je suis le plus heureux. Ne nécessite pas de faire trop beaucoup de trucs bizarres pour déterminer l'id d'un composant. Rappelez-vous le point entier de ce qui est sorte que vous pouvez savoir le
id
d'un composant à partir de n'importe où sur votre page, pas juste de la composante réelle elle-même. C'est la clé. J'appuie sur un bouton, lancer la fonction javascript, et il devrait être en mesure d'accéder à tout autre composant, et pas seulement celui qui l'a lancé.Cette solution ne nécessite pas de 'clic-droit' et voir ce que l'id est. Ce type de solution est fragile, comme l'id est généré dynamiquement, et si je change de page je vais devoir passer par ce non-sens à chaque fois.
Lier le composant à un backing bean.
De référence lié à la composante où vous le souhaitez.
Voici donc un exemple de la façon dont cela peut être fait.
Hypothèses: j'ai un *.page xhtml (peut-être *.jsp) et j'ai défini un backing bean. Je suis également en utilisant JSF 2.0.
*.page xhtml
BackBean.java
Assurez-vous de créer votre getter/setter pour cette propriété de trop.
Id est généré de façon dynamique, de sorte que vous devrait définir des noms pour tous les éléments parents pour éviter j_id123-comme id.
Notez que si vous utilisez jQuery pour sélectionner l'élément que vous devez utiliser une double barre oblique avant du côlon:
au lieu de:
En cas de Richfaces vous pouvez utiliser l'expression el sur jsf page:
pour sélectionner l'élément javascript, par exemple:
Vous pouvez afficher le code source HTML généré et voir ce que l'id, donc vous pouvez l'utiliser dans votre code JavaScript. C'est dans un formulaire, il est probablement ajoutant la forme id.
Je sais que ce n'est pas le JSF mais si vous voulez éviter l'ID de la douleur, vous pouvez définir une spéciale de classe CSS pour le sélecteur. Juste assurez-vous d'utiliser un bon nom de sorte que lorsque quelqu'un lit le nom de la classe, il est clair qu'il a été utilisé à cette fin.
Dans votre JavaScript:
Bien sûr, vous auriez encore à gérer manuellement le nom de la classe unique.
Je pense que c'est récurrent, tant que vous n'utilisez pas cette dans de composants réutilisables. Dans ce cas, vous pouvez générer les noms de classe à l'aide d'une convention.
C'est un petit exemple de programme jsf. Maintenant, je vais écrire du code javascript pour obtenir la valeur de ce qui précède jsf composant: