Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.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 有没有办法写得更短或更有效?_Javascript_Jquery_Jquery On - Fatal编程技术网

Javascript 有没有办法写得更短或更有效?

Javascript 有没有办法写得更短或更有效?,javascript,jquery,jquery-on,Javascript,Jquery,Jquery On,我有十段这样的代码,全部用于动态创建的内容: $(document).on('click', '.item' , function() { //... do something }); $(document).on('click', '.element' , function() { //... do something different }); 有没有办法写得更短或更高效?不幸的是,没有。这是唯一的方法,因为函数中的内容是不同的不幸的是,事实并非如此。这是唯一的方法,因为

我有十段这样的代码,全部用于动态创建的内容:

$(document).on('click', '.item' , function() {
    //... do something
});

$(document).on('click', '.element' , function() {
    //... do something different
});

有没有办法写得更短或更高效?

不幸的是,没有。这是唯一的方法,因为函数中的内容是不同的

不幸的是,事实并非如此。这是唯一的方法,因为函数中的内容不同

您可以做的一件事是在选择器和处理程序之间创建一个映射:

var handlers = {
  '.item' : function() {
    //... do something
   },

  '.element' : function() {
    //... do something different
  }
}
然后,您可以在一次快速迭代中分配处理程序:

var $doc = $(document); // no need to wrap the document each time
for (var selector in handlers) {
  if (handlers.hasOwnProperty(selector))
    $doc.on('click', selector, handlers[selector]);      
}
还有一条关于效率的评论(见@ArunPJohny的评论)。如果可以将处理程序分配给DOM树中较低的元素(离文档较远),那么应该这样做。在这种结构中:

$(static).on('click', dynamic, f);

对于到达$(静态)集合中元素的每个单击事件,将匹配动态选择器以查看是否应触发f。如果static是文档,那么页面中的所有单击都将匹配。如果你能得到一个更具体的元素,那么点击次数就会更少。对于单击,您可能不会注意到很大的差异,但触发更快的事件(mousemove)可能会给您带来麻烦。

您可以做的一件事是在选择器和处理程序之间创建一个映射:

var handlers = {
  '.item' : function() {
    //... do something
   },

  '.element' : function() {
    //... do something different
  }
}
然后,您可以在一次快速迭代中分配处理程序:

var $doc = $(document); // no need to wrap the document each time
for (var selector in handlers) {
  if (handlers.hasOwnProperty(selector))
    $doc.on('click', selector, handlers[selector]);      
}
还有一条关于效率的评论(见@ArunPJohny的评论)。如果可以将处理程序分配给DOM树中较低的元素(离文档较远),那么应该这样做。在这种结构中:

$(static).on('click', dynamic, f);

对于到达$(静态)集合中元素的每个单击事件,将匹配动态选择器以查看是否应触发f。如果static是文档,那么页面中的所有单击都将匹配。如果你能得到一个更具体的元素,那么点击次数就会更少。对于单击,您可能没有注意到很大的差异,但是触发更快的事件(mousemove)可能会给您带来麻烦。

您可以缓存文档选择器

var $document = $(document);

$document.on('click', '.item' , function() {
    //... do something
});

$document.on('click', '.element' , function() {
    //... do something different
});
但仅此而已


编辑:如果需要硬数据,请为“我的文档”贡献一个测试。

您可以缓存文档选择器

var $document = $(document);

$document.on('click', '.item' , function() {
    //... do something
});

$document.on('click', '.element' , function() {
    //... do something different
});
但仅此而已


编辑:如果您需要硬数据,请为我的数据库贡献一个测试。

我不这么认为。。。除了可能是将处理程序绑定到除文档对象之外的更具体的元素(所有目标动态元素之间共享的静态祖先元素)之外……我认为您需要开始查看主干:)因为您的问题都是关于编写高效的代码,我想一旦您通过jquery,下一步就是主干,主干将允许您在小模块中管理代码。我相信这就是你想要找到的。为什么你不在调用中链接你的
?虽然哈迪克关于“主干让你更好地管理你的代码”的说法是正确的,但这与你当前的问题无关。使用JS框架可能不会使代码运行得更快。有时,它可能会帮助您在更短的时间内编写代码。我不这么认为。。。除了可能是将处理程序绑定到除文档对象之外的更具体的元素(所有目标动态元素之间共享的静态祖先元素)之外……我认为您需要开始查看主干:)因为您的问题都是关于编写高效的代码,我想一旦您通过jquery,下一步就是主干,主干将允许您在小模块中管理代码。我相信这就是你想要找到的。为什么你不在
调用中链接你的
?虽然哈迪克关于“主干让你更好地管理你的代码”的说法是正确的,但这与你当前的问题无关。使用JS框架可能不会使代码运行得更快。有时,它可能会帮助您在更短的时间跨度内编写代码。这会降低效率,因为您在程序中引入了循环。我真诚地怀疑,在处理DOM的代码中,速度瓶颈是10个元素的循环,而不是重复的代码。如果您真的认为这段代码在任何现代浏览器上都会运行得较慢,请随意创建一个jsPerf。有一件事确实会使它运行得较慢,那就是Object.prototype的严重中毒。我也怀疑在实际情况下会发生这种情况,解决方案可能是从null继承,而不是从Object.prototype继承,我没有选择这种解决方案,因为它更为详细。我将向您介绍这一点:。你说得对,差别可以忽略不计。当我对此进行测试时,“for in”测试实际上比手动调用
.on()
的测试要快;但后来我意识到我在循环中执行函数表达式。因此,我允许“手动”测试也使用“for in”使用的预先定义的函数(请参见5和6),并且它似乎手动调用
。on()
是一种速度稍快的操作(在我的机器上)。运行了几次,每次运行的最佳解决方案各不相同。运行4次后,过滤的for in和正确的手动链接每秒都有9201次操作。正如我所说的,循环在这个上下文中并没有多大区别,在其他方面也没有多大改进(比如不为on的每次调用创建新的jQuery对象)这会带来更大的回报。这会降低效率,因为你在程序中引入了一个循环。我真诚地怀疑,在处理DOM的代码中,速度瓶颈是一个超过10个元素的循环,而不是重复的代码。如果您真的认为这段代码在任何现代浏览器上都会运行得较慢,请随意创建一个jsPerf。有一件事确实会使它运行得较慢,那就是Object.prototype的严重中毒。我也怀疑在实际情况下会发生这种情况,解决方案可能是从null继承,而不是从Object.prototype继承,我没有选择这种解决方案,因为它更为详细。我将向您介绍这一点:。你说得对,差别可以忽略不计。当我对此进行测试时,“for in”测试实际上比手动调用
.on()
的测试要快;但后来我意识到