2010-04-04 9 views
0

Je travaille actuellement sur un projet avec de l'aide et ça s'est bien passé, jusqu'à cet incident.Javascript hasOwnProperty ne fonctionne pas sous Google Chrome

function runCommand(commandString) 
    { 
    commands = new Object(); 
    commands.clear = function(){ $('#terminal').html('') } 

    parameters = commandString.split(" "); 
    command = parameters.shift(); 
    if(commands.hasOwnProperty(command)){ 
    commands[command](parameters); 
    } 
    else 
    { 
    $('#terminal').append(command+' command not recognized.'+'<br>'); 
    } 
    } 

La personne qui me aidait à fait cette fonction, donc je pouvais exécuter les navigateurs « terminaux comme » que je devais travailler.

Il fonctionne très bien lorsque vous utilisez Firefox, Heres un exemple:

[email protected]:/$ sudo make me sandwich 
sudo command not recognized. 
[email protected]:/$ clear 

*clears* 

[email protected]:/$ clear 

Mais sous google chrome ce arrivé:

[email protected]:/$ sudo make me sandwich 
sudo command not recognized. 
[email protected]:/$ clear 
clear command not recognized. 

Je crois qu'il a quelque chose à voir avec « commands.hasOwnProperty (commande) "qui l'empêche de fonctionner correctement. J'utilise JQuery la bibliothèque javascript pour construire le site Web, et j'ai besoin de savoir comment résoudre ce problème, ou une alternative.

Répondre

1

Fonctionne pour moi dans Chrome 3.0.195.38. J'ai jamais entendu parler de hasOwnProperty dans Chrome Je soupçonne que votre problème est ailleurs. Cas de test complet? Comment lisez-vous les commandes? Est-il possible que vous obteniez une commande avec des espaces blancs dans Chrome?

Vous devez vous rappeler de déclarer des variables locales dans votre fonction (commands, parameters etc.) var, sinon vous obtenez GLOBALS accidentels, qui peuvent produire des erreurs étranges et difficiles à debug, bien que je doute que avais été le problème ici.

0

Je parie que le problème est avec des différences dans la façon dont « split » fonctionne entre Firefox et Chrome.I tenteraient de changer la façon dont vous obtenez les paramètres et la commande:

var command = commandString, parameters = []; 
if (/ /.test(command)) { 
    parameters = command.split(' '); 
    command = parameters[0]; 
    parameters = parameters.slice(1); 
} 

modifier à la réflexion cela ne devrait faire aucune différence; pour autant que je sache, Safari devrait gérer le simple "split on space". Assurez-vous que vous ajoutez un peu de débogage autour de ce code pour voir ce que "commande" est lorsque la fonction pense qu'il ne peut pas trouver "effacer" dans l'objet. Et comme @bobince dit, définir vos variables avec var !!!!

+0

Alors, que * sont * les différences dans la façon dont "split" fonctionne entre Firefox et Chrome? –

+0

Généralement les "split()" aléas entre les navigateurs ont à voir avec les arguments regex (comme 'foo.split (/ \ d /)' par exemple). Voir http://blog.stevenlevithan.com/archives/cross-browser-split – Pointy

2

Je très doute fortement Chrome a des problèmes avec hasOwnProperty, mais dans les deux cas, je nettoyé votre code et changé le chèque hasOwnProperty en un chèque typeof, qui devrait également être légèrement plus robuste:

var runCommand = (function() { 
    var terminal = $('#terminal'); 

    var commands = { 
     clear: function() { 
      terminal.html(''); 
     } 
    }; 

    return function (commandString) { 
     var parameters = commandString.split(" "); 
     var command = parameters.shift(); 

     if (typeof commands[command] === "function") { 
      commands[command](parameters); 
     } else { 
      terminal.append(command + ' command not recognized.<br />'); 
     } 
    }; 
}()); 

... dans le cas où vous êtes curieux, je stocke l'objet de commandes dans une fermeture, de cette façon, il doit seulement être créé une fois, plutôt que d'être créé/détruit chaque fois que la fonction est exécutée. C'est nettement plus rapide, évidemment.

En outre, je ne lance qu'une seule recherche de l'élément #terminal, puis je le stocke dans une variable et je l'utilise. Cela vaut également pour les performances, car l'exécution d'une recherche jQuery est beaucoup plus coûteuse que le stockage du résultat et son utilisation répétée.

0
function runCommand(commandString) { 
    var terminal = $('#terminal'), //cached to reduce calls to jQuery 
    commands = { //start object literal, continue var statement 
     clear: function(){ 
      terminal.html(''); 
     } 
    }, 
    parameters = commandString.split(' '), 
    command = parameters.shift(); //end var statement 
    if (commands.hasOwnProperty(command)) { 
     commands[command].call(parameters); 
     console.log(command + ' command sent.'); //output for testing 
    } else { 
     terminal.append(command + ' command not recognized.<br>'); 
     console.warn(command + ' command not recognized.'); //output for testing 
    } 
} 
0

En utilisant hasOwnProperty sur une instance d'objet DOM va maintenant return false

More info..

Questions connexes