Eine Javascript-Funktion aufrufen von Wicket
Möchte ich weitergeben der Ausgabe eines Blocks von javascript-code in html der entsprechenden wicket-Komponente. Ich habe versucht, AbstractDefaultAjaxBehaviour und es scheint nicht zu funktionieren.
Hier ist, was ich arbeite mit:
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);
Ich auch so probiert:
add(new AjaxEventBehavior("onload") {
@Override
protected void onEvent(AjaxRequestTarget target) {
channelScript.setEscapeModelStrings(false);
target.add(new Label(channelScript));
}
}
Bitte was mache ich falsch? Dank
UPDATE
Ich vorbeikommen Reihe von Variablen, von wicket zu JS so dass jeder javascript-Ausgabe mit wicket-Komponente. Ich habe gerade festgestellt, dass ich haben, um nicht mit dem dom-bereit-Zustand zu Beginn der Interaktion. So, dass ist in Ordnung. Aber dann bin ich immer noch verwirrt und ratlos darüber, wie der wicket-Komponente ändern Ihren Status zu erhalten, aktualisiert, Antwort von javascript. Gibt es eine wicket-Komponente, löst sich asynchron?
InformationsquelleAutor drecute | 2012-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht mit einem Label als Skript-container. Wicket hat einige richtige Wege, das zu tun.
Der folgende code würde auf option (vorausgesetzt, Sie sind auf wicket 1.5)
Wenn Sie möchten, führen Sie ein Skript aus, nachdem Sie die Website vollständig geladen wurde, können Sie diese verwenden:
In wicket 1.4 funktioniert das anders. Verwenden Sie HeaderContributors es.
Kannst du nicht definieren, das JS im Kopf und nennen es an der Stelle, wo Sie möchten, dass der code?
Wie mache ich das? Nachdem der javascript-Code zum ausführen auf zu laden ist kein problem. Nachdem eine Komponente asynchron auf laden und abrufen Wert von javascript ist, was ich habe Probleme mit. Ich denke, das ist, was AjaxEventBehavior gemeint ist. Aber es ist nicht für mich arbeiten.
vielleicht kann dies dir helfen: http://stackoverflow.com/questions/7993626/wicket-1-5-javascript-file-in-body-tag
InformationsquelleAutor Till
Du machst es falsch, weil Sie eine
wicket:id
auf Ihre<script>
Teil, so Wicket wird, ersetzen Sie es mit IhremLabel
's content (javascript-Funktion). Ihre javascript-Funktion ist nicht verfügbar, weil es nie an den client gesendet. Den "guten" Weg das zu tun, was Sie wollen, ist zu entfernen Sie diewicket:id
aus dem Skript-tag und in Ihrem Verhalten verwenden Sie die spezielle Methodetarget.appendJavascript("initChannel();");
(oderprependJavascript
) anstatt zu spielen mit Flucht auf eineLabel
.Bitte beachten Sie, dass Ihre erste Methode kann nie funktionieren, wenn Sie nie "Feuer" das ajax-Verhalten, der zweite sollte funktionieren, wenn der navigator beendet das laden der DOM und trigger das "onload" - Ereignis auf Ihrer Seite (aber ich bin nicht sicher, ob das Verhalten korrekt gebunden, nie ausprobiert...)
Ein weiterer Hinweis ist, dass die Javascript-Sie schrieb, Sie schadet der globalen Namensraum des Fensters, wenn Sie erwägen, diese in einem realen Projekt, bitte Lesen Sie die Dokumentation bezüglich der Namensräume in javascript.
target.appendJavascript("initChannel()")
? Auch, wie kann ich Feuer das ajax-Verhalten? Wie funktioniert AjaxRequestTarget suchen Sie die js-Funktion? Sorry, ich bin ein bisschen unter einer illusion durch Stunden versuchen zu verstehen, was Los ist.Zu verstehen, wie Dinge funktionieren sollte schlage ich vor, Sie setzen eine
AjaxLink
in Ihre Seite ein und in deronClick
- Methode fügen Sie den JavaScript-Aufruf, die Sie testen möchten.OK. Das scheint zu funktionieren. Was ist wenn ich Sie nicht brauche onClick-Ereignis. In der Tat, ich brauche nicht ein Ereignis. Ich will nur die js angehängt, um das html-markup. Können Sie mir sagen, warum sowas nicht funktioniert:
AbstractDefaultAjaxBehaviour behave = new AbstractDefaultAjaxBehaviour() { protected void respond(AjaxRequestTarget target) { target.appendJavascript("alert('hey');")}}; add(behave);
ich denke, da ist es nicht angebracht zu jedem beliebigen html-markup?Im Grunde müssen Sie etwas auslösen, das Verhalten, das Sie angeschlossen an die Komponente. Wenn Sie nur wollen, starten Sie den javascript-Code auf die Seite laden, die Sie gar nicht brauchen, befestigen, das Verhalten und Sie können einfach tun es mit plain javascript anfügen (ein dom-ready-Funktion).
Für eine Seite laden, könnte einfach mit einem Verschluss-Funktion - was auch geklappt hat, wenn ich es versuchte. Wie ich bereits in einem meiner Kommentare, muss ich den JS code im body-Bereich der html - innerhalb von html-tags. Ich muss die JS-Variablen werden verfügbar genau an dem Ort, wo die wicket-Komponente Hinzugefügt wurde.
InformationsquelleAutor Cedric Gatay
Habe ich gearbeitet, auf einer Wicket-6-Erweiterung namens wicket-js was können Sie tun dies auf eine sehr bequeme und saubere Art und Weise.
Code für Ihren Anwendungsfall könnte wie folgt Aussehen
übersetzt in das, was @Till hat schon als native Wicket Lösung.
Wenn Sie möchten, dass die
alert
dort könnten Sie tun, dieseInformationsquelleAutor thrau