2010-06-21 11 views
0

Quelqu'un peut-il me dire ce que je fais mal? Je suis un débutant à JavaScript, donc je ne suis pas habitué à déboguer du code pour le moment.Simple JavaScript ne fonctionne pas

Merci

Luke

+3

Qu'est-ce qui ne fonctionne pas spécifiquement, et obtenez-vous une erreur? –

+0

Etes-vous sûr que c'est le bon chemin vers vos images '.png'? Ils ne sont pas dans un répertoire 'images /' ou quelque chose? – ceejayoz

+0

Qu'essayez-vous de faire en premier lieu? Est-ce que cela vient avec un fichier HTML ou quelque chose? – OscarRyz

Répondre

-1

Au lieu de window.onload = initForm essayer window.onload = function() {/ la fonction init/} Aussi, quand une fonction se référant à vous devez utiliser() même s'il n'y a pas d'arguments.

+3

Pas vrai du tout. 'window.onload = initform' est parfaitement légal. Vous affectez la valeur de 'window.onload' à' la fonction initform', si vous ajoutez '()', elle appellera immédiatement cette fonction et assignera 'window.onload' à la valeur de retour de' initform'. – gnarf

1

Le problème est que lorsque fieldSelect et fieldDeselect OBTIENNENT appelés, this fait référence à l'objet window, et non à l'élément qui a déclenché l'événement. Vous voudrez peut-être envisager d'utiliser jQuery:

$(document).ready(function() { 
    $('.textbox').focus(fieldSelect).blur(fieldDeselect); 
}); 

function fieldSelect() { 
    $(this).css('background-image', 'url("inputBackSelected.png")'); 
} 

function fieldDeselect() { 
    $(this).css('background-image', 'url("inputBack.png")'); 
} 

jQuery prend soin de faire en sorte que lorsque vos gestionnaires d'événements sont appelés se, this fait référence à l'élément qui a déclenché l'événement.

+0

C'est le problème. – David

+0

(Dans Internet Explorer ...) – gnarf

3

Votre problème réside dans l'association de vos gestionnaires d'événements. Vous devez lier à onfocus et onblur (notez le nom de l'événement en minuscule).

Comme suggestion, vous pouvez regarder un simple navigateur croix addEvent() avec une ligne rapide de code ajouté pour assurer le pointeur this approprié:

function addEvent(obj, evType, fn, useCapture){ 
    if (obj.addEventListener){ 
    obj.addEventListener(evType, fn, useCapture); 
    return true; 
    } else if (obj.attachEvent){ 
    // fix added by me to handle the `this` issue 
    var r = obj.attachEvent("on"+evType, function(){ 
     retrun fn.apply(obj, arguments); 
    }); 
    return r; 
    } else { 
    alert("Handler could not be attached"); 
    } 
} 

Et puis utilisez la fonction addEvent au lieu de allTags[i].onfocus = vous aurez probablement un meilleur kilométrage dans les futurs événements de liaison.

addEvent(allTags[i], 'focus', fieldSelect); 
addEvent(allTags[i], 'blur', fieldDeSelect); 

jsfiddle demonstration

1

Deux choses, les événements doivent être minuscules (onfocus, onblur) et this ne pointe pas à l'objet qui a déclenché l'événement dans IE. Essayez ceci:

function fieldSelect(e) { 
    var event; 
    if(!e) { 
     event = window.event; 
    } else { 
     event = e; 
    } 
    event.target.style.backgroundImage = "url('inputBackSelected.png')"; 
} 

function fieldDeSelect(e) { 
    var event; 
    if(!e) { 
     event = window.event; 
    } else { 
     event = e; 
    } 
    event.target.style.backgroundImage = "url('inputBack.png')"; 
} 

Les navigateurs conformes aux normes passeront un objet événement au gestionnaire d'événements. IE utilise un objet global window.event à la place. De toute façon, vous pouvez utiliser cet objet pour obtenir la cible de l'événement qui a déclenché le gestionnaire.

Une autre option, probablement préférable, consisterait à définir vos fonctions et à supprimer un className au lieu de modifier directement le style. Ensuite, mettez un style appelé selected dans votre feuille de style qui remplace l'image d'arrière-plan. De cette façon, vous gardez les informations de style et le comportement séparés.

+2

'e = e || window.event; 'est un moyen rapide d'assurer l'objet d'événement approprié dans' e'. Si 'e' est falsy (undefined/0/''/etc), l'opérateur JavaScript ou' || 'aura pour résultat que' window.event' sera assigné à 'e'; – gnarf

+0

Merci pour les réponses, Il semble que le fait que j'ai eu onBlur au lieu de onblur signifie que cela n'a pas fonctionné. Mais ni firebig de firefox, ni l'inspecteur de chrome a souligné cela. Quoi qu'il en soit, cela fonctionne maintenant, et semble également fonctionner dans IE 8. Je ne suis pas sûr des autres versions de IE si. – StrattonL

+0

Je voulais dire firebug! – StrattonL