db.transaction is not a function

db.transaction is not a function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html>
<head>
    <title>indexedDB</title>
</head>
<body>
    <script type="text/javascript">
        var db=window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
        var request,result,version=2,
            dbName="testDB",
            osName="os1";
        function createDB(){
            request=db.open(dbName,version);
            request.onsuccess=function(){ 
                db=request.result; 
            }
            request.onerror=function(e){ 
                console.log(e.currentTarget.errormessage);
            }
            request.onupgradeneeded=function(){
                db=request.result;
                console.log('upgradeneeded');
                if(!db.objectStoreNames.contains(osName)){ 
                    db.createObjectStore(osName,{autoIncrement:true});
                }
            }
        }
        createDB();
        //存入数据
        var data=[
        { name:'史莱姆', id:'001', hp:3 },
        { name:'小蝙蝠', id:'002', hp:5 },
        { name:'小恶魔', id:'003', hp:9 }  
        ];
        function addData(){
            var transaction=db.transaction(osName,"readwrite"),
                store=transaction.objectStore(osName);
            db.map(function(o){
                store.add(o);
            });
        }
        addData();
    </script>
</body>
</html>

不知道是哪写错了,明明和老师写的一样啊

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
woximiemie 2018-02-08 10:59:29
1
2
3
setTimeout(function(){
    addData();
        },500);

由于异步API原因,不能保证能够在addData方法调用前获取db对象(实际上获取db对象也比执行一条语句慢得多),所以用setTimeout延迟一下应该就可以解决问题了

小丸子爱吃菜 2018-01-30 17:27:26

http://img1.sycdn.imooc.com//climg/5a703a4f000190d209900360.jpg

应该是data调用map方法。

addData调用要在控制台去调用,然后去application处进行查看数据,不要再这里进行调用。

祝学习愉快!

嘘_别说话 2017-12-14 17:48:13

我建议你先跟着老师的代码写完,因为还会涉及后面的调用,写完整后,还是有问题,你到时发个全的,我拿源码给你对对。


  • 请问解决了吗?我也遇到了相同的问题,我仔细跟老师的代码比对过,没发现毛病啊。
    2018-01-29 20:12:03
  • 这个代码已经够全了,你直接在浏览器的“审查元素”里console下面调用一下就会出现这个错误。
    2018-01-29 20:13:24
  • 这个代码已经够全了,你直接在浏览器的“审查元素”里console下面调用一下就会出现这个错误。
    2018-01-29 20:13:37
嘘_别说话 2017-12-14 15:40:15

我对了一下 db.map(function(o)这写的就不一样,应该是data,你最好再跟着老师的代码对一下~

根据报错的提示,应该是db的定义有问题,这块你再好好检查下吧


  • 提问者 慕标4303546 #1
    是的,写错了,但我改成了data.map,还是有这个问题,db前面也用到了,都没问题,定义应该是没问题的。
    2017-12-14 16:14:30
  • 杰克不接客 回复 提问者 慕标4303546 #2
    db的织带对象发生变化,你console.log(db)一下,如果类型是IDBFactory则是不对的,老师的课程应该是被剪辑过的,有一个地方没有提到,我用以下代码解决了: function openDB(dbName){ if(!window.indexedDB){ window.alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available."); }else{ var request = window.indexedDB.open(dbName); request.onerror = function(){ alert("Oops, failed to open the database! I couldn't tell you the reason..."); } request.onsuccess = function(){ db = request.result; } } }
    2018-02-01 22:15:06
  • 上传代码除了调用map方法,应该是data调用map方法问题,还有不要在代码中直接运行 addData(); 吆,在控制台进行相应方法的调用,该节按照老师课程讲课,是可以正常完成效果,所说“被剪辑过的,有一个地方没有提到”具体是那一点(可以提供具体时间点),以便更好的审核,祝学习愉快。
    2018-02-02 10:17:09
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
HTML5&CSS3进阶与常用框架 2018
  • 参与学习       315    人
  • 提交作业       136    份
  • 解答问题       626    个

如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码