我试图了解Meteor中的Todos示例。有一段我无法理解的代码:
// Returns an event map that handles the "escape" and "return" keys and
// "blur" events on a text input (given by selector) and interprets them
// as "ok" or "cancel".
var okCancelEvents = function (selector, callbacks) {
var ok = callbacks.ok || function () {};
var cancel = callbacks.cancel || function () {};
var events = {};
events['keyup '+selector+', keydown '+selector+', focusout '+selector] =
function (evt) {
if (evt.type === "keydown" && evt.which === 27) {
// escape = cancel
cancel.call(this, evt);
} else if (evt.type === "keyup" && evt.which === 13 ||
evt.type === "focusout") {
// blur/return/enter = ok/submit if non-empty
var value = String(evt.target.value || "");
if (value)
ok.call(this, value, evt);
else
cancel.call(this, evt);
}
};
return events;
};
events['keyup '+selector+', keydown '+selector+', focusout '+selector] = function(){}
会产生什么?
为什么我们需要将以下字符串转换为字符串:String(evt.target.value || "")
?
上述函数的evt参数是否必须包含.type,.target和.target.value?我可以通过evt传递什么?
答案 0 :(得分:4)
events['keyup '+selector+', keydown '+selector+', focusout '+selector] = function(){}
为meteor创建一个函数来映射按键(keyup,keydown)事件和丢失焦点事件(焦点输出)。产生此函数并赋予流星模板系统以使用特定的css选择器绑定到元素。
evt
值包含触发事件时触发的DOM event
值。应该作为evt
传递的唯一内容是触发事件时给出的原始DOM event
,在触发事件时由event
(作为变量)给出。 / p>
我最好用代码解释一下。 todos示例执行相同的操作,除了它使用css选择器将事件绑定到元素:
<input type="text" onkeyup="doSomething(event);"/>
<script>
//js code
function doSomething(evt) { console.log(evt.target.value) }
</script>
String(evt.target.value || "")
基本上确保如果evt.target.value
是一个字符串,以防它被输入为其他内容。我不是100%肯定什么时候它不能是一个字符串,但我认为浏览器并不总是标准地触发事件。
并不总是需要这个事件。但它非常有用。在代码示例中,您使用它来识别哪个文本框触发了事件&amp;按键是什么键。
有关活动的更多信息:
答案 1 :(得分:4)
我把这个问题分成了三个部分:
event ['keyup'+ selector +',keydown'+ selector +',focusout'+ selector] = function(){}会产生什么?
okCancelEvents
方法是围绕单个函数包装keyup
,keydown
和focusout
DOM事件的方法,该函数将每个函数结果的详细信息策划为自定义{ {1}}或ok
事件。
这会产生一个绑定到EventMap
的Template.todos.events
implementation对象,以便所有cancel
,keyup
和keydown
事件都以{{1}的形式出现或} focusout
通过ok
。
为什么我们需要将以下字符串转换为字符串:String(evt.target.value ||“”)?
我认为这不是必要的。 cancel
同样适用,因为浏览器会interpret a string primitive as a string object。
所述函数的evt参数是否必须包含.type,.target和.target.value?我可以通过evt传递什么?
EventMap
参数是来自var value = evt.target.value || ""
,evt
和keyup
方法以及keydown
和{{}的传入event
1}}是此本机focusout
对象的烘焙属性。你不需要手工构建它。