2009-04-20 6 views
3

Je suis devenu fou en essayant de comprendre comment faire ce travail. Code ressemble à peu près comme:Impossible de mettre en valeur le champ de saisie dans DOM chargé avec l'appel ajax

function onDropDownChanged() { 
    $("#updatePanel").load(
    "myUrl", 
    { id: $("#myDropDown option:selected").val() }, 
    onPanelLoaded 
); 
} 
function onPanelLoaded() { 
    $("#theTextInput").focus(); 
} 
$(document).ready(function() { 
    $("#myDropDown").change(onDropDownChanged); 
} 

La première fois que le gestionnaire de changement est tiré, il fait la mise à jour ajax, et la zone de texte se concentre. Toutefois, lors des modifications suivantes, il continue à effectuer la mise à jour ajax, mais la zone de texte n'est jamais mise au point de nouveau.

J'ai trouvé que si dans onDropDownChanged, j'ai ajouté $("#updatePanel").empty() avant l'appel ajax, la zone de texte serait toujours mise au point. Le problème avec cela est la forme entière disparaît pendant une seconde, provoquant un flash laid. Étant donné que ajax est supposé rendre les choses comme ça sympas, ce n'est pas une solution de contournement que je veux utiliser.

+1

Pourriez-vous publier le bit HTML sur lequel vous agissez, ainsi que le code HTML chargé par l'appel ajax? –

Répondre

6

Il semble que cela devrait fonctionner, mais je me demande si le DOM n'est pas mis à jour au moment où le rappel est appelé. Vous pourriez vouloir voir si l'introduction d'un retard aide. Y compris le code HTML sur la page et ce qui est retourné via load() serait utile si cela ne fonctionne pas.

+0

C'était aussi ma supposition ... même si ce n'est pas ce qui est dans la documentation. Voir le HTML aiderait certainement à le résoudre. –

+0

La définition d'un délai devrait fonctionner, même si le délai est 0. Parfois, il suffit de "différer" l'appel pour que le contenu inséré via innerHTML soit disponible pour le DOM. – savetheclocktower

4

J'ai eu un problème similaire avec IE6 et IE7, mais setTimeout() n'était pas une solution fiable. Parfois cela fonctionnait, parfois non. Cela ne fonctionnait pas du tout sur certaines machines, et la valeur de 500 ms était complètement arbitraire de toute façon. La fonction focus() a fonctionné exactement comme prévu sans aucun délai d'attente dans Firefox et Chrome, bien sûr.

Ma solution a été d'appeler focus()deux fois pour IE:

function onPanelLoaded() { 
    var panel = $('#theTextInput'); 
    panel.focus(); 
    panel.focus(); 
} 

Maintenant, qui a fait ce que je voulais en premier lieu.

+0

cela fonctionne vraiment pour moi .. merci bro –

+0

Homme, vous avez fait ma journée: D –

Questions connexes