簡體   English   中英

Javascript hasOwnProperty在Google Chrome瀏覽器下不起作用

[英]Javascript hasOwnProperty does not work under 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>');
   }
  }

幫助我的人完成了此功能,因此我可以運行需要使用的“終端式”瀏覽器。

使用Firefox時效果很好,下面是一個示例:

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

*clears*

guest@shell:/$ clear

但是在谷歌瀏覽器下會發生這種情況:

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

我認為它與“ commands.hasOwnProperty(command)”有關,導致它無法正常工作。

我正在使用JQuery的JavaScript庫來構建網站,並且我需要知道如何解決此問題或替代方法。

非常懷疑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搜索比存儲結果並重復使用它要昂貴得多。

在Chrome 3.0.195.38中為我工作。

我從未聽說過Chrome中hasOwnProperty有任何問題。 我懷疑您的問題出在其他地方。 完整的測試用例? 您如何閱讀其中的命令? 您是否可能在Chrome中使用領先的空格獲取命令?

您應該記得將函數( commandsparameters等)中的局部變量聲明為var ,否則會出現意外的全局變量,這可能會產生奇數且難以調試的錯誤,盡管我懷疑這是問題所在。

我敢打賭,問題在於Firefox和Chrome之間“拆分”的工作方式存在差異。我將嘗試更改獲取參數和命令的方式:

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

編輯應該沒有什么區別的第二個想法; 據我所知,Safari應該能夠處理簡單的“在空間上分割”的事情。 確保在該代碼周圍添加了一些調試功能,以在函數認為無法在對象中找到“清除”時查看“命令”是什么。 就像@bobince所說的那樣, var !!!! 定義變量

現在在DOM Object實例上使用hasOwnProperty將返回false

更多信息..

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM