- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 Karma-Jasmine 测试中,我必须测试我的 onPaste
方法。
onPaste
方法:
onPaste(event: any): void {
const pastedText = event.clipboardData.getData('text/plain');
// some stuff
}
我的单元测试:
it('should do something', () => {
const queryField = fixture.debugElement.query(By.css('input[type="search"]')).nativeElement;
queryField.dispatchEvent(new ClipboardEvent('paste', {
dataType: 'text/plain',
data: '325435956\r325435956',
}));
// some stuff
})
我使用 Chrome 运行测试,但 Chrome 中的 new ClipboardEvent()
创建了 ClipboardEvent
对象,其中 clipboardData
为 null
和 event.clipboardData.getData('text/plain')
抛出错误:
Uncaught TypeError: Cannot read property 'getData' of null
在 Firefox 中不会发生这种情况,所以如果我使用 karma-firefox-launcher
它工作正常,但我必须使用 Chrome。因此,我有了一些解决方法。
第一个想法是创建 ClipboardEvent
对象并覆盖 clipboardData 属性:
const pasteEvent = new ClipboardEvent('paste', {
dataType: 'text/plain',
data: '325435956\r325435956',
});
pasteEvent.clipboardData = {
getData() {
return this.data;
}
};
但我不能这样做,因为 clipboardData
是一个只读属性。
第二个想法是创建假的 ClipboardEvent
对象:
function FakePasteEvent(options) {
this.clipboardData = {
dataType: options.dataType,
data: options.data,
getData() {
return this.data;
}
};
}
const pasteEvent = new FakePasteEvent({
dataType: 'text/plain',
data: '325435956\r325435956',
});
console.log(pasteEvent.clipboardData.getData()) // returns what I need
但是我无法将它传递给dispatchEvent
,因为pasteEvent
的类型不是Event。然后我想我可以为我的 FakePasteEvent
指定原型(prototype)对象:
Object.setPrototypeOf(pasteEvent, ClipboardEvent);
但无论如何我有一个错误:
TypeError:无法在“EventTarget”上执行“dispatchEvent”:参数 1 不是“Event”类型
你能帮我解决这个问题吗? ;)
此处的代码示例 http://jsbin.com/puqilivalo/1/edit?html,js,console,output
最佳答案
非常有趣的是,我目前正在纠结于 Chrome 和 Firefox 之间谁是正确的,我仍然无法弄清楚是什么 the specs告诉他们什么时候说
dictionary ClipboardEventInit : EventInit {
DataTransfer? clipboardData = null;
};
和
[Constructor (DOMString type, optional ClipboardEventInit eventInitDict), Exposed=Window]
interface ClipboardEvent : Event {
readonly attribute DataTransfer? clipboardData;
};
当 Chrome 为 clipboardData
属性返回 null 时,我倾向于说 Chrome 是正确的,但是下一个示例使 FF 行为正确:
Example 3
var pasteEvent = new ClipboardEvent('paste');
pasteEvent.clipboardData.items.add('My string', 'text/plain'); document.dispatchEvent(pasteEvent);
但无论如何,Chrome 确实(部分)支持 DataTransfer构造函数,而 FF 仍然没有。然后您也可以在 chrome 中使用此 DataTransfer 对象构建您的事件:
var dT = null;
try{ dT = new DataTransfer();} catch(e){}
var evt = new ClipboardEvent('paste', {clipboardData: dT});
console.log('clipboardData available: ', !!evt.clipboardData);
evt.clipboardData.setData('text/plain', 'Hello world');
document.onpaste = function(e){
console.log('onpaste: ', e.clipboardData.getData('text/plain'));
};
document.dispatchEvent(evt);
关于javascript - 为 ClipboardEvent 创建自定义 clipboardData 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47751811/
我正在尝试访问浏览器中的粘贴事件并覆盖它。但是 event.clipboardData 未定义。目前我所拥有的就是这个: function handlePaste (event) { even
我们试图让我们的用户在两个系统之间复制粘贴数据。从网页到 Electron 应用程序。 用户将点击一个按钮,我们在 copy-to-clipboard 的帮助下触发复制事件. import copy
我正在 ASP.NET WebForms 上创建 Web 应用程序,我的任务之一是将数据从网页复制/粘贴到 Excel。我/正在使用 window.clipboardData,它适用于我的用户(本地管
当用户在移动版 Safari 中粘贴图像时,我需要添加额外的行为。我使用以下代码获取 clipboardData: document.getElementById('content').addEven
我想通过 CTRL+V 从 Angular6 中的 ClipboardEvent 接收文件。但是剪贴板数据总是空的(我测试了图像和文本)。我在最新的 Chrome/Firefox 版本上对其进行了测试
我有一个 Angular2 组件,它具有从剪贴板粘贴数据的方法: inputPaste(event){ let clipboardData = event.clipboardData; ...
我看了很多帖子,但找不到以下两个问题的明确当前答案,因为标准和浏览器支持似乎一直在不断变化。 根据标准,在“复制”事件处理程序中使用 event.clipboardData.setData 更改剪贴板
我发现以下函数允许我在用户粘贴文本时获取数据。 document.addEventListener('paste', function (evt) { console.log(evt.clipbo
event.originalEvent.clipboardData.getData('Text').match(/[^\d]/)) 在上面的代码中,我不理解originalEvent和clipboar
在我的 search 中以 Javascript 方式以编程方式选择 WebView 内容,我遇到了 this Javascript code snippet ,它在窗口对象中名为 clipboard
在我的 Karma-Jasmine 测试中,我必须测试我的 onPaste 方法。 onPaste 方法: onPaste(event: any): void { const pastedText
在我们的应用程序中,我们有一个自定义粘贴函数,它调用 window.clipboardData.getData("Text") 来获取当前剪贴板数据。然后它对该数据执行一些功能。在 Edge 中,wi
这是抛出错误的代码,不知道为什么,它曾经与 Chrome 一起使用。我现在使用 Chromium,它抛出错误 Uncaught TypeError: Cannot read property 'len
我有这个 javascript 函数: function maxLengthPaste(field,maxChars) { event.returnValue=false; if((f
我想阻止在我的网站上打印屏幕。我用了但它在 chrome 和 mozilla firefox 中不起作用 $(document).keyup(function(e){ if(!e) e = w
我正在尝试在文本区域上实现最大长度。在 IE7 中,window.clipboardData.getData("Text") 返回正确的复制字符数。在 IE8 中,相同的调用返回 0。有什么问题吗?
我是一名优秀的程序员,十分优秀!