无法使用 Object.assign 获取文档按键事件
Cannot get document keydown events with Object.assign
我正在使用
sources.DOM.select('document').events('keydown')
.map(ev => Object.assign({}, ev, {type: 'keydown'}))
但是生成的流给出的对象只有 "isTrusted" 属性(而不是 "key"、"code" 等)。相反,使用 'mousemove' 我得到了预期的事件(使用 "isTrusted" 但也有 "movementX"、"movementY" 等)。怎么了?
你是对的,不是Cycle.js problem but rather a limitation of Object.assign
。
简单地说——Object.assign
不复制继承的属性。
This answer on a similar problem 提供了一个可行的替代方案:
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;
}
查看更新 codepen.io example。
这些 SO 问题和答案也有助于澄清情况:
我正在使用
sources.DOM.select('document').events('keydown')
.map(ev => Object.assign({}, ev, {type: 'keydown'}))
但是生成的流给出的对象只有 "isTrusted" 属性(而不是 "key"、"code" 等)。相反,使用 'mousemove' 我得到了预期的事件(使用 "isTrusted" 但也有 "movementX"、"movementY" 等)。怎么了?
你是对的,不是Cycle.js problem but rather a limitation of Object.assign
。
简单地说——Object.assign
不复制继承的属性。
This answer on a similar problem 提供了一个可行的替代方案:
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;
}
查看更新 codepen.io example。
这些 SO 问题和答案也有助于澄清情况: