javascript - 如何确保在ajax调用后触发动态插入按钮上的点击事件
问题描述
我有一个输入,可以在onfocus
和上进行 ajax 调用onblur
。该 ajax 调用返回的结果是格式化的 html,然后使用innerHTML
. 如何确保在onblur
单击事件后单击此动态插入的按钮时立即触发而不是单击两次?
这就是 HTML 的样子
<input type="text" id="c" onfocus="resetAllItems();" onblur="resetAllItems();">
<span id="readOnlySpan">
</span>
这是功能resetAllItems
:
function setInnerHTML (p_item,p_associated_div, p_return_value) {
// ... makes the ajax call and sets the result
// sets innerHTML like this
var ajaxResult = '<button type="button" class="chip">Dynamic Button</button>';
window[p_item] = ajaxResult;
if ( window && window[p_item]) {
if (p_associated_div && document.getElementById(p_associated_div))
document.getElementById(p_associated_div).innerHTML=ajaxResult;
if (p_return_value == 'true')
return ajaxResult;
}
}
var resetAllItems = function () {
setInnerHTML('p_item1', 'readOnlySpan', 'true');
}
使用事件委托附加点击事件
document.getElementById('readOnlySpan').addEventListener('click', function (e) {
if (e.target.nodeName == 'BUTTON') {
console.log('click');
}
});
我无权访问setInnerHTML
或resetAllItems
但我知道我可以重新分配它。
我已经尝试过这里提到的解决方案,但对我不起作用:document.activeelement 返回正文
我也试过这个,但只适用于链接而不是按钮:
var ref = resetAllItems;
resetAllItems = function () {
ref.apply(this,arguments);
var e = event;
if (e.type == 'blur') {
if (isNotNull(e.relatedTarget)) {
if (e.relatedTarget.nodeName == 'A' || e.relatedTarget.nodeName == 'BUTTON') {
console.log('click');
e.relatedTarget.click();
}
}
}
}
编辑:只是为了让事情更清楚。我已将问题编辑为更具体。我怀疑我必须点击按钮两次的原因onblur
是因为它没有立即获得焦点。我已经设置了这个jsFiddle来说明我的意思。
打开小提琴,专注于输入,然后尝试单击按钮。它的点击事件不会在第一次点击时触发。
任何帮助,将不胜感激。谢谢。
解决方案
我认为您可以使用该focus()
方法它看起来像这样:
document.querySelector('button').focus()
推荐阅读
- python - 我被要求在python中编写一个函数(使用年金公式的现值)
- python - AttributeError: 'NoneType' 对象没有属性 'tbody' - Spyder 3.3.1 / beautifulsoup4 / python 3.6
- arrays - 如何从 Kotlin 中的 ArrayList 中删除项目
- xml - 在 Matlab 中查找和替换 XML 文件的行
- mysql - 插入错误 system.format.exception vb.net
- chart.js - ChartJS 折线图设置背景不透明度
- python - Pandas Merge 的替代品是否适用于中等数据集?
- sql - STRING_AGG 未按预期运行
- c++ - C ++对结构向量进行排序
- angular - HttpClient 调用的奇怪行为仅在 Firefox 上