Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用Object.assign获取文档键控事件_Javascript_Object_Events_Cyclejs - Fatal编程技术网

Javascript 无法使用Object.assign获取文档键控事件

Javascript 无法使用Object.assign获取文档键控事件,javascript,object,events,cyclejs,Javascript,Object,Events,Cyclejs,我正在使用 sources.DOM.select('document').events('keydown') .map(ev => Object.assign({}, ev, {type: 'keydown'})) 但是结果流只提供了具有“isTrusted”属性(而不是“key”、“code”等)的对象。相反,使用“mousemove”我可以获得预期的事件(使用“isTrusted”和“movementX”、“movementY”等)。怎么了?你是对的,不是问题,而是限制 简单地说

我正在使用

sources.DOM.select('document').events('keydown')
  .map(ev => Object.assign({}, ev, {type: 'keydown'}))
但是结果流只提供了具有“isTrusted”属性(而不是“key”、“code”等)的对象。相反,使用“mousemove”我可以获得预期的事件(使用“isTrusted”和“movementX”、“movementY”等)。怎么了?

你是对的,不是问题,而是限制

简单地说-
Object.assign
不会复制继承的属性

在提供工作替代方案的情况下:

function main (sources) {
  const vdom$ = sources.DOM.select('document').events('keydown')
    .map(ev => cloneEvent(ev))
    .map(mykey => div('Key pressed: ' + mykey.key + ', code:' + mykey.code))
    .startWith(div('Press a key.'))

  return {
    DOM: vdom$
  }
}

function cloneEvent(e) {
  if (e===undefined || e===null) return undefined;
  function ClonedEvent() {};  
  let clone=new ClonedEvent();
  for (let p in e) {
    let d=Object.getOwnPropertyDescriptor(e, p);
    if (d && (d.get || d.set)) Object.defineProperty(clone, p, d); else clone[p] = e[p];
  }
  Object.setPrototypeOf(clone, e);
  return clone;
}
见更新

这些问题和答案也有助于澄清情况:


您使用的是什么版本的循环DOM?对不起,我用导致问题的部分编辑了问题中的代码(我没有怀疑是这样的)。因此,问题是Object.assign,它不会将事件对象的所有属性复制到新对象中。在我看来,除了“isTrusted”之外,object.assign和JSON.stringify都忽略了事件对象的属性。你知道为什么吗?谢谢你的澄清。为了解决这个问题,我在一个新对象{event:ev,键入:'keydown'}中加入了event对象,以避免弄乱对象的内部细节。