Javascript hasOwnProperty не работает под Google Chrome - PullRequest
0 голосов
/ 04 апреля 2010

В настоящее время я работаю над проектом с некоторой помощью, и он продвигался хорошо до этого инцидента.

  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>');
   }
  }

Человек, который помогал мне, сделал эту функцию, чтобы я мог запускать "терминальные" браузеры, с которыми мне нужно было работать.

Отлично работает при использовании Firefox, вот пример:

guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear

*clears*

guest@shell:/$ clear

Но в Google Chrome это происходит:

guest@shell:/$ sudo make me sandwich
sudo command not recognized.
guest@shell:/$ clear
clear command not recognized.

Я считаю, что это как-то связано с "commands.hasOwnProperty (command)", что мешает его правильной работе.

Я использую JQuery библиотеку javascript для создания веб-сайта, и мне нужно знать, как решить эту проблему, или альтернативу.

Ответы [ 5 ]

2 голосов
/ 30 сентября 2010

I очень очень сомневаюсь, что у Chrome есть какие-либо проблемы с hasOwnProperty, но в любом случае я очистил ваш код и изменил проверку hasOwnProperty на проверку typeof, которая также должна быть немного более надежной:

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 />');
        }
    };
}());

... если вам любопытно, я храню объект команд в закрытии, таким образом его нужно создавать только один раз, а не создавать / уничтожать при каждом запуске функции.Это значительно быстрее, очевидно.

Кроме того, я только один раз выполняю поиск элемента #terminal, затем сохраняю его в переменной и использую его.Это также связано с производительностью, поскольку выполнение поиска jQuery намного дороже, чем сохранение результата и его повторное использование.

1 голос
/ 04 апреля 2010

У меня работает в Chrome 3.0.195.38.

Я никогда не слышал о каких-либо проблемах с hasOwnProperty в Chrome. Я подозреваю, что ваша проблема лежит в другом месте. Полный тест? Как вы читаете команды в? Возможно ли получить команду с начальными пробелами в Chrome?

Не забудьте объявить локальные переменные в вашей функции (commands, parameters и т. Д.) Как var, в противном случае вы получаете случайные глобальные переменные, которые могут привести к нечетным и трудным для отладки ошибкам, хотя сомневаюсь, что здесь была проблема.

0 голосов
/ 25 мая 2015

Использование hasOwnProperty для экземпляра объекта DOM теперь возвращает false

Подробнее ..

0 голосов
/ 30 сентября 2010
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 голосов
/ 04 апреля 2010

Могу поспорить, что проблема в различиях в том, как работает «split» между Firefox и Chrome. Я попытался бы изменить способ получения параметров и команды:

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

изменить на второй мысли, которая не должна иметь никакого значения; насколько я могу судить, Safari прекрасно справляется с простым делом на части. Убедитесь, что вы добавили некоторую отладку вокруг этого кода, чтобы увидеть, что такое «команда», когда функция считает, что не может найти «clear» в объекте. И, как говорит @bobince, определите свои переменные с помощью var !!!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...