2012-01-25 41 views
17

Vorrei eseguire una funzione JavaScript dopo che la pagina è stata caricata. Al momento ho un comando e tutto funziona correttamente. Tuttavia sarebbe più comodo se l'utente non dovesse premere il pulsante.Come eseguire JavaScript dopo il caricamento della pagina?

Ho provato f: evento, ma non ho un listener, ho solo la funzione JavaScript. Inoltre il carico corporeo non funziona per me, poiché utilizzo solo componenti di alto livello.

<f:view xmlns="http://www.w3.org/1999/xhtml" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:p="http://primefaces.org/ui" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:pm="http://primefaces.org/mobile" contentType="text/html"> 

<ui:composition template="/resources/master.xhtml"> 

    <ui:define name="content"> 


     <pm:content> 

      <h:inputHidden id="address" value="#{pathFinderBean.address}" /> 

      <div id="map" style="width: 100%; height: 285px;"></div> 

      <p:commandButton type="button" value="Route" onclick="PathFinder.findAndGo()"/> 

      <div id="route"></div> 

     </pm:content> 
    </ui:define> 

</ui:composition> 

La funzione PathFinder.findAndGo JavaScript è definita nel mio master.xhtml

+0

sarebbe piuttosto vuole fare sul pronto invece di onload ? –

+0

Se lo script è nella testa e il pulsante è nella pagina, lo script verrà sempre caricato prima che l'elemento venga visualizzato. Tuttavia, se lo script richiede determinati elementi nella pagina e l'utente può fare clic sul pulsante prima che vengano caricati, è possibile che conisder si disabiliti il ​​pulsante (o si compia qualche altra azione) finché non sono disponibili. – RobG

+0

usa remoteCommand con autorun true. – meyquel

risposta

23

utilizzare jQuery come segue:

<script> 
    jQuery(document).ready(function() { 
     PathFinder.findAndGo(); 
    }); 
</script> 

Aggiornamento:

deve essere entro <ui:define name="content">.

+0

Cosa c'è di sbagliato in questo? Perché downvote? –

+2

jQuery per il solo scopo di gestire l'evento 'onload' non è una buona idea. – bennedich

+2

È buono in questo caso poiché utilizza PrimeFaces che necessita e carica jQuery stesso. –

4
window.onload = function() { 
    // code to execute here 
} 
+0

non funziona per me. L'ho inserito nei tag script e l'ho posizionato in posti diversi nel lato ma non è successo nulla. – steffan

3

Per primefaces sono riuscito utilizzare correttamente il seguente:

  1. ho caricato nel <head> file JS che contiene le funzioni di cui avevo bisogno onLoad utilizzando:

    < h:outputScript library="javascript" name="nameOfMyFile.js" target="head"> 
    
  2. Ho usato quanto segue per eseguire le funzioni JS di cui avevo bisogno da "nameOfMyFile.js":

    < h:body onload="nameOfMyFunction()" > 
    
  3. prega di notare che il mio file js conteneva anche il seguente comando in basso:

    $(document).ready(nameOfMyFunction()); 
    

Il punto 3'rd è per l'esecuzione della funzione onReady. Questo è stato un esperimento per vedere se posso aggiungere HTML agli eventi di pianificazione ... mentre le stringhe passate vengono analizzate e i tag html sono sfuggiti. Devo ancora capire perché ho bisogno sia di onReady e di onLoad .... ma al momento è l'unico modo in cui ha funzionato per me. Aggiornerò se trovo qualcosa di nuovo. Ha avuto successo.

6

Ci sono 2 modi che lavorano per me, quando voglio eseguire una funzione JS dopo caricamento della pagina in primefaces:

  • o utilizzare jQuery (come è già utilizzato da primefaces), la soluzione migliore è quella di nidificarepronto per due volte, in modo che il mio codice JS viene eseguito dopo tutto il codice primefaces:
    • jQuery(document).ready(function() { jQuery(document).ready(function() { // twice in document.ready to execute after Primefaces callbacks PathFinder.findAndGo(); }); });
  • o utilizzare p: remoteCommand con autorun, e il luogo onComplete JS richiamata su di esso
    • è presentata questa forma modo da AJAX al server, ma nessun ascoltatore eseguito sul lato server, una richiamata JS viene eseguito dopo
    • <p:remoteCommand oncomplete=" PathFinder.findAndGo(); " autoRun="true"/>
+2

Esiste anche un'opzione per istruire Primefaces ad eseguire JS dal codice Java nel controller, ma non sono sicuro che ciò avvenga dopo il caricamento della pagina. Ho usato questa opzione una volta in azione AJAX, quando non ho potuto istruire Primefaces per aggiornare il titolo della pagina dopo AJAX: 'org.primefaces.context.RequestContext.getCurrentInstance(). Execute (" document.title = '"+ StringEscapeUtils.escapeEcmaScript (pageTitle) + "'"); ' – OndrejM

0

Includere (in fondo alla pagina) jQuery libreria all'interno del <ui:define name="content"> e quindi utilizzare $(document).ready come al solito:

<ui:define name="content"> 
 
... 
 
<!-- jQuery --> 
 
<h:outputScript name="vendor/jquery/jquery.min.js"/> 
 
<script> 
 
    $(document).ready(function(){ 
 
     alert(1); 
 
    }); 
 
</script> 
 
</ui:define>

Problemi correlati