检查Meteor中的输入

时间:2013-02-06 04:35:39

标签: javascript meteor

我试图了解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传递什么?

2 个答案:

答案 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方法是围绕单个函数包装keyupkeydownfocusout DOM事件的方法,该函数将每个函数结果的详细信息策划为自定义{ {1}}或ok事件。

这会产生一个绑定到EventMapTemplate.todos.events implementation对象,以便所有cancelkeyupkeydown事件都以{{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 || ""evtkeyup方法以及keydown和{{}的传入event 1}}是此本机focusout对象的烘焙属性。你不需要手工构建它。