使用 for 循环附加 onclick 方法

2023-12-24

我将 onclick 事件附加到我动态创建的元素中。我正在使用下面的代码,这只是重要的部分。

Test.prototype.Show= function (contents) {
    for (i = 0; i <= contents.length - 1; i++) {
         var menulink = document.createElement('a');
         menulink.href = "javascript:;";
         menulink.onclick = function () { return that.ClickContent.apply(that, [contents[i]]); };
    }
}

首先它说它是未定义的。然后我更改并添加:

var content = content[i];
menulink.onclick = function () { return that.ClickContent.apply(that, [content]); };

现在发生的情况是它总是将最后一个元素附加到所有 onclick 事件(也称为元素)。我在这里做错了什么?


这是一个经典问题。当回调被调用时,循环结束,所以值i is content.length.

使用这个例子:

Test.prototype.Show= function (contents) {
    for (var i = 0; i < contents.length; i++) { // no need to have <= and -1
         (function(i){ // creates a new variable i
           var menulink = document.createElement('a');
           menulink.href = "javascript:;";
           menulink.onclick = function () { return that.ClickContent.apply(that, [contents[i]]); };
         })(i);
    }
}

这个立即调用的函数为新变量创建一个范围i,其价值因此受到保护。

更好的是,将处理程序的代码分离到一个函数中,既是为了清晰起见,也是为了避免不必要地创建和丢弃构建器函数:

Test.prototype.Show = function (contents) {
    for (var i = 0; i <= contents.length - 1; i++) {
        var menulink = document.createElement('a');
        menulink.href = "javascript:;";
        menulink.onclick = makeHandler(i);
    }

    function makeHandler(index) {
        return function () {
            return that.ClickContent.apply(that, [contents[index]]);
        };
    }
};

如果不需要,可以完全避免此问题的方法兼容IE8 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Browser_compatibility,是引入一个范围forEach,而不是使用for loop:

Test.prototype.Show = function (contents) {
  contents.forEach(function(content) {
    var menulink = document.createElement('a');
    menulink.href = "javascript:;";
    menulink.onclick = function() {
      return that.ClickContent.call(that, content);
    };
  });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 for 循环附加 onclick 方法 的相关文章

  • 您可以将现有的 div 复制到模式对话框吗

    我有一个带有多个面板的仪表板来显示不同的信息 我希望能够添加一个按钮来以模式显示面板 我正在使用引导程序 我所能找到的只是已经编写的模态 我想复制作为面板的 div 标签的内容 然后将其显示在模型中 但我不确定如何进行 该面板的 html
  • Sonar 中的 javascript 代码覆盖率

    我是使用 Sonar 和插件进行 javascript 代码覆盖的新手 使用 Sonar 分析时 有哪些可能性可以找出 javascript 代码的质量 包括代码覆盖率 目前我正在使用 karma runner 它提供代码覆盖率报告 可以在
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • Javascript 在另一个函数中检测“Shift”键按下

    我正在从 Flash 影片 使用外部接口 调用我的 html 页面中的 Javascript 函数 并且我想知道调用该函数时用户是否按下了 Shift 键 例如 如果我通过鼠标单击调用该函数 这似乎很简单 因为我可以传递事件并检查 if e
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • Cosmos DB Mongo API 如何管理“请求率很大”情况

    我有以下代码 async function bulkInsert db collectionName documents try const cosmosResults await db collection collectionName
  • 游戏手柄 JavaScript 未能按预期更新

    我正在尝试让浏览器报告我的 XBOX 控制器的状态 然而 在第一次按下按钮后 它似乎变得 卡住 我究竟做错了什么
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • “|”是什么意思(单管道)在 JavaScript 中做什么?

    console log 0 5 0 0 console log 1 0 1 console log 1 0 1 为什么0 5 0返回零 但任何整数 包括负数 都返回输入整数 单管道 有什么作用 这是一个按位或 https developer
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方
  • 为什么 Array.prototype.filter() 在 Magnolia JavaScript 模型中抛出错误?

    我正在尝试过滤 FreeMarker 列表Magnolia JavaScript 模型 https documentation magnolia cms com display DOCS61 How to work with JavaScr
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • ReactJs 警告:不推荐使用改变“style”。考虑事先克隆它

    我收到以下警告 inWarning div was passed a style object that has previously been mutated Mutating style is deprecated Consider c

随机推荐

  • AEM 如何解析 JSON 扩展?

    在 CQ 中 如果我请求诸如localhost 4502 content geometrixx en json 我会获取 JSON 格式的节点信息 这同样适用于 XML 扩展 我的问题是 如果URL扩展名是 那么节点信息以JSON格式呈现是
  • 模板运算符重载函数上的未定义符号

    我有这个函数声明 template
  • 在调试中为 SSL 配置 launchSettings.json - ASP.NET Core / Visual Studio Code

    我正在关注this https learn microsoft com en us aspnet core security authentication social index将 Facebook 身份验证添加到我的 Web 应用程序的
  • JQuery - 更改文本中字符串的颜色,忽略
    之间的颜色

    我需要更改文本中特定子字符串的颜色 文字如下 SOME TE br XT IS HER br E 我厌倦了 replace 来自 jquery 的函数 它的问题是 正如你在上面看到的 文本被分割成这些 br 的 我怎样才能 忽略 他们呢 例
  • Angular 2 快速入门 404 GET /app/main.js

    我正在尝试 Angular 2 的快速入门 但我不知道它是否有效 我一直在寻找一些类似的问题 但没有找到答案 有人可以帮助我吗 这是我的代码 应用程序组件 ts import Component from angular2 core Com
  • Git 自动重写分支上的 git 提交消息

    有什么方法可以在分支上运行脚本来重写提交消息中包含特定子字符串的所有提交消息 说我有一个像这样的回购协议 https github com Norfeldt git history example 然后我想重写所有提交消息 在mybranc
  • 找不到模块“vuetify/lib/framework”的声明文件

    当我执行命令时npm run serve出现上述错误 2 21 Could not find a declaration file for module vuetify lib framework C Users valut source
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • Java API 找出编译类文件的 JDK 版本?

    是否有任何 Java API 可以找出编译类文件的 JDK 版本 当然 有 javap 工具可以查找主要版本 如中提到的here https stackoverflow com questions 1096148 how to check
  • Android:加速度计错误检测

    我有一个代码片段来检测加速度计的运动 有时它可以通过正确检测轻微的运动来工作 但有时当我保持设备空闲时它也会检测到运动 Android 上的内置加速度计检测是否存在问题 我使用 HTC G 1 设备 我的代码片段如下 如何解决该问题 以便我
  • 使用 Kdbg 调试汇编代码

    我有一个项目 其中包含一份 c C 源代码和一份 S 汇编源代码 编译和链接后 有没有办法使用 Kdbg 调试 S 代码 我正在从 c 文件调用一个 S 函数 但 Kdbg 中没有加载任何代码 在源中添加 file 指令 例如 file s
  • 如何使用 pyspark 对 RDD 中的值进行分组和计数以返回一个小摘要?

    一些示例数据 new data name Tom subject maths exam score 85 name Tom subject science exam score 55 name Tom subject history exa
  • 似乎无法访问 animate.css

    所以我做了 npm install animate css save 安装成功了 我可以在我的node modules我希望能够在我的 elixir phoenix react 项目中使用 animate css 我只是不确定在哪里导入 需
  • HTML/CSS div 未在页面顶部对齐

    抱歉 这个问题似乎是重复的 但他们都没有解决我的问题 所有边距 边框和内边距设置均设置为 0px 主页面div的margin left和margin right两边都设置为15px 至少我看不到任何地方我忘记将其中之一设置为 0px 由于某
  • EF Core 2.0 OwnsOne 列前缀

    使用 OwnsOne 映射复杂类型时 sql 列名称以属性名称为前缀 是否可以在映射中指定前缀名称 这是我的映射 e OwnsOne x gt x Attributes cb gt cb OwnsOne a gt a Supplier 我希
  • tostring() 被隐式调用...如何?

    在下面的代码中 如何toString 是隐式调用的 class Payload private int weight public Payload int w weight w public void setWeight int w wei
  • h2数据库的jdbc连接字符串是什么?

    我正在尝试连接到本地计算机上的 h2 数据库以创建 sql DataSource 对象 我正在运行 Windows 在定义项目 app properties 文件中的数据文件的路径时遇到一些问题 假设本地目录数据文件的路径是 D proje
  • 格式错误的数组文字 - PostgreSQL

    我想将数组从 jsonb 字段复制到 PostgreSQL 数组列 CREATE TABLE survey results id integer NOT NULL areas text raw jsonb DEFAULT jsonb INS
  • ggplot 图例中的 Unicode 字符

    我正在尝试使用 R 中的 ggplot2 绘制一些图表 并使用 unicode 字符 例如日语 标记图例 以下是我的代码 ggplot mtcars aes x mpg y wt colour geom line But I end up
  • 使用 for 循环附加 onclick 方法

    我将 onclick 事件附加到我动态创建的元素中 我正在使用下面的代码 这只是重要的部分 Test prototype Show function contents for i 0 i lt contents length 1 i var