Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的未捕获类型错误_Javascript_Jquery_Cordova - Fatal编程技术网

javascript中的未捕获类型错误

javascript中的未捕获类型错误,javascript,jquery,cordova,Javascript,Jquery,Cordova,我正在创建第一个phonegap应用程序,因此我遵循了一个教程int,tut应该在我的logcat中抛出以下错误 未捕获的TypeError:无法在处调用未定义的方法“transaction” file:///android_asset/www/js/index.js:40 *这是我的第40行 function saveDatas(details, cb) { if(details.name == "") details.name = "[No Title]"; *dbShell.trans

我正在创建第一个phonegap应用程序,因此我遵循了一个教程int,tut应该在我的logcat中抛出以下错误

未捕获的TypeError:无法在处调用未定义的方法“transaction” file:///android_asset/www/js/index.js:40

*这是我的第40行

function saveDatas(details, cb) {
if(details.name == "") details.name = "[No Title]";
  *dbShell.transaction(function(tx) {*
    if(details.id == "")tx.executeSql("insert into nameDetail(name,age,city,occupation,date) values(?,?,?,?,?)",[details.name,details.age,details.city,details.occupation, new Date()]);
    else tx.executeSql("update nameDetail set name=?, age=?,city=?,occupation=?,date=? where id=?",[details.name,details.age,details.city,details.occupation, new Date(), details.id]);
}, dbErrHandler,cb);

}
编辑1:

var dbShell;

function phoneReady() {
dbShell = window.openDatabase("Names", 1, "Names", 1000000);
dbShell.transaction(setUpTable, dbErrHandler, getDatas);

}
完整js文件:

var dbShell;

function phoneReady() {
    dbShell = window.openDatabase("Names", 1, "Names", 1000000);
    dbShell.transaction(setUpTable, dbErrHandler, getDatas);

}

function dbErrHandler(err) {
    alert("Error : " + err.message + "\n Code" + err.code); }

function setUpTable(tx) {
    tx.executeSql("CREATE TABLE IF NOT EXISTS nameDetail(id INTEGER PRIMARY KEY,name,age,city,occupation,date)");

}

function getDatas() {
    dbShell.transaction(function(tx) {
        tx.executeSql("select name,age,city,occupation,date from nameDetail order by date desc", [], renderEntries, dbErrHandler);
    }, dbErrHandler); }

function renderEntries(tx, results) {
    if (results.rows.length == 0) {
        $("#mainContent").html("<p>Don't have any Details</p>");
    } else {
        var s = "";
        for (var i = 0; i < results.rows.length; i++) {
            s += "<li><a href='addEdit.html?id=" + results.rows.item(i).id + "'>" + results.rows.item(i).title + "</a></li>";
        }

        $("#noteTitleList").html(s);
        $("#noteTitleList").listview("refresh");
    } }

function saveDatas(details, cb) {    if(details.name == "") details.name = "[No Title]";
      dbShell.transaction(function(tx) {
        if(details.id == "")tx.executeSql("insert into nameDetail(name,age,city,occupation,date) values(?,?,?,?,?)",[details.name,details.age,details.city,details.occupation, new Date()]);
        else tx.executeSql("update nameDetail set name=?, age=?,city=?,occupation=?,date=? where id=?",[details.name,details.age,details.city,details.occupation, new Date(), details.id]);
    }, dbErrHandler,cb);
     }

function init() {
    document.addEventListener("deviceReady", phoneReady, false);
    $("#addEditForm").live("submit", function(e) {
        var data = {
            name:$("#mName").val(),
            age:$("#mAge").val(),
            city:$("#mCity").val(),
            occupation:$("#mOccupation").val(),
            id:$("#mId").val()
        };

        saveDatas(data, function() {
            $.mobile.changePage("index.html", {
                reverse: true
            });
        });
        e.preventDefault();
    });

    $("#homePage").live("homepage", function() {
        getDatas();
    });

    $("#editPage").live("pageshow", function() {
        var loc = window.location.hash;
        if (loc.indexOf("?") >= 0) {
            var qs = loc.substr(loc.indexOf("?") + 1, loc.length);
            var detailId = qs.split("=")[1];
            $("editFormSubmitButton").attr("disabled", "disabled");
            dbShell.transaction(function(tx) {
                tx.executeSql("select id,name,age,city,occupation from nameDetails where id=?", [detailId], function(tx, results) {
                    $("#mId").val(results.rows.item(0).id);
                    $("#mName").val(results.rows.item(0).name);
                    $("#mAge").val(results.rows.item(0).age);
                    $("#mCity").val(results.rows.item(0).city);
                    $("#mOccupation").val(results.rows.item(0).occupation);
                    $("#editFormSubmitButton").removeAttr("disabled");
                });
            }, dbErrHandler);
        } else {
            $("#editFormSubmitButton").removeAttr("disabled");
        }
    });

}

有人提出一些解决方案吗…

在JavaScript中,声明和定义是不同的

现在dbShell被声明

现在定义了dbShell

如果您这样做:

var dbShell;
dbShell.foo();

您将得到:UncaughtTypeError:无法调用未定义的方法“foo”

dbShell未定义。使用适当的方法定义它,错误就会消失。显然不会,否则您将不会收到此错误消息。您确定正在调用phoneReady吗?在那里抛出一个console.log命令以确保。很可能您正在试图在它被定义之前使用它。@arut那么这就是您的问题所在。未调用phoneReady方法。document.addEventListenerdeviceReady,phoneReady,false;要么没有绑定到正确的事件,要么事件没有发生,要么在绑定到它之前就发生了。我理解这一点,但在我的情况下,他们这样做了…他们有一个工作演示…拆分声明和定义会造成时间耦合问题。如果你对如何解决这些设计问题感兴趣,我建议你看看承诺。它们专门处理基于事件的依赖关系。phoneReady听起来像个事件
dbShell = "foo";
var dbShell;
dbShell.foo();