我正在使用javascript编写一个使用对象文字而不是构造函数的任务应用程序。
用户点击页面上的特定元素,表单接收键入的“命令”。然后,系统会提示用户输入命令的参数。
这一切都是第一次有效。但是,如果用户单击页面上的另一个元素并输入命令,则脚本运行TWICE!似乎对象文字堆积起来。
这可能吗?
修改
我发现从任何事件处理程序解绑表单都使用jQuery的.unbind()
来解决问题。我想我对文字的理解比我想象的要差。我不明白表格最初是如何与文字绑定的。
我没有发布代码,因为我不认为复杂的应用程序流会帮助解决这个问题。也就是说,问题不在于我的代码......而在javascript中如何存在对象文字。我正在使用它们,因为我认为只创建了一个实例。可以创建多个文字副本吗?
用户点击页面上的元素。这可以是组名,主题名称或任务名称。然后他们在页面底部的表单输入中输入一个命令。
提交该表单时会发生一些事情:我的command
对象允许received
属性并运行方法delegate()
。
//handle command line submission
$(command.form).submit(function(event){
event.preventDefault();
command.received = $(command.line).val();
command.delegate();//sends the command to the appropriate taxonomy method
});
command.delegate()
检查表单输入中的命令是否是允许的预定义命令之一,然后从三个对象文字中的一个调用方法receive_command()
,这表示用户是否单击了该元素是一个小组,主题或术语。
/* engage the taxonomy object defined by selected item
*/
delegate : function(){
if(command.validates()){
if(this.taxonomy == 'group'){group.receive_command();}
if(this.taxonomy == 'topic'){topic.receive_command();}
if(this.taxonomy == 'task'){task.receive_command();}
}
}
主题对象文字的receive_command()
函数获取命令对象文字的属性,并根据两部分命令周期的哪一部分是最新的来确定运行哪个方法(第1部分显示提示,第2部分)验证并运行命令。)
/* command object sends retrieved commands to this function for constructive processing
*/
receive_command:function(){
//read command name, call matching method
//route command to second stage if set else to prompt method of called action if not
if(topic.current_op){
topic[topic.current_op].validate();
}
else{
if(command.received.length > 1){
topic.current_op = command.received;
}
else{
topic.current_op = topic.aliases[command.received];
}
topic[topic.current_op].prompt();
}
},
当用户单击第一个元素时,提示,然后验证并运行该命令一次。如果没有页面重新加载,当用户再次单击另一个主题或同一主题并添加另一个任务时,会在不提示命令周期的第2阶段的情况下添加空白任务。当跟踪alert()
s放置在代码中的点时,似乎提交表单会重新运行以前的命令以及当前命令。结果是将空任务添加到列表中,因为第一阶段命令以按下回车键结束,命令表单中没有值,代码读取该值作为要插入数据库的空任务。
这些信息很复杂且过于复杂,但我的问题仍然存在,多个对象文字如何多次实例化?