Hé, c'est la première fois que j'ai fini de rédiger une question sans que SO me donne la réponse dans le processus. :)Prototype Ajax.Autocompleter en HTML ajouté dynamiquement ne fonctionne pas
J'ai un formulaire imbriqué (comme le tutoriel Railscast de Ryan Bates sur le sujet) qui permet aux utilisateurs d'ajouter dynamiquement des champs supplémentaires pour ajouter/supprimer des modèles imbriqués en utilisant javascript basé sur Prototype. Les champs supplémentaires peuvent être ajoutés et supprimés et fonctionnent très bien pour créer de nouveaux modèles.
Le problème est que l'un des champs utilise un Ajax.Autocompleter; le code dans la page lorsque est rendu partielle ressemble à ceci:
<script type="text/javascript">
//<![CDATA[
new Ajax.Autocompleter(...various args...);
//]]>
</script>
L'autocomplétion fonctionne très bien si la partie est rendue pour commencer (par exemple, si le formulaire commence par une instance de la partie, ou lorsque éditer des modèles imbriqués existants). Cependant, cela ne fonctionne pas dans les champs de formulaire ajoutés dynamiquement.
J'ai essayé d'utiliser à la fois insert() et de définir simplement innerHTML d'un div vide pour insérer le HTML partial. Avec insert(), le code Autocompleter est évalué et tout le contenu de la balise <script>
disparaît (d'après ce que je comprends), mais la saisie semi-automatique ne fonctionne pas. Avec la définition de innerHTML, le script apparaît exactement comme dans le partiel pré-rendu, mais l'autocompléteur n'est toujours pas appelé.
Je suppose que cela a quelque chose à voir avec le fonctionnement d'evalScripts, et j'ai trouvé some documentation on the subject, mais j'ai du mal à savoir comment l'appliquer à la déclaration Autocompleter.
Un conseil extrêmement apprécié!
ETA: ajouter le javascript utilisé pour ajouter dans la nouvelle section:
function add_section(link, nested_model_name, content) {
// get the right new_id which should be in a div with class "last_id" at the bottom of
// the nearest section
var last_id = parseInt($(link).up().previous('.last_id').innerHTML);
var new_id = last_id + 1;
var regexp = new RegExp("new_" + nested_model_name, "g");
content = content.replace(regexp, new_id)
// this is the line that actually inserts the content into the page
$(link).up().insert({before: content});
}
Debugging avec Firebug montre que le contenu est correct (ie a le code de saisie semi-automatique normalement travailler en elle) avant qu'il ne soit inséré.
Merci pour l'essai mais malheureusement non - J'ai ajouté la fonction javascript qui ajoute la nouvelle section à ma question originale pour plus de clarté. Je veux juste dire qu'avec 'insert()' Prototype essaye d'évaluer le script, vraisemblablement de la même façon qu'il le fait en utilisant Ajax.Updater avec evalScripts réglé sur true. – shalott