Dans l'exemple suivant, je n'obtiens qu'une seule boîte d'alerte. J'ai lu que l'accent est mis avant que le code JavaScript soit exécuté. Existe-t-il un moyen de faire fonctionner cela? (Je n'ai testé que ceci dans Safari) P> EDIT:
Je peux évidemment le faire de cette façon (sélecteur prototypejs): p> mais il a l'air moche par rapport à seulement ajouter un auditeur d'événement. P> EDIT: p> Ne vous inquiétez pas sur un manque de support de navigateur pour l'attribut Autofocus. Cela a été facilement résolu comme je l'ai fait dans I Fiddle Liens vers ci-dessous. Il y a aussi la meilleure solution au problème possible. Ma question est si je peux le faire dans un moins laid que de devoir appeler l'auditeur manuellement. P> http://jsfiddle.net/tellnes/7tmbJ/3/ p> Cela fonctionne bien dans Firefox 3.6 puisque Firefox ne prend pas en charge la mise à l'autofocasse. Mais dans Safari, qui soutient Autofocus, ne sont pas l'événement appelé. P> p>
5 Réponses :
de la Projet de travail HTML5 : P>
Il ne doit pas y avoir plus d'un élément dans le document avec le
autofocus code> attribut spécifié. p> blockQuote>Vous demandez donc un comportement indéfini de toute façon. p>
avec un seul
autofocus code>, sous Firefox 3.6, aucun des gestionnaires n'est appelé à la charge de la page. Donner manuellement l'accent à l'élément appelle à l'élément des deux gestionnaires (puis se déroule dans une boucle infinie, en raison des boîtes d'alerte, en rappelant la mise au point sur l'élément lors de la fermeture). P>Le brouillon HTML5 dit que
autofocus code> devrait effectuer le étapes de mise au point sur la charge de la page, y compris la mise en place de l'événementFOCUS CODE>, mais il y a de fortes chances que les navigateurs ne mettent pas en œuvre actuellement cette fonctionnalité dans une période complète ou cohérente manière. p>Vous voudrez peut-être appeler explicitement votre gestionnaire d'événements code> sur la charge de la page jusqu'à ce que la spécification HTML5 soit terminée et que les navigateurs commencent à visiter le support complet. P>
Le point est que je n'ai pas le deuxième événement. Ce n'est que mon code de test qui avait deux éléments d'entrée. Ont mis à jour le code maintenant.
@Christian, mais cela fonctionne si vous vous concentrez manuellement sur le contrôle après la charge de la page, n'est-ce pas?
@ Frédéric Hamidi Il ne tire pas le AddeventListener dans IE8. Semble travailler dans Firefox.
Oui. Le problème est que je ne reçois pas l'événement de mise au centre de la mise au point automatique s'il est attaqué après l'analyse du DOM.
@matthewpavkov, c'est-à-dire pas supporte addeventlistener () code>. Je ne vois pas le même comportement que vous dans Firefox, utilisez-vous la version bêta 4.0?
@ Frédéric Hamidi Je ne savais pas que c'est-à-dire que c'est-à-dire que c'est pas en charge addéventlistener () code> mais cela explique certainement pourquoi alerte (2) code> ne se déclenche pas. Je vois alerte (1) code> et alerte (2) code> tir à Firefox 3.6.12
@ Frédéric Hamidi Ok ... je me trompe. Cela ne tire pas les deux événements de Firefox. Cependant, le code d'origine était ... Je pense. Je pourrais avoir assermenté j'ai vu alerte (1) code> et alerte (2) code>.
@ Frédéric HAMIDI HAHA ... OK, j'ai accidentellement changé le code. Je vois les deux alertes dans Firefox. Alerte 1 incendie, puis alerte 2, dos à dos. Je ne vois que alerte (1) code> dans IE.
@Matthewpavkov, vous voulez dire sur la charge de la page et sans déclencher une boucle infinie?
@ Frédéric Hamidi à Firefox: Quand je charge la page initialement, rien ne se passe. Lorsque je clique (ou onglet) sur / dans l'entrée, je reçois les deux alertes. Je ne suis pas réellement capable d'entrer dans la case dans la case. Même en retirant l'une des alertes, je ne peux toujours pas entrer en texte dans l'entrée (il semble que l'entrée perd la mise au point juste après la déclenchement de l'alerte). Je suppose d'une manière, c'est une sorte de boucle infinie, mais la boucle ne se poursuit que tant que l'utilisateur apporte la mise au point sur l'entrée, encore et encore. Dans IE, je ne vois que la première alerte. De plus, je suis capable d'entrer du texte dans l'entrée.
Si vous devez exécuter un morceau de code JavaScript, onfocus code> pour l'entrée code> code>, vous pouvez utiliser jQuery:
Le code suivant de votre exemple actuel:
<input id="i" type="text" autofocus onfocus="alert(1)">
<script type="text/javascript">
document.getElementById('i').addEventListener('focus', function() {
alert(2);
}, false);
</script>
Cela ne provoque pas d'une boucle infinie d'alertes. L'Onfocus / Focus est un événement unique, avec deux ensembles de code qui devraient être exécutés. Il n'y a pas de boucle.
@Matthewpavkov hmm ... Cela a fait pour moi pour moi jsfiddle.net/subhaze/vxerx Les deux ensembles de Le code est ce qui cause la boucle. Je suppose que boucle code> est un terme incorrect pour cela ...
Ouais ... Je suppose que c'est un peu comme une boucle. Mais une boucle infinie i> suggère que le code s'exécute encore et encore, dans une boucle, seul. L'utilisateur doit ramener la mise au point à l'entrée afin que le code soit à nouveau exécuté.
@matthewpavkov, mais il fait b> exécute encore et encore, dans une boucle, à lui-même ... dans les navigateurs qui prennent en charge le HTML5 autofocus code> comme l'OP n'a pas besoin de cliquer sur L'entrée à nouveau, autofocus code> est-ce que vous pour vous ...
Vous devez donner une valeur à Autofocus.
Mauvais lien de violon?
@Rahul a l'air d'avoir renommé mon nom d'utilisateur Jsfiddle depuis que cela a été posté. J'ai mis à jour le lien.