IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Type Error : _items has no properties


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut Type Error : _items has no properties
    Bonjour,

    J'ai un petit soucis en JS, j'ai créé deux scripts utilisant Prototype.js :
    Code ajax.js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var Request = {
            send: function(url, callback) {
                    new Ajax.Request(url, {
                            method: 'post',
                            asynchronous: 'true',
                            onSuccess: function(request) {
                                    callback(request.responseXML);
                            },
                            onFailure: function(request) {
                                    alert('Error ' + request.status + ' -- ' + resquest.statusText);
                            },
                            onException: function(request, exception) {
                                    alert('Exception :' + exception);
                            }
                    });
            }
    }

    et
    Code menu.js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    Menu = Class.create({   
            XML_FILE: "xml/menu.xml",
     
            _items: [],
     
            initialize: function() {
                    this._items = new Array();
            },
     
            load: function() {
                    new Request.send(this.XML_FILE, this._loadCallBack);
            },              
     
            _loadCallBack: function(responseXML) {
                    var items = responseXML.getElementsByTagName("item");
                    for (var i = 0; i < items.length; i++) {
                            var item = new Menu.Item(items[i]);
                            this._items.push(item);
                    }
                    alert(this.toHtml());
            },
     
            toHtml: function() {
                    var html = "<ul>";
                    for (var i = 0; i < _items.length; i++) {
                            html += _items[i].toHtml();
                    }
                    html += "</ul>";
                    return html;
            }
    });
     
    Menu.Item = Class.create({
            _title: null,
     
            initialize: function(itemXMLElement) {
                    this._title = itemXMLElement.getAttribute("title");
            },
     
            getTitle: function() {
                    return this._title;
            },
     
            toHtml: function() {
                    return "<li><a href=\"#\">" + this._title + "</a></li>";
            }
    });

    Lorsque j'execute new Menu().load() j'obtient l'exception "Type Error : _items has no properties".
    Il semblerai que this._items dans la fonction _loadCallBlack ne soit pas définie.
    Alors que la fonction est une fonction interne de la classe Menu.

    Comment resourdre le problème ?

    Merci d'avance.
    Gronono

  2. #2
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    c'est peut-être simplement la re-déclaration de variable, générée par ta boucle qui pollue ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var item = new Menu.Item(items[i]);
    Essaye déclarant item avant le for () ...

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  3. #3
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    merci de ta réponse mais ça ne marche pas. Je viens d'essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    _loadCallBack: function(responseXML) {
                    var ms = responseXML.getElementsByTagName("item");
                    var item = null;
                    for (var i = 0; i < ms.length; i++) {
                            item = new Menu.Item(ms[i]);
                            this._items.push(item);
                    }
                    alert(this.toHtml());
    },
    Je pense que c'est plus un problème d'espace de nommage. La variable _items ne doit pas corresponde avec celle déclarer dans Menu.

    A+
    Gronono

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par gronono Voir le message
    La variable _items ne doit pas corresponde avec celle déclarer dans Menu.
    Bizarre, puisqu'elle fonctionne ailleurs ...
    J'aurais plutôt tenté ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    item = Menu.Item(items[i]);
    Sinon (si c'est bien un problème de portée de this) il faut peut être remplacer this par un paramètre passé à la fonction ...

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  5. #5
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Bonjour

    Peut-etre, en déclarant simplement :
    en corrigeant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            initialize: function() {
                    }


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  6. #6
    Membre confirmé Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2003
    Messages : 456
    Points : 482
    Points
    482
    Par défaut
    @roro06 : Ta méthode ne marche pas.

    Sinon je viens de redéfinir mes "classes" pour passer un paramètre (ou plusieurs)
    Code ajax.js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    var Request = {
            send: function(url, callback, args) {
                    new Ajax.Request(url, {
                            method: 'post',
                            asynchronous: 'true',
                            onSuccess: function(request) {
                                    callback(request.responseXML, args) ;
                            },
                            onFailure: function(request) {
                                    alert('Error ' + request.status + ' -- ' + resquest.statusText);
                            },
                            onException: function(request, exception) {
                                    alert('Exception :' + exception);
                            }
                    }); 
            }
    }

    Code menu.js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
            load: function() {
                    new Request.send(this.XML_FILE, this._loadCallBack, this);
            },
     
            _loadCallBack: function(responseXML, menu) {
                    var ms = responseXML.getElementsByTagName("item");
                    for (var i = 0; i < ms.length; i++) {
                            item = new Menu.Item(ms[i]);
                            menu._items.push(item);
                    }       
                    alert(menu.toHtml(menu));
            },  
     
            toHtml: function(menu) {
                    var html = "<ul>";
                    for (var i = 0; i < menu._items.length; i++) {
                            html += menu._items[i].toHtml();
                    }
                    html += "</ul>";
                    return html;
            }

    Maintenant, ca marche mais je perds l'intéret de faire une classe ?
    N'y a-t-il pas une solution plus élégante ?

    Merci,
    Gronono

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2009, 11h35
  2. Error :document.Form.elements has no properties
    Par makohsarah dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/07/2007, 16h11
  3. [Mozilla] document.getElementById(var) has no properties
    Par dys_ dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/11/2005, 15h33
  4. document.images[i] has no properties, kesako ?
    Par weed dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 07/10/2005, 17h59
  5. document.getElementById() has no properties ..
    Par ahage4x4 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/06/2005, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo