L'appel d'une fonction Javascript à partir de Guichet
Je veux passer la sortie d'un bloc de code javascript dans le html correspondant à son guichet composant. J'ai essayé AbstractDefaultAjaxBehaviour et il ne semble pas fonctionner.
Voici ce que je travaille avec:
HTML
//In <body>
<div wicket:id="container">
<script type="text/javascript" wicket:id="channelScript">
function initChannel() {
window.alert('got it');
}
</script>
</div>
private WebMarkupContainer container = new WebMarkupContainer("container");
private Label channelScript = new Label("channelScript", "initChannel();");
add(container);
final AbstractDefaultAjaxBehavior channel = new AbstractDefaultAjaxBehavior() {
protected void respond(final AjaxRequestTarget target) {
channelScript.setEscapeModelStrings(false);
target.add(channelScript); //initChannel is not triggerred
}
};
container.add(channel);
J'ai aussi essayé ceci:
add(new AjaxEventBehavior("onload") {
@Override
protected void onEvent(AjaxRequestTarget target) {
channelScript.setEscapeModelStrings(false);
target.add(new Label(channelScript));
}
}
Merci de ce que je fais mal? Grâce
Mise à JOUR
Je serai de passage de la série de variables de guichet de JS de telle façon que chaque javascript sortie est affichée à l'aide de guichet composant. Je viens de réaliser que je vais avoir à faire avec dom état prêt à commencer l'interaction. C'est très bien. Mais je suis encore confus et désemparés sur la façon dont le guichet composant changera d'état pour recevoir des mises à jour de la réponse à partir de javascript. Est-il un guichet composant qui se déclenche de manière asynchrone?
OriginalL'auteur drecute | 2012-02-12
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser une Étiquette, comme script contenant. Wicket a bien des manières de le faire.
Le code suivant devrait être sur option (en supposant que vous êtes sur le guichet 1.5)
Si vous voulez exécuter un script après le site a été entièrement chargée, vous pouvez utiliser ceci:
Dans wicket 1.4 cela fonctionne différemment. Vous devez utiliser HeaderContributors.
Ne peut-on pas définir le JS dans le head et de l'appeler à l'endroit où vous souhaitez que le code?
Comment dois-je faire? Ayant le code javascript à exécuter sur la charge n'est pas un problème. Ayant une composante à exécuter de manière asynchrone sur la charge et la récupération de la valeur à partir de javascript est ce que je vais avoir des problèmes avec. Je suppose que c'est ce AjaxEventBehavior est destiné. Mais il ne fonctionne pas pour moi.
peut-être cela peut vous aider: http://stackoverflow.com/questions/7993626/wicket-1-5-javascript-file-in-body-tag
OriginalL'auteur Till
Vous le faites mal, car vous avez défini un
wicket:id
sur votre<script>
partie, donc, le Guichet va le remplacer par votreLabel
'contenu (l'appel de fonction javascript). Votre fonction javascript n'est jamais disponible, car il n'est jamais envoyé au client. La "bonne" façon de faire ce que vous voulez est de supprimer lawicket:id
de votre balise de script et votre comportement d'utilisation de la méthode spécialetarget.appendJavascript("initChannel();");
(ouprependJavascript
) au lieu de jouer à l'échappement sur unLabel
.Veuillez noter que votre première méthode ne fonctionnera pas si vous n'avez jamais "feu" de l'ajax comportement, le second doit fonctionner lorsque le navigateur a la fin du chargement du DOM et de déclencher le "onload" de l'événement sur votre page (mais je suis pas sûr que le comportement est correctement relié, jamais essayé...)
Une autre remarque est que le Javascript que vous avez écrit est de polluer l'espace de noms global de la fenêtre, si vous envisager d'utiliser cela dans un vrai projet, veuillez tenir compte de la lecture de la documentation concernant les namespacing de javascript.
target.appendJavascript("initChannel()")
? Aussi, comment puis-je le feu de l'ajax comportement? Comment AjaxRequestTarget localiser la fonction js? Désolé, je suis un peu en vertu d'une illusion due à des heures à essayer de comprendre ce qui se passe.Pour comprendre comment les choses sont censées fonctionner je vous suggère de mettre un
AjaxLink
dans votre page et dans leonClick
méthode add () de l'appel JavaScript que vous souhaitez tester.OK. Qui semble fonctionner. Si je n'ai pas besoin de l'événement onClick. En fait je n'ai pas besoin d'un événement. Je veux juste le js ajouté à la balise html. Pouvez-vous me dire pourquoi quelque chose comme cela ne fonctionne pas:
AbstractDefaultAjaxBehaviour behave = new AbstractDefaultAjaxBehaviour() { protected void respond(AjaxRequestTarget target) { target.appendJavascript("alert('hey');")}}; add(behave);
je suppose parce qu'il n'est attaché à aucun balisage html?Fondamentalement, vous avez besoin de quelque chose pour déclencher le comportement que vous avez joint à la composante. Si vous ne souhaitez lancer le javascript au chargement de la page, vous n'avez même pas besoin de joindre un comportement, et vous pouvez le faire simplement en utilisant un javascript (joindre un dom prêt de la fonction).
Pour un chargement de la page, un peut simplement utiliser une fonction de clôture - qui a travaillé quand je l'ai essayé. Comme je l'ai mentionné dans un de mes commentaires, j'ai besoin du code JS dans le corps de html dans les balises html. J'ai besoin de la JS variables à être disponible à l'endroit exact où le guichet composant a été ajouté.
OriginalL'auteur Cedric Gatay
J'ai travaillé sur un Guichet 6 extension appelée wicket-js qui vous permet de le faire dans un très pratique et propre.
Code pour votre cas d'utilisation pourrait ressembler à quelque chose comme ceci
qui se traduit par ce que @Till a déjà fourni en tant que natif de Guichet solution.
Si vous voulez le
alert
de là, vous pouvez faire ceOriginalL'auteur thrau