2012-11-24 7 views
5

Bir form gönderdikten sonra seçili bileşen kimliğine odaklanmaya ve odaklanmaya çalışıyorum (ajax çağrısı). Ajax çağrısından sonra proses onclick fonksiyonu <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> 

Bu çözüm

çalışıyor, ancak sorun <f:ajax> onclick SONRA denir ki, bu nedenle form komponent seçiminden sonra oluşturulur ve odak temizlenir.

Biçim oluşturulduktan sonra işlevimi nasıl çağırabilirim?

güncelleme: (Ben mesela denedim)

  • =>onclick öznitelik
  • sonraki olarak onevent="myFunc()" => aynı davranış f:ajax eklemek ferahlatıcı sayfa
  • yol açar onevent="myFunc();"f:ajax eklemek onevent ile f:ajax numaralı telefondan. => Hala aynı

Update2 (nasıl olması gerektiği işleri):

  • Gönder düğmesine
  • formu gerekli
  • uygun alan olarak temizlenir
  • odaklanmıştır denilen ajax olan (bağlıydı bazı kullanıcı tarafından seçilen faktörler)
+0

primefaces KomutDüğmesi'ı ve richfaces KomutDüğmesi'ı içinde -attribut bir "onComplete" yoktur. – stg

cevap

24

onevent işleyicisi, aslında davet edilecek üç kez oklu ve fonksiyonun kendisine değil, işlev ismine işaret etmelidir. Ajax isteğinin gönderilmesinden önce bir kez, ajax yanıtına ulaşıldıktan bir dakika sonra ve HTML DOM başarıyla güncellendiğinde bir kez gönderildi. Bunun için verilen veri argümanının status özelliğini kontrol etmelisiniz. sizin özel durumda

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; 
    } 
} 

, böylece sadece durumu success ise çek eklemeniz gerekir.

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

Ve onun adıyla işlevini başvurusu gerekir:

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

Teşekkürler. Ama garip, componentId hala aynı, her zaman aynı bileşeni seçin .. – gaffcz

+1

Bu farklı bir sorun. EL, web sunucusuyla birlikte HTML/JS ile birlikte değil, JSF ile birlikte çalışır. Oluşturulan HTML çıktısına bakın. Artık JS işlevinde '# {}' olmadığını göreceksiniz. – BalusC

+0

Aha (anlama) :-) ComponentId, fasulye içinde inicialized gibi kalır .. Bu çözümün bir çözümü var mı? Çemberde dönüyorum :( – gaffcz