2009-04-24 5 views
2

Quelqu'un connaît-il Native Code dans OS X Safari (Version 3 et WebKit)? J'utilise Javascript pour analyser certaines informations dans un formulaire et une de mes entrées est appelée "tags". Lorsque vous essayez d'obtenir la valeur de cet élément en utilisant:Code natif de Safari

// button is being passed through a function as a DOM object 
var tags = button.form.elements["tags"].value; 

Safari renvoie une sorte de fonction. Je l'ai eu pour alerter des valeurs comme "function tags() {[code natif]}" et Node Trees mais je n'arrive pas à comprendre pourquoi j'aurais des problèmes. Si quelqu'un a une idée, s'il vous plaît faites le moi savoir. Je l'ai fait fonctionner en changeant le nom de l'entrée en quelque chose d'autre et aussi en itérant tous les éléments et en utilisant if() pour déterminer si c'est l'élément que je veux, mais je suis terriblement curieux de savoir pourquoi Apple restreindre l'utilisation de tout élément de formulaire nommé "tags" ...

PS - C'est un test et fonctionne bien dans Firefox.

Répondre

6

[native code] signifie simplement que c'est une fonction qui est intégrée au navigateur, plutôt que d'être écrite en JavaScript. tagsappears to be une extension WebKit vers le DOM pour vous permettre d'obtenir une liste d'éléments dans le formulaire par nom de tag. Par exemple, si je lance ceci sur la page StackOverflow, je reçois la zone de texte de réponse:

document.getElementById('submit-button').form.elements.tags("textarea")[0] 

La question est qu'un index dans une collection en JavaScript aussi l'accès des propriétés de l'objet (y compris les méthodes), de sorte que lorsque vous essayez d'accéder à votre élément nommé tags, vous obtenez à la place la méthode sur l'objet elements que définit WebKit. Heureusement, il existe une solution de contournement; vous pouvez appeler namedItem sur la liste des éléments pour obtenir un article par id ou name:

var tags = button.form.elements.namedItem("tags").value; 

modifier: Notez que c'est probablement préférable d'utiliser namedItem en général, même dans d'autres navigateurs, au cas où vous devez récupérer un élément nommé item ou length ou quelque chose comme ça; Sinon, si vous les utilisez comme index avec l'opérateur [], vous obtiendrez la méthode intégrée item ou length au lieu de votre élément.

+0

A travaillé comme un charme, merci! – bloudermilk

+0

Intéressant, je n'ai jamais eu ce problème dans Safari mais je l'ai juste rencontré avec IE9. Heureusement, la même solution a fonctionné là. – arlomedia

+0

Oups, j'ai trouvé un piège avec ça. Si vous essayez d'accéder à un élément de formulaire avec plusieurs éléments - un ensemble de cases à cocher ou boutons radio - alors namedItem retournera un tableau d'éléments dans Safari mais seulement le premier élément dans IE9 et Firefox 4 (les seules versions que j'ai vérifiées jusque là). Donc, si vous travaillez avec des cases à cocher ou des boutons radio, ce n'est pas un substitut pour les éléments [], qui retourne toujours le tableau des éléments. – arlomedia