【问题标题】:Uncaught type error in javascriptjavascript中未捕获的类型错误
【发布时间】:2013-12-03 08:11:06
【问题描述】:

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

未捕获的类型错误:无法调用未定义的方法“事务”在 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");
        }
    });

}

有人提出一些解决方案...

【问题讨论】:

  • dbShell 未定义。用适当的方法定义它,错误就会消失。
  • 显然不是,否则您将不会收到此错误消息。
  • 你确定phoneReady() 正在被调用吗?在其中输入console.log 命令以确保。
  • 您很可能在它被定义之前尝试使用它。
  • @arut then 这就是您的问题所在。没有调用 phoneReady 方法。 document.addEventListener("deviceReady", phoneReady, false); 要么没有绑定到正确的事件,要么事件没有发生,要么在你绑定之前它已经发生了。

标签: javascript jquery cordova


【解决方案1】:

在 JavaScript 中,声明定义是有区别的。

var dbShell;

现在 dbShell 已声明

dbShell = "foo";

现在 dbShell 已定义

如果你这样做:

var dbShell;
dbShell.foo();

你会得到:Uncaught TypeError: Cannot call method 'foo' of undefined

【讨论】:

  • 我理解这个,但在我的情况下,他们这样做......而且他们有一个工作演示......
  • 拆分声明和定义会产生时序耦合问题。如果您对如何解决这些设计问题感兴趣,我建议您查看 Promises。它们专门处理基于事件的依赖关系。 (phoneReady 听起来像是一个事件)
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2020-09-13
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
相关资源
最近更新 更多