将动态加载的 javascript 事件处理程序附加到动态加载的 HTML [重复]

Posted

技术标签:

【中文标题】将动态加载的 javascript 事件处理程序附加到动态加载的 HTML [重复]【英文标题】:Attach dynamically loaded javascript event handler to dynamically loaded HTML [duplicate] 【发布时间】:2017-12-09 21:02:54 【问题描述】:

我有一个通过 AJAX 加载内容的网站。我需要将 onclick 处理程序附加到一些动态加载的 div 上。如果我的事件处理程序已经在我的主 javascript 文件中定义,它工作正常(无论我通过属性 onclick="myFunc" 上的标记将它附加到更迂腐的 addEventListener 上)。

但是,我希望在 动态加载 内容的 <script> 标记中定义此事件处理程序。然后不管<script>function myHandler()</script>是在<div onclick='myHandler();'>之前还是之后都行不通。

我尝试将它附加在 XmlHttpRequest 的末尾:

contentDiv.innerhtml = xhr.responseText;
var handlerName = getItFrom(xhr.responseText); 
var clickFn = window[handlerName];
loadedDiv.addEventListener('click', clickFn);

也不起作用:handlerName 是正确的,但 clickFn 仍未定义...

我更喜欢纯 js 的答案,但如果我可以轻松翻译,jquery 也可以。

【问题讨论】:

在哪里定义了window[handlerName],又在哪里定义了loadedDiv 没有人再用这种方式编写前端代码了 :( 但是如果你必须给 分配一个 id ,然后通过将事件侦听器附加到你的 html 元素来处理加载事件......或者你可以拿起 webpack 并做出反应,让你的生活更轻松 @Kosh window[handlerName] 只是一种通过名称获取函数对象的方法。如果在可以工作的主要 javascript 中定义了 handlerName。 loadedDiv 当然是通过document.getElementById 给出的。我只是跳过了这些细节,因为它们无关紧要。 @Dmitry 是完全一样的问题:如果onload事件监听器是通过动态内容发送的,就不起作用了。 @James 谢谢!我错过了这篇文章。所以,它不起作用,期间。似乎唯一的解决方案是将脚本作为文件加载,但不能包含在 innerHTML 中。 【参考方案1】:

如果你愿意使用 jQuery,这是可行的,这里我从一个 html 字符串的脚本标签中分配一个事件处理程序。有几件事,你传递给.html的参数必须是你的字符串的一个jQuery对象,你需要在字符串中用<\/script>替换</script>(可以使用.replace)。

$('#content').html($("<span>before</span><script>$('#testo').click(function ()  alert('infunc'););<\/script><span>after</span>"));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='content'></div>
<button id='testo'>Click</button>

【讨论】:

谢谢。我相信在内部 jQuery 正在抓取脚本文本并使用 eval (?)。无论如何我不能使用这个解决方案。最后我决定做我已经做的事情:在我的主 javascript 文件中预定义所有脚本。【参考方案2】:

如果getItFrom(xhr.responseText); 返回一个在全局范围内定义的函数,请尝试像这样添加引号:

var clickFn = window['handlerName'];

因为控制台说:

var luck = function(); window[luck];
> undefined
var luck = function(); window['luck'];
> function luck()

【讨论】:

感谢您的尝试。但是 handlerName 已经是一个字符串。无论如何,如此答案所示,这是不可行的:[link]***.com/questions/4619668/… 除非从外部链接获取脚本。 你能告诉我那个字符串包含什么吗?

以上是关于将动态加载的 javascript 事件处理程序附加到动态加载的 HTML [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ADF Faces 表格应用基础案例二:动态字段+事件处理附样例工程

JavaScript学习--Item35 事件流与事件处理

JavaScript学习——事件处理程序

如何按值将变量传递给匿名javascript函数?

firefox - 无法接收动态 javascript 的事件

javascript与jquery动态绑定事件需要先加载页面注意的坑