无法在Phonegap Android中打开资产URL:file:/// android_asset / www / submit?UserName = Admin& Password = super%401234?

时间:2015-04-30 05:22:45

标签: javascript android jquery sqlite cordova

我是Phonegap和Javascript的新手。我正在尝试将用户名值和密码值从登录表单保存到sqlite数据库。

这是我的login.html文件: -

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Login</title>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
<script type="text/javascript" src="js/iscroll.js"></script>
<script type="text/javascript" src="js/login.js"></script>

</head>

<body>
<div class="wrapper">
    <form action="submit" id="login" name="login_form">
        <input type="text" id="uName" name = "UserName" placeholder="Username" value="Admin"/>
        <br/>
        <input type="password" id="password" name = "Password" placeholder="Password" value="super@1234"/>
        <br/>
        <button type="submit" id="submit" value="Submit">Login</button>
    </form>
<script type="text/javascript">
    $(document).ready(function() {
        $("#submit").click(function() {
            if($("#uName").val()==""){
                alert("Please fill username field.");
                //$("#uName").focus();
            }
            else if($("#password").val()==""){
                alert("Please fill password field.");
                //$("#password").focus();
            }
            else {
                onDeviceReady();
            }
        });
    });
</script>

</div>
</body>
</html>

这是我的login.js文件: -

var db;

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
db = window.openDatabase("UserDB", "1.0", "Login", 10000);
db.transaction(populateDB, transaction_err, populateDB_success);
}

function populateDB(tx) {

var userName = document.getElementById("uName").value;
var password = document.getElementById("password").value;

tx.executeSql('CREATE TABLE IF NOT EXISTS users (ID INT, USERNAME VARCHAR UNIQUE, PASSWORD VARCHAR)');
tx.executeSql('INSERT INTO users (ID,USERNAME,PASSWORD) VALUES ("'+1+'","'+userName+'","'+password+'")');
alert("" + userName + " " + password);
}

function transaction_err(tx, error) {
alert("Database Error: " + error);
}

function populateDB_success(tx) {
alert("Data successfully entered.");
window.open("file:///assets/www/view_login.html");
}

我的问题是,当我在我的Android设备中运行此代码时,它给了我应用程序错误:存在网络错误和 错误日志是: -

04-30 10:16:35.080  31868-31868/com.itpp.trt D/CordovaWebViewImpl onPageDidNavigate(file:///android_asset/www/submit?UserName=Admin&Password=super%401234)
04-30 10:16:35.080  31868-31934/com.itpp.trt E/AndroidProtocolHandler﹕ Unable to open asset URL: file:///android_asset/www/submit?UserName=Admin&Password=super%401234
04-30 10:16:35.090  31868-31868/com.itpp.trt D/SystemWebViewClient﹕ CordovaWebViewClient.onReceivedError: Error code=-1 Description=There was a network error. URL=file:///android_asset/www/submit?UserName=Admin&Password=super%401234

我无法找到问题在哪里请帮帮我。 谢谢,抱歉这个长期的问题。 :)

1 个答案:

答案 0 :(得分:0)

表单正在尝试将提供的数据提交到url:'file:/// android_asset / www / submit'。 该网址是通过action代码中的<form>属性提交的:

<form action="submit" id="login" name="login_form">

为了防止这种情况发生,只需从标记中取出action属性。

由于您是Phonegap / Cordova的新手,您可能不知道您不应该等待document.ready事件而是等待deviceready。现在,当您更改此内容时,您的表单提交可能不再有效。这是因为当应用程序启动并准备使用时,deviceready事件会触发一次。它不会等待按钮单击或deviceready函数内声明的函数。

我们怎样才能让它再次发挥作用?这很简单,只需在单击提交按钮时调用一个函数即可。你需要做这样的事情:

<form id="login" name="login_form" onsubmit="mySubmitFunction();">

被调用的函数应如下所示:

function mySubmitFunction(){
    $("login").unbind("submit"); //this removes the submit event-handler from the form
    if($("#uName").val()==""){
        alert("Please fill username field.");
    }
    else if($("#password").val()==""){
         alert("Please fill password field.");
    }
    else {
         //insert into your database
         db.transaction(populateDB, transaction_err, populateDB_success);
    }
}

在onDeviceReady函数内部只需打开数据库:

function onDeviceReady() {
     db = window.openDatabase("UserDB", "1.0", "Login", 10000);
}