J'écris une application GWT qui implique d'interagir avec un document externe dans une iframe. Comme une preuve de concept, j'essaie de joindre un gestionnaire de clic sur un bouton.
Les travaux suivants dans JavaScript P>
public class ElementWrapper extends Widget implements HasClickHandlers { public ElementWrapper(Element theElement) { setElement(theElement); } public HandlerRegistration addClickHandler(ClickHandler handler) { return addDomHandler(handler, ClickEvent.getType()); } }
7 Réponses :
Vous pouvez utiliser JSNI pour réutiliser votre morceau de code JavaScript. Votre code JavaScript appellerait une méthode GWT sur un objet qui le jetterait au nom du bouton de l'IFrame. P>
Quant pourquoi le code GWT ne fonctionne pas - je suppose que c'est parce qu'ils utilisent une couche sur des événements de navigateur réguliers qui ne peuvent probablement pas couvrir plus d'une image. C'est juste une hypothèse cependant. Vous pouvez classer cela comme une requête de fonctionnalité / bogue à nouveau. Équipe GWT. Si je suis correct, votre code semble très bien. P>
Cool, merci pour la réponse. Je suppose que je vais explorer le chemin JSNI, bien que je souhaite rester à l'écart de l'écriture de JavaScript sur mesure autant que possible.
Après avoir recherché cela plus loin, j'ai constaté que l'IFRAME est sans importance. Le même comportement ne fonctionne pas sur un bouton normal de la page d'hôte.
Je l'ai essentiellement corrigé en utilisant JSNI pour reproduire une partie du mécanisme de traitement des événements de GWT. Les travaux suivants: P>
public class ClickEventManager { private boolean clickHandlerRegistered = false; private ClickHandler clickHandler; private Element element; public ClickEventManager(Element element) { this.element = element; } public void invokeClickHandler() { //This shouldn't really be null but we are bypassing GWT's native event mechanism //so we can't create an event clickHandler.onClick(null); } public boolean isClickHandlerRegistered() { return clickHandlerRegistered; } HandlerRegistration registerClickHandler(ClickHandler handler) { clickHandler = handler; if (!clickHandlerRegistered) { registerClickHandlerInJS(element); clickHandlerRegistered = true; } return new HandlerRegistration() { public void removeHandler() { //For now, we don't support the removal of handlers throw new UnsupportedOperationException(); } }; } private native void registerClickHandlerInJS(Element element)/*-{ element.__clickManager = this; element.onclick = function() { var cm = this.__clickManager; cm.@com.talktactics.agent2.client.widgets.ClickEventManager::invokeClickHandler()(); } }-*/; }
Merci merci! C'était exactement ce dont j'avais besoin de le faire travailler dans IE7!
Je pense que le problème est que la méthode GWT onatach () code> n'est pas appelée lorsque vous utilisez l'emballage comme dans votre premier exemple. Vous pouvez essayer d'utiliser la méthode static
wrap code> sur le widget de boutons. Bien que l'utilisation de cette entrée
code> doit être de type
code>. Ou examiner la mise en œuvre de la méthode code> code>. Voici le code modifié lors de l'utilisation de la méthode
wrap code>:
Hilbrand a raison sur le problème que la méthode GWT J'ai implémenté votre solution d'origine, ajoutant la méthode suivante à et appelé Onatach () code> n'a pas été appelée.
Elementwrapper code> : p>
wrapper.onattach () code> après le
EMPELWRAPPER code> est créé. Fonctionne comme un charme! P> p>
Merci! Je savais qu'il devait y avoir une manière plus propre :)
S'il vous plaît voir ma réponse précédente. Une légère modification de votre solution d'origine le fera fonctionner. P>
Vous pouvez trouver cela utile:
IFrameElement frm = Document.get().createIFrameElement(); Document d = frm.getContentDocument(); NodeList<Element> inputs = d.getElementsByTagName("input"); InputElement target = null; for(int i = 0; i < inputs.getLength(); ++i) { Element e = inputs.getItem(0); if (e.getNodeName().equals("submit")) { target = InputElement.as(e); break; } } if (target != null) { DirectPanel p = new DirectPanel(target); p.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { // TODO Auto-generated method stub } }); }
Au lieu d'utiliser Iframes, je vous suggère de créer simplement une demande HTTP de GWT via com.google.gwt.http.client.RequestBuilder. Comme: