调用侦听器事件时,Javascript 数据不会持续存在

Posted

技术标签:

【中文标题】调用侦听器事件时,Javascript 数据不会持续存在【英文标题】:Javascript data doesn't persist when listener event is invoked 【发布时间】:2020-07-14 21:42:45 【问题描述】:

如何让 ruby​​ 数据持久保存到 javascript 调用的事件中?


我遇到了关于 javascript 变量的问题。这可能是由于我对范围和使用哪个变量缺乏了解,尽管我尝试了不同的变量类型。 (这是我的第一个实际 javascript 代码)。我在 javascript 中看到范围的方式是这样的:如果它在函数中声明,则不能在函数之外使用它。如果您首先声明它(在函数外部),您可以更新函数中的值并在外部使用它,稍后在不同的标签中使用。我做到了。

我在做什么:我正在遍历一组从 ruby​​ 模型中获得的名称,这里:

 <% @items.each do |record| %>

稍后在我的代码中,我在这个 .each 中打开另一个脚本 html 标记:

 <script> edit_items("<%=record.name%>") </script>

这个“edit_items”函数为我提供了一个包含所有记录关系名称的数组。 (这是在页面顶部声明的)

y=[];

function edit_items(x)
      y.push(x);

我遍历这些项目的原因是为每个项目创建侦听器(它们是为用户服务的,因此每个用户都会有一个动态数量)。我有一个带有 li 元素的 ul,其中包含指向模式弹出窗口的链接(html 在同一页面上)。

我想要做的是告诉 javascript 将模式中的输入 (#name_box) 的值设置为来自单击的链接的信息。虽然一个文本框有多个链接,所以我必须指定将哪个 id 发送到该框。在页面底部:

$(document).ready(function() 
    console.log("ready");

    for (id = 0; id < y.length; id++)
        console.log("starting li click events");
        $("#" + y[id]).click(function () 
           console.log("y: " + y[id]);
           console.log("doc: " + document.getElementById(y[id]));
        );
    
);

我正在为通过 ruby​​ 数组中的动态数据创建的每个链接创建事件侦听器。问题是:直到页面在客户端时才会运行单击操作。我认为您无法从客户端侦听器获取服务器端数据(ruby)。

当我单击链接时,我在 console.log 中得到了这个:

y: undefined
admin:318 doc: null
admin:317 y: undefined
admin:318 doc: null

这意味着,对我来说 y 存在,但没有设置,并且 doc 没有价值(没有找到具有未定义数据的元素)。

【问题讨论】:

y 可能在您在这里尝试使用它的上下文中不可用。你在哪里声明 edit_items 函数?因为除非它是全局声明的,你几乎肯定不想这样做,否则它将无法在 $(document).ready(function() 中使用。 @ellitt 在 html 页面的顶部声明它。 我认为您可能会以不同的方式执行此操作,而不是尝试将单击事件绑定到基于 javascript 数组的元素。因此,如果您对此持开放态度,我可以尝试写一个更详细的答案。 当然,我对想法持开放态度。我正在使用 Ruby 2.6.5 和 Rails 6.0.2 @ellitt 我明白了....:) 不要浪费你的时间,我还是会看看你要说什么,但我会在下面给出我的答案也做了。 【参考方案1】:

问题不在于数据没有从 ruby​​ 数组中持久化。问题在于 for 循环 id 没有被持久化到侦听器操作事件中。呃,这个动作将在 for 循环完成后运行。 (只是用数组的所有元素设置监听器)

将 javascript 代码编辑为:

$(document).ready(function() 
    console.log("ready");
    for (id = 0; id < y.length; id++)
        $("#" + y[id]).click(function () 
            let id = document.getElementById(this.id).id
            document.getElementById("name_box").value = id
        );
    
);

选择被点击元素的id(这意味着我是什么......在元素上下文中),将名称框的值设置为id。哇!

【讨论】:

以上是关于调用侦听器事件时,Javascript 数据不会持续存在的主要内容,如果未能解决你的问题,请参考以下文章

从 Javascript 中的事件侦听器调用访问对象的属性

为啥没有为 primefaces SelectManyCheckbox 调用事件侦听器?

Javascript事件奇怪的行为,removeEventListener无法正常工作

Video.js - 加载元数据事件永远不会触发

DOM更改时的JavaScript事件侦听器[重复]

Javascript - 加载类的所有元素时的事件侦听器