Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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 是否可以在常规对象(而不是DOM对象)上调度事件?_Javascript_Events_Dom_Filereader_Dispatch - Fatal编程技术网

Javascript 是否可以在常规对象(而不是DOM对象)上调度事件?

Javascript 是否可以在常规对象(而不是DOM对象)上调度事件?,javascript,events,dom,filereader,dispatch,Javascript,Events,Dom,Filereader,Dispatch,我刚刚发现FileReader发送事件就像它是DOM元素一样。它是?我想知道是否有可能创建一个类似于FileReader的对象,它没有HTML/XML结构的表示,但可以发送事件?我假设它是javascript;通常,任何可以获取DOM元素引用的对象都应该能够使用element.dispatchEvent函数分派事件;见: FileReader有类似于addEventHandler的方法,因为它是用来实现接口的EventTarget由规范定义,但实现它不需要是DOM对象window、XMLHtt

我刚刚发现FileReader发送事件就像它是DOM元素一样。它是?我想知道是否有可能创建一个类似于FileReader的对象,它没有HTML/XML结构的表示,但可以发送事件?

我假设它是javascript;通常,任何可以获取DOM元素引用的对象都应该能够使用element.dispatchEvent函数分派事件;见:


FileReader
有类似于
addEventHandler
的方法,因为它是用来实现接口的
EventTarget
由规范定义,但实现它不需要是DOM对象
window
XMLHttpRequest
FileReader
是实现
EventTarget
的其他浏览器对象模型对象

不幸的是,没有简单的方法可以借助浏览器的事件目标本机实现。。。您可以尝试通过将一个浏览器对象用作
prototype
属性来继承浏览器对象,但这通常是非常不可靠的。但是,编写代码以自己在纯JavaScript中实现所有方法并不太困难:

function CustomEventTarget() { this._init(); }

CustomEventTarget.prototype._init= function() {
    this._registrations= {};
};
CustomEventTarget.prototype._getListeners= function(type, useCapture) {
    var captype= (useCapture? '1' : '0')+type;
    if (!(captype in this._registrations))
        this._registrations[captype]= [];
    return this._registrations[captype];
};

CustomEventTarget.prototype.addEventListener= function(type, listener, useCapture) {
    var listeners= this._getListeners(type, useCapture);
    var ix= listeners.indexOf(listener);
    if (ix===-1)
        listeners.push(listener);
};

CustomEventTarget.prototype.removeEventListener= function(type, listener, useCapture) {
    var listeners= this._getListeners(type, useCapture);
    var ix= listeners.indexOf(listener);
    if (ix!==-1)
        listeners.splice(ix, 1);
};

CustomEventTarget.prototype.dispatchEvent= function(evt) {
    var listeners= this._getListeners(evt.type, false).slice();
    for (var i= 0; i<listeners.length; i++)
        listeners[i].call(this, evt);
    return !evt.defaultPrevented;
};
函数CustomEventTarget(){this.init();}
CustomEventTarget.prototype.\u init=function(){
这个。_注册={};
};
CustomEventTarget.prototype.\u getListeners=函数(类型,useCapture){
var captype=(useCapture?'1':'0')+类型;
如果(!(在本注册中键入标题))
此._注册[captype]=[];
返回此项。_注册[captype];
};
CustomEventTarget.prototype.addEventListener=函数(类型、侦听器、useCapture){
var listeners=this.\u getListeners(type,useCapture);
var ix=listeners.indexOf(listener);
如果(ix==-1)
listeners.push(listener);
};
CustomEventTarget.prototype.removeEventListener=函数(类型、侦听器、useCapture){
var listeners=this.\u getListeners(type,useCapture);
var ix=listeners.indexOf(listener);
如果(ix!=-1)
侦听器.拼接(ix,1);
};
CustomEventTarget.prototype.dispatchEvent=函数(evt){
var listeners=this.\u getListeners(evt.type,false).slice();

对于(var i=0;i),但他的代码只是一个示例。对于经过实际作战测试的实现,.

jQuery可以从常规对象调度事件


是的,来自这些页面。我的意思是FileReader似乎与任何DOM元素都没有关联,也没有对它的引用。但同时它本身有一个dispatchEvent方法,可以分派事件(我猜是DOM事件)。有点混乱,不是吗?我想知道是否有办法创建具有类似属性的对象。我手头没有FileReader的任何实现,因此这只是推测,但如果DOM元素只是作为私有方法在内部保留,FileReader的dispatchEvent只是将调用转发给dispatchEvent内部DOM元素的t,我们怎么知道?你说的内部DOM元素是什么意思?现实世界中有这样一个术语吗?还是你在猜测我想如果有任何内部DOM元素,那么FileReader就不需要转发任何东西。它本身可以是一个。哦,当然,我不知道FileReader,因为我想它是浏览器的一部分,可以以任何方式实现。我只是在想:如果你想拥有一个具有相同界面和明显行为的自定义类或者,您需要做的就是将对象的私有属性设置为DOM元素(这就是我所说的“内部”)并使用它来分派元素(除去分派事件的currentTarget属性的一些潜在问题)。我有自己的事件模型-一个将处理程序绑定到“事件类型”的函数,将它们存储在散列中,以及在继承此模型的对象(以及其他一些实用程序方法)上触发“事件”的函数.你是说默认事件模型没有我的任何有价值的好处吗?是的,好处很小,我想说你实际上无法与其他
事件的实现100%互操作,因为无法可靠地读取
预防默认
/
停止传播
/
停止即时传播调用了
。因此,唯一的好处是熟悉DOM事件接口…但它可以说是一个相当笨重的接口。我偶然发现了这个接口:,W3C建议它创建特定于应用程序的事件类型。据我所知,它还没有得到广泛支持,但似乎这就是整个事情的发展方向。是的,尽管如此目前只有Opera支持它。而且它实际上没有给你那么多,只有一个
detail
属性,它在Java等更严格的语言中很方便,但在JS中使用有限,你可以在对象上放置任意属性。Hi@bobince。本机事件处理程序和eve使用的此方法之间的区别我看到的最新实现(包括我自己的)是,本机处理程序在与调度程序不同的执行上下文中运行。而使用此方法,一个处理程序中的故障将阻止所有后续处理程序运行。这让我想到了这一点,尽管我认为建议的“混合”解决方案可能有点重量级,一般认为你会发现它很有趣。如果你不关心仿效ECMAScript API,也考虑和。
function MyClass() {
    $(this).on("MyEvent", function(event) {
        console.log(event);
    });

    $(this).trigger("MyEvent");
}

var instance = new MyClass();