HTML 中我们需要使用 js HTML` 文档中插入内容,有两种方法,一种是 JS 创建节点,然后插入到 HTML 中;另外一种是通过 ajax 异步加载的方式,从服务器获取数据,然后用 JS 把获取的数据经过处理后插入 HTML 中。

这时一般使用 innerHTML 动态创建DOM节点树,但是需要触发绑定在上面的相关事件时,会提示失效,或者提示当前方法未定义。

js 代码和 html 代码的顺序不可更改 ,当需要的内容还没有被插入到页面时,选择器只会选择页面中已经存在的元素,所以事先没有存在元素是绑定不了事件的。

三、解决方案

我们需要把后来生成的元素绑定上事件,并注册上事件处理函数。

注意:要关注一下 this 的指向问题。

let scan = document.getElementById('scan');  // 需要动态添加数据的标签容器
if(this._data.notExpire) {
	let scanHTML = `<img src="${data.base64QrCode}" alt="" class="scan-img"><p class="scan-font">请使用<span class="scan-font-wx">微信</span>扫描二维码登录</p>`
    scan.innerHTML = scanHTML;
} else {
	let scanHTML = `<div>
						<div class="mask">
                        	<div class="sx">
                           		<p class="sx-msg">二维码已失效</p>
                                    <div class="btn-sx" id="btn-sx">刷新二维码</div>
                            <img src="${data.img}" alt="" class="scan-img">
                        <p class="scan-font">请使用<span class="scan-font-wx">微信</span>扫描二维码登录</p>
	scan.innerHTML = scanHTML;
   	// 上面这部分添加到html中以后,添加 onclick 事件无效,所以需要进行事件绑定/监听
	let _this = this; // 记得关注一下 this 指向
	document.getElementById("btn-sx").addEventListener("click", function() {
		// 具体执行代码
	} , false);

给新生成的DOM节点(动态生成节点)绑定事件方法总结

  1. jquery写法

    // on方法包含很多事件,点击,双击等等事件。
    $(选择器).on('click', function(){
    	// 事件回调函数
    
  2. js原生写法

    // 直接使用选择器进行绑定监听
    document.querySelector('选择器').addEventListener('click',function (e) {
        // 事件回调函数
    // 可以直接取id,btn是id
    btn.addEventListener('click',function (e) {
    	// 事件回调函数
    

    通过上面两种绑定事件的方法,可以轻松解决今天这个问题。

    欢迎大家留言讨论,共同进步。

    innerHTML取出一段内容后再innerHTML回去,那么原来动态绑定的事件就会丢失,如: html: 代码如下: <body><div id=’d1′>点击</div></body> script: 代码如下: document.getElementById(‘d1’).onclick=function(){alert(1)}; var html=document.body[removed]; document.body[removed]=html; 这段代码执行后点击d1是没有任何反应的。 解决方法: 把onclick绑定到父元素,利用冒泡原理,判断当前元素是否为d1,若
    复制代码代码如下: <tbody id=’22’> </tbody> 我们现在想通过innerHTML属性给tbody间加入<tr>等HTML代码,会这么做: 复制代码代码如下: <span xss=removed>document.getElementById(’22’)[removed] = ‘<tr></tr>'</span> 这样在Chrome下是OK
    症状:给某个元素的 innerHTML 设置值,如果提供的 HTML 代码包含js脚本,很多候这些脚本无效,或者在某种浏览器上有效,但在其它浏览器上无效。 原因:不同浏览器对插入 innerHTML 的脚本有不同的处理方法。经过实践,归纳如下: 对于IE,首先, script 标签必须带 defer 属性,其次,在插入刻,innerHTML 的所属节点必须在 DOM. 对于 Firefox 和Opera,在插入刻,innerHTML 的所属节点不可以在 DOM。 根据上面结论,给出通用的设置 innerHTML 方法: 代码如下: * 描述:跨浏览器的设置 in
    “clickWarnCnt”为自定义的方法,点击事件调用的方法。在使用 vue候对 innerHTML进行绑定单击事件,绑定后事件不生效。将@click修改为onclick后,方法找到了,但是参数传递不过去。报错找不到方法未定义。 最终解决方法:document.getElementById绑定onclick事件,注意如果调用方法,一定要将this赋值给that,再调用方法,具体实现代码如下:
    这两天弄js碰到一个问题.innerHTML = "" + citys + "";网页上点击标签之后onclick没有执行,后来上网查资料发现这里要用双引号,当然直接使用是不行的,加了\转义符之后解决,.innerHTML = "" + citys + "";这样就可以执行了。当然也可以加括号如下:(.innerHTML = "" + citys + "";)
    最近再写一个项目,用到了innerHTML,但是呢,发现调用innerHTML之后,onclick失效了,这也是在意料之的,因为innerHTML是以文本形式插入的button,所以无法识别onclick事件,所我们只有另找出路了,我们不能直接实现,但是可以间接实现,下面就举个例子: 例子一:该例子是无法实现的onclick的 function insCell(th)
    引言:昨天做毕业设计突然碰上onclick传动态值失效的问题,开始写的是这个语句,在管理页面可以实现没有问题。 th:onclick="'javascript:_queryPage(\''+${动态值}+'\')'" 动态值:${item.属性名} 以上方法在标签一直报错没有反应,前端查看就变成了这样了: onclick="javascript:_queryPage(1,‘属性值’)"
    使用 .bind() ,选择器匹配的元素会附加一个事件处理函数,而以后再添加的元素则不会有。为此需要再使用一次 .bind() 才行。 解决办法:每次点击添加事件加上点击删除事件 //添加期 $("#addbtn").on("click", (function() { var num = $("#palntstagecon").find("....
    今天测试突然提了这个bug,移动端onclick事件点击失效问题,网上找了好多方法,都是解决在js绑定点击事件的问题 在js绑定点击事件用click是兼容的 &lt;div id="test"&gt;click&lt;/div&gt;` &lt;script&gt; var fun = () =&gt; { console.log(Math.random()); docu...
    最近要在一个移动端页面上新增一个下拉列表,点击下拉,然后点击页面任何位置列表收回,这个功能很简单,在PC端也实现过很多次,基本思路就是在document/body上绑定click事件,触发隐藏下拉列表。 开发一切正常,在Chrome的模拟手机浏览器上测试也一切正常,但是在iOS下的Safari上测试,列表可以展开,在页面任意位置点击收回的功能却失效了。 Chrome模拟手机浏览器上一切正常,真...
    html2canvas是一个JavaScript库,可以将动态创建DOM元素转换为图片。 动态创建DOM元素是指在页面加载完成后,通过JavaScript的createElement方法或者innerHTML属性创建新的DOM元素。而html2canvas可以将这些动态创建DOM元素转换为图片。 使用html2canvas进行转换的步骤如下: 首先,在页面引入html2canvas.js文件。 然后,通过JavaScript动态创建需要转换为图片的DOM元素。 接下来,使用html2canvas库的方法,传入动态创建DOM元素作为参数,来实现转换。例如,使用html2canvas(element)方法,其element是要转换的DOM元素。 最后,html2canvas会将这个DOM元素渲染为一张图片,并返回一个Canvas元素。我们可以将这个Canvas元素插入到页面,或者将其转换为图片格式进行下载、保存等操作。 需要注意的是,由于html2canvas是基于CanvasAPI实现的,所以转换过程会受到一些限制,比如转换的DOM元素不能跨域访问,如果存在跨域图片,可能会导致转换出错。 总之,html2canvas库可以帮助我们将动态创建DOM元素转换为图片,在一些需要将页面内容保存为图片或者进行截图等场景十分有用。 ### 回答2: html2canvas是一个用于截图网页内容并将其转换为图片的JavaScript库。它可以将DOM动态创建的元素转换为图片。 使用html2canvas动态创建DOM转图片,需要按照以下步骤进行操作: 1. 引入html2canvas库。在HTML文件添加以下代码: ```html <script src="html2canvas.js"></script> 2. 在JavaScript代码创建DOM元素,并将其添加到页面。例如: ```javascript var element = document.createElement('div'); element.innerHTML = '这是动态创建DOM元素'; document.body.appendChild(element); 3. 使用html2canvas函数来截图动态创建DOM元素。例如: ```javascript html2canvas(element).then(function(canvas) { // 将canvas转换为图片 var image = canvas.toDataURL(); // 显示转换后的图片 var imgElement = document.createElement('img'); imgElement.src = image; document.body.appendChild(imgElement); 在上面的代码html2canvas函数接受一个要截图的DOM元素作为参数,并返回一个Promise对象。在Promise对象的回调函数,可以使用canvas.toDataURL方法将canvas转换为图片的Base64编码,并将其添加到页面。 通过以上步骤,就可以使用html2canvas将动态创建DOM元素转换为图片,并将其显示在页面上。 ### 回答3: html2canvas是一个JavaScript库,用于将网页内容转换为图像。它可以通过动态创建DOM元素并将其转换为图像的方式,实现网页截图的功能。 首先,我们需要引入html2canvas库,并创建一个指定大小的canvas元素,用于呈现转换后的图像。 接下来,我们可以使用JavaScript动态创建DOM元素,例如使用document.createElement()方法创建新的元素节点,并添加相应的属性和内容。 在创建完DOM元素后,我们需要将其加入到文档,使其在网页可见。可以通过document.body.appendChild()或其他适合的方法将DOM元素添加到文档。 当所有DOM元素都创建完成并添加到文档后,可以使用html2canvas库的函数将整个文档内容转换为图像。可以通过传递canvas元素的引用以及其他可选参数,调用html2canvas()函数实现转换。 最后,我们可以通过获取canvas元素的数据,生成图像并将其展示在网页上。可以使用canvas.toDataURL()方法将canvas元素转为base64编码的URL,然后将其分配给img元素的src属性即可。 总结来说,使用html2canvas库动态创建DOM并转换为图像的过程包括:引入库、创建canvas元素、动态创建DOM元素、将DOM元素添加到文档、调用html2canvas函数进行转换、获取canvas数据并展示生成的图像。这样就可以实现将动态创建DOM转换为图像的功能。
    关于嵌套使用 iFrame 出现 Refused to display in aframe 拒绝连接访问 和 ‘X-Frame-Options‘ to ‘SAMEORIGIN‘ 的解决方案【已解决】 23735
    微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】 weixin_42036461: 第五个方案帮到我了,谢谢,没想到现在开发者工具还有这个bug,真是太烂了。 Vue.js 实战系列之实现视频类WebApp的项目开发——19. 发布页面的实现(摄像头调用,视频录制等功能) m0_71037206: 大佬,为什么我默认后置摄像头是三倍焦距的 从零开始搭建一套完整的基于 React 框架的 H5 项目「下载即用、收藏不亏」 weixin_52979407: 为啥本地的build(webpack配置)无法上传到远程分支呢 在如何提高GitHub的高速访问?用它就够了——DevSidercar 2301_79807724: 这个版本的Dev-Sidecar需要从默认模式改成安全模式否则会403错误,实在不行我提供全版本Dev-Sidecar算了 记一次Android全流程开发体验经历以及Android Studio使用【从环境搭建到项目打包发布 + 真实踩坑总结】 八了个戒: 当然是安卓APP了