如何从另一个函数(Javascript)返回“addEventListener()”

如何从另一个函数(Javascript)返回“addEventListener()”,javascript,Javascript,我试图使我的代码更短、更优化,并希望使它看起来更清晰 到目前为止,我做到了: 功能ida{ return document.getElementByIda; } 函数cla{ return document.getElementsByClassNamea; } 功能热重分析{ return document.getElementsByTagNamea; } 函数qsa{ returndocument.querySelectora; } 功能qaa{ return document.queryS

我试图使我的代码更短、更优化,并希望使它看起来更清晰

到目前为止,我做到了:

功能ida{ return document.getElementByIda; } 函数cla{ return document.getElementsByClassNamea; } 功能热重分析{ return document.getElementsByTagNamea; } 函数qsa{ returndocument.querySelectora; } 功能qaa{ return document.querySelectorAlla;
} 只需传入元素/节点列表作为第一个参数,并将侦听器附加到它

function ev(el, e, call) {
  return el.addEventListener(e, callback);
}
作为替代方案,但不是我推荐的,您可以添加ev作为新的节点原型功能:

函数选择器{ 返回文档。查询选择器选择器选择器; } 如果Node.prototype.ev{ Node.prototype.ev=函数e,cb{ 返回此文件。添加文件列表,cb; }; } qs'按钮'。ev'点击',手柄点击; 让计数=0; 功能手柄{ console.logcount++; }
Count+=1只需传入元素/节点列表作为第一个参数,并将侦听器附加到它

function ev(el, e, call) {
  return el.addEventListener(e, callback);
}
作为替代方案,但不是我推荐的,您可以添加ev作为新的节点原型功能:

函数选择器{ 返回文档。查询选择器选择器选择器; } 如果Node.prototype.ev{ Node.prototype.ev=函数e,cb{ 返回此文件。添加文件列表,cb; }; } qs'按钮'。ev'点击',手柄点击; 让计数=0; 功能手柄{ console.logcount++; } 计数+=1ev方法中存在错误。应该是

const ev = document.addEventListener.bind(document);
因此,您可以将实际函数本身别名,而不是创建新的包装原始函数的函数

如果要使用这种方法,您应该对其他别名执行相同的操作

const qs = document.querySelector.bind(document);
const qa = document.querySelectorAll.bind(document);
我最后的建议是,根本不要使用这些方法。缩写的方法名会损害代码的可读性。就代码而言,可读性几乎总是胜过简洁性。

ev方法中存在错误。应该是

const ev = document.addEventListener.bind(document);
因此,您可以将实际函数本身别名,而不是创建新的包装原始函数的函数

如果要使用这种方法,您应该对其他别名执行相同的操作

const qs = document.querySelector.bind(document);
const qa = document.querySelectorAll.bind(document);
我最后的建议是,根本不要使用这些方法。缩写的方法名会损害代码的可读性。就代码而言,可读性几乎总是胜过简洁性。

如果您希望使用语法qsinit-scrap.evclick,someFunction,您需要将querySelector返回的对象包装到另一个具有ev函数的对象中

class jQueryLite {
  constructor(el) {
    this.el = el;
  }

  ev(e, callback) {
    this.el.addEventListener(e, callback);
    return this;
  }
}

qs(a) {
  return new jQueryLite(document.querySelector(a));
}
如果您想查找它,它被称为Fluent interface。

如果您想使用语法qsinit-scrap.evclick,someFunction,您需要将querySelector返回的对象包装到另一个具有ev函数的对象中

class jQueryLite {
  constructor(el) {
    this.el = el;
  }

  ev(e, callback) {
    this.el.addEventListener(e, callback);
    return this;
  }
}

qs(a) {
  return new jQueryLite(document.querySelector(a));
}

如果你想查看它的话,它被称为“流畅界面”。

我研究了前面的答案作为灵感,并对其进行了解读

果心 const$=选择器,base=文档=>{ 返回base.querySelectorselector; }; Node.prototype.on=函数类型,侦听器{ 返回this.addEventListenertype,listener; }; 它支持一个基本值,以防您有文档以外的其他元素,但它是可选的。 我喜欢$等等,这就是我使用的,就像jQuery一样。 像下面这样称呼它 $“按钮”。单击“按钮”,e=>{ console.loge.currentTarget; };
我把以前的答案看作是一种灵感,并创造了自己的想法

果心 const$=选择器,base=文档=>{ 返回base.querySelectorselector; }; Node.prototype.on=函数类型,侦听器{ 返回this.addEventListenertype,listener; }; 它支持一个基本值,以防您有文档以外的其他元素,但它是可选的。 我喜欢$等等,这就是我使用的,就像jQuery一样。 像下面这样称呼它 $“按钮”。单击“按钮”,e=>{ console.loge.currentTarget; };
但是我如何通过pselement将其绑定到已经获取的元素?请参见修改后的answer@NadeemAhmad。但是我如何通过pselement将其绑定到已经获取的元素?请参见修改后的answer@NadeemAhmad。如果您只是调用它们,所有这些速记都会抛出。和qa.calldocument。。。感觉有点笨重。。。用bind修复了。如果你打电话给他们,所有这些速记员都会被抛出。和qa.calldocument。。。感觉有点笨重。。。用bind修复了它。我正在努力使我的代码更短、更优化,并希望使它看起来更清晰。这是三个不同的东西,它们通常互相矛盾。短代码通常没有经过优化,也不一定清晰易读。可读代码不一定很短,也不一定经过优化。优化后的代码几乎从来都不短也不可读。我正在努力使我的代码更短、更优化,并希望使它看起来更清晰。这是三个不同的东西,它们通常相互矛盾。短代码通常没有经过优化,也不一定清晰易读。可读代码不一定很短,也不一定经过优化。而且优化后的代码几乎从不简短或可读。