我目前正在开展一个项目并提供一些帮助,并且一直顺利进行,直到此事件发生。
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库来构建网站,我需要知道如何解决这个问题,或者替代方案。
答案 0 :(得分:2)
我非常高度怀疑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 :(得分:1)
适用于Chrome 3.0.195.38。
我从未听说过Chrome中的hasOwnProperty
有任何问题。我怀疑你的问题出在其他地方。完整的测试案例?你是怎么读这些命令的?您是否有可能在Chrome中获得具有领先空白的命令?
你应该记得将函数中的局部变量(commands
,parameters
等)声明为var
,否则你会得到意外的全局变量,这会产生奇数和难以-debug错误,虽然我怀疑这是问题所在。
答案 2 :(得分:0)
我敢打赌,问题在于Firefox和Chrome之间“分裂”的工作原理存在差异。我会尝试更改获取参数和命令的方式:
var command = commandString, parameters = [];
if (/ /.test(command)) {
parameters = command.split(' ');
command = parameters[0];
parameters = parameters.slice(1);
}
编辑第二个想法应该没有区别;据我所知,Safari应该处理简单的“分裂空间”的事情就好了。确保在该代码周围添加一些调试,以查看当函数认为在对象中找不到“清除”时的“命令”。正如@bobince所说,使用var
定义您的变量!!!!
答案 3 :(得分: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
}
}
答案 4 :(得分:0)
在DOM Object实例上使用hasOwnProperty现在将返回false