Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将javascript事件处理程序附加到在javascript中创建的这些元素

如何将javascript事件处理程序附加到在javascript中创建的这些元素
EN

Stack Overflow用户
提问于 2014-10-26 13:16:27
回答 1查看 175关注 0票数 1

背景

从长远来看,我并不是最炙手可热的jQuery人,我试图去掉下面代码中重复的工作。虽然性能开销可能很小,而且可以忽略不计--但这更像是不想编写糟糕的代码,并多次执行相同的操作。

基本上,我有一个简单的发票表格,用户也可以添加多个项目。

该表单最初有4个输入:项目名称、项目价格、项目数量和总数。

  • 每当“价格”或“数量”字段触发更改事件时,就计算总数。

问题-部分解决(见更新)

用户可以为第二行(或第三行、第四行、第五行等)添加额外的输入行。项目

  • 将事件处理程序附加到pricequantity字段的现有javascript已经运行,因此不会将侦听器附加到新添加的输入行。

解决办法?

目前,我已经散列了一些可怕的东西,在添加了新的输入行之后,我重新将一个事件侦听器附加到所有输入字段。

这很酷--我想,如果您对工作的质量并不感到骄傲,但是如果发票是20项,那么我确实需要在已附加监听器的19行上添加第20项行循环,然后再将它们附加到新行。我希望不会。

我已经成功地锁定了新添加的输入行,以便从克隆的输入中删除值--所以我想只针对新的输入字段并附加侦听器--但是我得到了正确的2和8,因为理想情况下,我希望这样做

  1. 克隆输入行
  2. 清除值
  3. 附加听者
  4. 添加到DOM中

我现在所做的让人觉得奇怪的是

  1. 克隆行
  2. 将行添加到DOM中
  3. 选择新添加的行并擦除值
  4. 选择新添加的Quantity字段并附加侦听器
  5. 选择新添加的Price字段并附加侦听器
  6. 选择新添加的“总计”字段并附加侦听器(以更新发票总数)

下面的代码,让你嘲笑,然后希望同情我,并提供一个更简洁的解决方案,或至少就如何编写我自己更好的版本提出建议。

代码语言:javascript
运行
AI代码解释
复制
/** Add additional item lines */
$('#add-item').click(function(e){
    e.preventDefault();
    /** clone first line and insert it */
    $('.input-row:first').clone().insertAfter('.input-row:last');
    /** clear the newly inserted inputs of values */
    $(':input', '.input-row:last').val("");
    /** ensure all item price and qty inputs have events attached to their change value */
    $('input[name="item_qty[]"],input[name="item_price[]"]').on("change",function () {
        var $container = $(this).closest('.form-group');
        qty = Number($('input[name="item_qty[]"]',$container).val())||0,
        price = Number($('input[name="item_price[]"]',$container).val())||0;
        $('input[name="item_total[]"]',$container).val(qty * price);
        $('input[name="item_total[]"]',$container).change();
    });
    /** Sum inputs for invoice total */
    $('input[name="item_total[]"').change(function() {
        var total = 0;
        $.each($("[name='item_total[]']"), function(index, value) {
            total += parseFloat($(this).val());
        });
        $("#total").val(total);
    });
});

更新

因此,通过使用事件委托,事件传播(或气泡)在这个领域-谢谢各位!我已经在新父div变更中的任何时候重新计算发票总数

代码语言:javascript
运行
AI代码解释
复制
<div id="invoice-items">
    <input name /> <input quantity /> <input price /> <input total />
    <input name /> <input quantity /> <input price /> <input total />
    <input name /> <input quantity /> <input price /> <input total />
    ...
</div>

/** if any input rows change update the invoice total */
$('#invoice-items').on('change', 'input', function(event){
    var total = 0;
    $.each($("[name='item_total[]']"), function(index, value) {
        total += parseFloat($(this).val());
    });
    $("#total").val(total);
});

剩下的问题是..。

我仍然停留在如何更新<input total />以反映对该特定行的更改上。我猜,在我的新jQuery片段中的某个地方,我需要确定哪个字段更改了,并更新了同一行的总计?

这就是我当前如何将更改侦听器附加到第一行/现有的输入行,以填充行总数

代码语言:javascript
运行
AI代码解释
复制
/** calculate item total */
  $('input[name="item_qty[]"],input[name="item_price[]"]').on("change", function () {
    var $container = $(this).closest('.form-group');
    qty = Number($('input[name="item_qty[]"]',$container).val())||0,
    price = Number($('input[name="item_price[]"]',$container).val())||0;

    $('input[name="item_total[]"]',$container).val(qty * price);
    $('input[name="item_total[]"]',$container).change();
  });

我想我仍然需要一些方法来在添加了一行之后运行这段代码,或者遵循更干净的事件委派路线--某种方式只针对发生更改事件的行的item_total[]?也许我可以捕获触发变更事件的元素的特定索引,并且只更新索引处的item_total[]

只要在这里大声思考,我想如果我捕获事件并循环所有输入,直到找到与事件激发的元素相匹配的元素,我就可以获取下一个名为invoice_total[]的表单输入并更新它?-让我们检查一下。

更新

这样我就能捕捉到那些快乐的日子:)

代码语言:javascript
运行
AI代码解释
复制
event.currentTarget.attributes.name.nodeValue == 'item_qty[]'

因此,我仍然不知道我更新了哪些item_qty[]元素,因此我也不知道要更新哪个item_total[]元素。

伙计们,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-26 13:20:19

您想要使用包装元素

代码语言:javascript
运行
AI代码解释
复制
<div>
    <input />
    <input />
</div>

$('div').on('change', 'input', function(){
    // your magic here
});

这将适用于两个现在在那里的人,以及新的元素。为什么?简单地说:

将事件绑定到存在的元素。您可以创建一个新元素,更改它,但永远不要将事件绑定到新元素。这件事从树上冒出来,什么也抓不到。

我的代码绑定到元素本身,您告诉它在input上侦听其中的更改。新的元素进来了,你改变了它们,什么也没有发生,所以它在树上冒出气泡。

这是一个很大的区别:这一次我们让现有的元素现在就做些什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26578057

复制
相关文章
在SharePoint环境下,dll资源脚本权限问题
          最近在用Ext.NET,因为是在SharePoint环境下使用,一直被这样一个问题所困扰着:在使用Ext.NET时,页面必须使用拥有管理权限的用户刷新一次(只要刷新其中任意Ext.NET页面),其他用户才能显示界面。查看网页源代码,发现Extjs的脚本文件和CSS文件并没有注册。而Extjs的脚本文件和css文件是作为资源嵌套在Ext.NET的dll中的。由此想到,应该是用户权限问题,导致Ext.NET的ResourceManager1控件无法注册脚本。
雪雁-心莱科技
2018/12/27
5300
cssjshtml jquery向动态生成的元素添加事件
delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。
葫芦
2019/04/17
3.2K0
如何向图形添加曲形文本
R语言数据分析指南
2023/08/18
3360
如何向图形添加曲形文本
如何向数组里添加元素
一般数组是不能添加元素的,因为数组在初始化时就已定好长度了,不能改变长度,我们如何做到向其中添加元素。
算法与编程之美
2023/01/03
3.7K0
dll生成和使用
dll文件的编译生成 创建项目Win32控制台应用程序 创建项目1.png 创建项目2.png 配置属性 项目/属性 配置属性.png
用户2929716
2018/08/23
1.2K0
dll生成和使用
java如何向数组里添加元素
1、一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。 但有个可以改变大小的数组为ArrayList,即可以定义一个ArrayList数组,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素;例子如下:
全栈程序员站长
2022/06/27
20.7K0
java如何向数组中添加元素[数组的添加]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java如何向数组中添加元素[数组的添加],希望能够帮助大家进步!!!
Java架构师必看
2022/04/06
7.9K0
C#如何加载嵌入到资源的非托管dll
我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现吧,首先我们准备好demo,新增控制台项目如下:
ryzenWzd
2021/05/17
1.1K0
C#如何加载嵌入到资源的非托管dll
如何向已有的项目中添加C/C++代码?
  我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码:
故乡的樱花开了
2023/10/22
3700
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
5780
向邮件添加附件
可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart或%Net.MailMessage的实例)。要执行此操作,请使用以下方法:
用户7741497
2022/06/09
2.2K0
嵌入式音视频开发过程中如何控制码率?
在音视频领域,码率控制模式有着举足轻重的地位。那什么是码率控制?码率控制是指通过调节图像的压缩比例,从而决定输出编码码率的过程。
用户6280468
2023/08/31
3390
嵌入式音视频开发过程中如何控制码率?
在Windows中劫持DLL
DLL劫持是一种用于执行恶意有效负载的流行技术,这篇文章列出了将近300个可执行文件,它们容易受到Windows 10(1909)上相对路径DLL劫持的攻击,并展示了如何使用几行VBScript绕过UAC可以以提升的特权执行某些DLL劫持。
Al1ex
2021/07/21
2.2K0
在Windows中劫持DLL
一款针对DLL劫持的恶意DLL生成器
EvilDLL是一款专门针对DLL劫持攻击而开发并设计的恶意DLL(反向Shell)生成器。
FB客服
2020/08/07
2.1K0
一款针对DLL劫持的恶意DLL生成器
如何使用 Bootstrap class 向按钮添加下拉菜单
如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单,只需要简单地在一个 .btn-group 容器中放置按钮和下拉菜单即可。您也可以使用 <span class="caret"></span> 来指示按钮作为下拉菜单。
好派笔记
2021/09/18
5.7K0
Java如何调用dll
-----------------------------前置条件-------------------------------------
烂猪皮
2018/08/03
2.5K0
Java如何调用dll
X86逆向13:向程序中插入Dll
本章我们将学习Dll的注入技巧,我们将把一个动态链接库永久的插入到目标程序中,让程序在运行后直接执行这个Dll文件,这一章的内容也可以看作是第八课的加强篇,第八课中我们向程序中插入了一个弹窗,有木有发现一个问题?单单是一个弹窗我们就需要经历这么多的步骤,那如果你要调用几十个API函数估计早就疯透了,这里我们其实可以直接编写一些能够完成特殊功能的Dll文件,然后让程序通过LoadLibraryA函数动态的加载执行,LoadLibrary这个函数是在Kernel32.dll这个库中保存的,庆幸的是这个动态链接库99%的程序都必须加载,这就为我们动态加载Dll提供了有效的支持。
王瑞MVP
2022/12/28
4170
X86逆向13:向程序中插入Dll
java卸载dll,如何在java中卸载Dll?[通俗易懂]
I have written a Java agent in Lotus Notes 8.5 to reset token’s PIN using
全栈程序员站长
2022/08/30
2K0
OpenCV300 CMake生成project在项目过程中的问题
2015年6一个月4日本。OpenCV官网上面给出了最新版本号OpenCV。这是:3.0.0版本号,http://opencv.org/
全栈程序员站长
2022/07/06
5430
OpenCV300 CMake生成project在项目过程中的问题
点击加载更多

相似问题

嵌入式dll资源

30

查找嵌入式DLL资源

24

如何将源文件(.cs)添加为生成的DLL的嵌入式资源

119

向Kubernetes添加嵌入式设备作为资源

10

是否可以在.NET DLL中添加/删除/更改嵌入式资源?

381
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档