Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node 解决办法

本文介绍了一种使用JavaScript动态向HTML表格的tbody元素中插入行数据的方法,并修复了使用innerHTML属性代替appendChild方法时出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想要实现动态向tbody中动态插入一行数据,写了如下代码:

html:
        <table id="theList">
        <thead>
            <th>姓名</th>
            <th>年龄</th>
            <th>性别</th>
            <th>操作</th>
        </thead>
        <tbody id="myBody"></tbody>
    </table>


js:

let list = []
let temp = []

list.push({
    name: '张三',
    age: 20,
    sex: '男'
})
list.push({
    name: '赵四',
    age: 19,
    sex: '女'
})
function render(data) {
    var html=[]
    for (let i = 0; i < data.length; i++) {
        let template = '<tr><td>'+data[i].name+'</td><td>'+data[i].age+'</td><td>'+data[i].sex+'</td><td><a href="javascript:;">修改</a>&nbsp;&nbsp;<a href="javascript:;">删除</a></td></tr>'
        html.push(template)
                                    document.getElementById('myBody').appendChild(html.join(''))
    } 
}
render(list)

运行以上代码时浏览器抛出了Uncaught TypeError: Failed to execute ‘appendChild’ on ‘Node’: parameter 1 is not of type ‘Node’.的错误,通过查阅资料了解到出错原因:

  • appendChild()需要传入的是一个tr的对象,而不是tr的字符串
    而上面html.join(”)是一个字符串
console.log(typeof html.join(''))  //stirng

解决办法:
render函数这样写:

function render(data) {
    for (let i = 0; i < data.length; i++) {
        let tr = document.createElement('tr')
        tr.innerHTML = '<td>'+data[i].name+'</td><td>'+data[i].age+'</td><td>'+data[i].sex+'</td><td><a href="javascript:;">修改</a>&nbsp;&nbsp;<a href="javascript:;">删除</a></td>'
        document.getElementById('myBody').appendChild(tr)
    } 
}

此时的tr是一个对象。不过这样显得有些多此一举,不如直接这样写:

function render(data) {
    var html=[]
    for (let i = 0; i < data.length; i++) {
        let template = '<tr><td>'+data[i].name+'</td><td>'+data[i].age+'</td><td>'+data[i].sex+'</td><td><a href="javascript:;">修改</a>&nbsp;&nbsp;<a href="javascript:;">删除</a></td></tr>'
        html.push(template)
        document.getElementById('myBody').innerHTML = html.join('')
    } 
}

运行效果图:
这里写图片描述

其他功能还在实现中…….

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <title>Camera</title> <script type="text/javascript"> navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL; function getUserMedia(constraints, success, failure) { navigator.getUserMedia(constraints, function(stream) { var videoSrc = (window.URL && window.URL.createObjectURL(stream)) || stream; success.apply(null, [videoSrc]); }, failure); } function initCamera(constraints, video, callback) { getUserMedia(constraints, function (src) { video.src = src; video.addEventListener('loadeddata', function() { var attempts = 10; function checkVideo() { if (attempts > 0) { if (video.videoWidth > 0 && video.videoHeight > 0) { console.log(video.videoWidth + "px x " + video.videoHeight + "px"); video.play(); callback(); } else { window.setTimeout(checkVideo, 100); } } else { callback('Unable to play video stream.'); } attempts--; } checkVideo(); }, false); }, function(e) { console.log(e); }); } function copyToCanvas(video, ctx) { ( function frame() { ctx.drawImage(video, 0, 0); window.requestAnimationFrame(frame); }()); } window.addEventListener('load', function() { var constraints = { video: { mandatory: { minWidth: 1280, minHeight: 720 } } }, video = document.createElement('video'), canvas = document.createElement('canvas'); document.body.appendChild(video); document.body.appendChild(canvas); initCamera(constraints, video, function() { canvas.setAttribute('width', video.videoWidth); canvas.setAttribute('height', video.videoHeight); copyToCanvas(video, canvas.getContext('2d')); }); }, false); </script> </head> <body> </body> </html>camera_example.html:14 Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': Overload resolution failed. at camera_example.html:14:62
最新发布
07-22
<think>我们正在解决一个错误:Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL' in getUserMedia stream。 这个错误通常是因为尝试使用`URL.createObjectURL()`方法时传入了一个无效的参数,或者该方法已经被废弃。 根据最新的Web标准,`URL.createObjectURL()`用于创建媒体流的URL已经被废弃,特别是在处理`MediaStream`对象时。取而代之的是,我们应该直接将媒体流赋值给video元素的`srcObject`属性。 在引用[2]的代码中,我们看到: remoteView.src = URL.createObjectURL(evt.stream); selfView.src = URL.createObjectURL(stream); 这些行应该被替换为: remoteView.srcObject = evt.stream; selfView.srcObject = stream; 原因: - 现代浏览器已经废弃了使用`createObjectURL`来为`MediaStream`创建URL的方式,因为直接使用`srcObject`属性更高效且安全。 - 使用`srcObject`可以避免内存泄漏问题(因为不需要显式地撤销URL),而且更符合标准。 修改后的代码片段如下: ```javascript // 修改前:remoteView.src = URL.createObjectURL(evt.stream); remoteView.srcObject = evt.stream; // 修改前:selfView.src = URL.createObjectURL(stream); selfView.srcObject = stream; ``` 因此,请检查你的代码中所有为video元素设置`src`属性为`createObjectURL(stream)`的地方,改为设置`srcObject`属性为stream对象。 注意:在修改后,不需要再调用`URL.revokeObjectURL()`来释放资源,因为直接使用`srcObject`不需要管理URL的生命周期。 另外,确保你的video元素已经正确声明,例如: <video id="localVideo" autoplay playsinline></video> <video id="remoteVideo" autoplay playsinline></video> 然后通过JavaScript获取这些元素: const selfView = document.getElementById('localVideo'); const remoteView = document.getElementById('remoteVideo'); 这样修改后,错误应该就会消失。 如果问题仍然存在,请检查浏览器兼容性。所有现代浏览器(Chrome, Firefox, Edge, Safari等)都支持`srcObject`属性。 参考:[MDN文档](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject) 下面我们生成相关问题:</think>### 解决 `Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL'` 错误 此错误发生在使用 `URL.createObjectURL()` 处理 `getUserMedia` 视频流时,通常是因为浏览器废弃了该 API 对 `MediaStream` 的支持。以下是完整解决方案: #### 错误原因分析 1. **API 废弃**:现代浏览器(Chrome 71+、Firefox 69+)已废弃 `createObjectURL` 对 `MediaStream` 的支持[^1] 2. **替代方案**:需改用 `<video>` 元素的 `srcObject` 属性直接绑定视频流 3. **兼容性**:所有支持 `getUserMedia` 的浏览器均支持 `srcObject` #### 解决方案(修复代码) ```javascript // 错误写法(已废弃) ❌ // videoElement.src = URL.createObjectURL(stream); // 正确写法 ✅ videoElement.srcObject = stream; ``` #### 完整示例代码 ```html <video id="cameraPreview" autoplay playsinline></video> <script> const videoElement = document.getElementById('cameraPreview'); navigator.mediaDevices.getUserMedia({ video: true }) .then(stream => { // 正确绑定视频流 videoElement.srcObject = stream; // 可选:检查兼容性 if (!('srcObject' in videoElement)) { videoElement.src = URL.createObjectURL(stream); } }) .catch(error => { console.error("摄像头访问失败:", error); }); </script> ``` #### 关键注意事项 1. **浏览器兼容处理**: ```javascript // 兼容旧版浏览器(如Safari) if (typeof videoElement.srcObject === 'undefined') { videoElement.src = URL.createObjectURL(stream); } ``` 2. **内存管理**: - 使用 `srcObject` **无需手动释放内存** - 若使用 `createObjectURL` 需在结束时调用: ```javascript URL.revokeObjectURL(videoElement.src); ``` 3. **权限要求**: - HTTPS 协议下才能访问摄像头(本地开发可用 `http://localhost`) - 首次使用需用户授权摄像头权限[^2] #### 错误排查步骤 1. 检查浏览器控制台是否有其他相关错误 2. 确认 `<video>` 元素包含 `autoplay` 属性 3. 验证是否在页面加载完成后执行代码: ```javascript window.addEventListener('DOMContentLoaded', initCamera); ``` > 此方案适用于所有主流浏览器(Chrome/Firefox/Safari/Edge)[^2] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值