2012-11-24 24 views
5

Próbuję wybrać i skupić się na wybranym ID komponentu po przesłaniu formularza (wywołanie ajax).Funkcja onclick procesu po wywołaniu ajax <f:ajax>

<script> 
var myFunc = function() { 
    document.getElementById('form:#{bean.componentId}').focus(); 
    document.getElementById('form:#{bean.componentId}').select(); 
}; 

$(document).ready(function() { 
    myFunc(); 
}); 
</script> 

<h:form id="form"> 
    <h:commandButton action="#{bean.save}" onclick="return myFunc();" ...> 
    <f:ajax execute="@form" render="@form"/> 
    </h:commandButton> 
    ... 
</h:form> 

To rozwiązanie działa, ale problemem jest to, że <f:ajax> nazywa PO onclick, więc forma staje po wyborze komponentów, a ostrość jest wyczyszczone.

Jak mogę połączyć się z moją funkcją PO WYKONANIU formularza?

zmiana: (Próbowałem na przykład)

  • dodać onevent="myFunc();" do f:ajax => prowadzi do orzeźwiającym stronie
  • dodać onevent="myFunc()" do f:ajax => samo zachowanie jak onclick atrybutu
  • obok f:ajax z onevent attr. => Wciąż ten sam

Update2 (jak to powinno prace):

  • przesłać przycisk jest ajax nazywa
  • forma jest czyszczone w miarę potrzeb
  • odpowiednim polu skupia (zależała niektóre wybrane przez użytkownika czynniki)
+0

Jest "onComplete" -attribut w primefaces CommandButton aw Richfaces CommandButton. – stg

Odpowiedz

24

Obsługa onevent będzie faktycznie inv oked trzy razy i powinien wskazywać na nazwę funkcji, a nie samą funkcję. Jeden raz przed wysłaniem zapytania ajax, jeden raz po otrzymaniu odpowiedzi ajax i jeden raz, gdy HTML DOM został pomyślnie zaktualizowany. Powinieneś sprawdzić właściwość status podanego argumentu danych.

function listener(data) { 
    var status = data.status; // Can be "begin", "complete" or "success". 

    switch (status) { 
     case "begin": // Before the ajax request is sent. 
      // ... 
      break; 

     case "complete": // After the ajax response is arrived. 
      // ... 
      break; 

     case "success": // After update of HTML DOM based on ajax response.. 
      // ... 
      break; 
    } 
} 

W danym przypadku, a zatem wystarczy dodać sprawdzenie, czy stan jest success.

function myFunc(data) { 
    if (data.status == "success") { 
     var element = document.getElementById('form:#{bean.componentId}'); 
     element.focus(); 
     element.select(); 
    } 
} 

i trzeba odwoływać się do funkcji przez jego nazwę:

<f:ajax ... onevent="myFunc" /> 
+0

Dziękuję. Ale to dziwne, componentId jest wciąż taki sam, wybiera zawsze ten sam komponent. – gaffcz

+1

To inny problem. EL działa razem z JSF na serwerze WWW, a nie wraz z HTML/JS w przeglądarce internetowej. Sprawdź wygenerowany wynik HTML. Zobaczysz, że nie ma już '# {}' w funkcji JS. – BalusC

+0

Aha (nie rozumiem) :-) ComponentId pozostaje tak jak inicialized w fasoli .. Czy to proble ma jakieś rozwiązanie? Kręcę się w kółko :( – gaffcz

Powiązane problemy