2014-05-05 4 views
0

Mon objectif est d'appeler une méthode en Java en utilisant JSNI et de faire cet appel à partir d'un code javascript handwirtten, c'est-à-dire: j'aurai une fonction à l'intérieur du $(document).ready qui appellera une méthode en Java. Mon problème est que je ne sais pas quel script sera chargé en premier: le script GWT ou mon script javascript manuscrit, Et à cause de cela, je me demande s'il y a une solution à intégrer $(document).ready à charger après GWT a été chargé car si le GWT est chargé en premier, les méthodes JSNI ne sont pas encore connues par la fenêtre de l'objet javascrpit et une erreur est levée.

+1

Qu'avez-vous essayé? Il semble que ce serait une expérience assez facile à mener. –

+0

L'expérimentation/test est important, d'autant plus que votre onModuleLoad devrait s'éteindre après que tous les autres scripts aient été chargés et que l'événement ready ait déjà été déclenché. Il ne devrait pas être nécessaire d'attendre plus longtemps, assurez-vous d'avoir un problème avant de le réparer. –

Répondre

0

Il existe un moyen simple de vous assurer que votre script est exécuté après tout le reste: Mettez-le dans un élément <script> que vous ajoutez comme la dernière chose dans votre élément <body>:

<html><head>...</head> 
<body>... 

    <script>/* your code here */</script> 
</body> 

Le navigateur doit donner des garanties sur l'ordre dans lequel les éléments script sont exécutés: Ils sont exécutés dans l'ordre dans lequel ils apparaissent dans le DOM (ceci est également vrai pour les scripts distants, dans ce cas, le navigateur peut télécharger le code en arrière-plan mais il ne touchera pas l'élément <script> suivant avant que le téléchargement ne soit terminé). Notez que vous n'avez pas besoin d'utiliser $(document).ready() si vous utilisez cette astuce: Puisque votre élément script est le dernier du DOM, par définition, le DOM doit être "prêt" au moment où il est traité.

1

Un bon moyen est de charger vos fichiers personnalisés JavaScript après avoir exporté tous les JSNI requis.

Essayez une

Une fois que toutes les méthodes JSNI sont exportés alors vous pouvez ajouter votre JavaScript personnalisé dans la page à l'aide ci-dessous JSNI.

public static native void loadCustomJS() /*-{ 

    var js = $doc.createElement("script"); 
    js.type = "text/javascript"; 
    js.src = jsFilePath; 

    $doc.body.appendChild(js); 
}-*/; 

Créer une fonction JavaScript dans votre code HTML/JSP et l'appeler de la classe du point d'entrée une fois que toutes les années sont exportés de JSNI.

HTML/JSP

... 
<script type="text/javascript"> 
    function loadCustomJS(){ 
     // load your custom JavaScript here 
    } 
</script> 
... 

Point d'entrée Classe:

public static native void loadCustomJS() 
/*-{ 
     $wnd.loadCustomJS(); 
}-*/; 
1

Si vous souhaitez utiliser une solution pure GWT, vous pouvez profiter de GWT´s ScriptInjector:

ScriptInjector.fromUrl("http://example.com/foo.js").setCallback(
    new Callback() { 
     public void onFailure(Exception reason) { 
      Window.alert("Script load failed."); 
     } 
     public void onSuccess(Void result) { 
      Window.alert("Script load success."); 
     } 
    }).inject(); 

Alors , à l'intérieur de la méthode onModuleLoad() de votre gwt, vous pouvez placer cet extrait. De cette façon, vous n'avez pas besoin d'écrire une seule ligne supplémentaire de JS.

Questions connexes