2010-04-04 100 views
0

我目前正在一個項目上工作,並得到了一些幫助,並且一直很順利,直到此事件發生。Javascript hasOwnProperty無法在谷歌瀏覽器下工作

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時,下面有一個例子能正常工作:

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

*clears* 

[email protected]:/$ clear 

但在谷歌瀏覽器出現這種情況:

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

我相信它是與「commands.hasOwnProperty(命令)「,這是阻止它正常工作。

我使用JQuery的JavaScript庫來建立網站,我需要知道如何解決這個問題,或者一個替代方案。

回答

1

適用於Chrome 3.0.195.38。

我從來沒有聽說在Chrome中有hasOwnProperty的任何問題。我懷疑你的問題在別處。完整的測試案例?你如何閱讀命令?您是否有可能在Chrome中獲得帶有空白的命令?

你應該記住在你的函數(commandsparameters等)var聲明局部變量,否則你得到意外的全局變量,它可以產生奇怪的和難以調試的錯誤,但我要懷疑這是這裏的問題。

0

我敢打賭,這個問題是在「分裂」 Firefox和Chrome.I之間是如何工作的差異會嘗試改變,你得到的參數和命令的方式:在第二次思想

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

編輯這應該沒有區別;據我所知,Safari應該處理簡單的「拆分空間」問題。確保在代碼中添加一些調試,以查看函數認爲在對象中找不到「清除」時的「命令」。而@ bobince說,var定義你的變量!

+0

那麼,什麼是* *在 「拆分」 火狐和Chrome之間是如何工作的區別是什麼? – 2010-04-04 14:23:12

+0

大多數瀏覽器中的「split()」變幻莫測都與正則表達式有關(例如'foo.split(/ \ d /)')。請參閱http://blog.stevenlevithan.com/archives/cross-browser-split – Pointy 2010-04-04 14:31:48

2

非常高度懷疑鉻與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搜索比存儲結果並反覆使用它要昂貴得多。

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

在DOM對象實例使用hasOwnProperty現在將返回false

More info..

相關問題