起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1638|回复: 8

[处理中2] 又报DOM Exception 18的错误,上次改了参数解决过的

[复制链接]

134

主题

417

帖子

844

积分

高级会员

Rank: 4

积分
844
QQ
发表于 2016-5-27 11:30:13 | 显示全部楼层 |阅读模式
我现在用3.3版本打包,以前出现过dom exception 18的错误,后面通过http://doc.wex5.com/wex5-app-question-list-0002/网址解决了这个错误,现在我又碰到了这个错误,一打开登录页面就报这个错,最近我就加了一个本地数据库,一进入登录页面就访问Model.prototype.userDataCustomRefresh = function(event){
                //初始化数据库
                // 标记当前刷新是异步执行的
                event.async = true;
                var self=this;
                var userData=this.comp("userData");
                //初始化数据库
                this.useroneDB.initData(function(){
                        SqliteUtil.executeSql(self.useroneDB.getDatabase(), "select * from USERONE",  null,function (res) {
                                var table = SqliteUtil.rowsToTreeTable(res.rows, "userid", "password");
                                if(table.rows.length!='0'){
                        $(username).val(table.rows[table.rows.length-1].username);
                        $(password).val(table.rows[table.rows.length-1].userid);
                                }
                        });
                });
        };这个方法,是不是这里出问题了,这个方法我再浏览器和Android手机上测试是没有问题的,谁能帮忙解决一下???谢谢

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2016-5-27 13:06:18 | 显示全部楼层
此处报的dom exception 18错误, 应该和
//初始化数据库
                this.useroneDB.initData(function(){
                        SqliteUtil.executeSql(self.useroneDB.getDatabase(), "select * from USERONE",  null,function (res) {
                                var table = SqliteUtil.rowsToTreeTable(res.rows, "userid", "password");
                                if(table.rows.length!='0'){
                        $(username).val(table.rows[table.rows.length-1].username);
                        $(password).val(table.rows[table.rows.length-1].userid);
                                }
                        });
                });
这段代码有关, 请楼主根据你使用的"本地数据库", 及相关api或类库, 到网上找找dom exception 18的问题及解决方案(如果使用的是通用的本地数据库的话, 应该是一个常见的问题)
回复 支持 反对

使用道具 举报

134

主题

417

帖子

844

积分

高级会员

Rank: 4

积分
844
QQ
 楼主| 发表于 2016-5-27 14:05:27 | 显示全部楼层
hecr 发表于 2016-5-27 13:06
此处报的dom exception 18错误, 应该和
//初始化数据库
                this.useroneDB.initData(functio ...

那请问您看这段代码哪里有问题呢?我这只是在原基础上向页面加了两条数据而已userid和password? var table = SqliteUtil.rowsToTreeTable(res.rows, "userid", "password");
                                if(table.rows.length!='0'){
                        $(username).val(table.rows[table.rows.length-1].username);
                        $(password).val(table.rows[table.rows.length-1].userid);其他都是从官网例子拷过来的
回复 支持 反对

使用道具 举报

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2016-5-27 15:19:39 | 显示全部楼层
那就用二分法, 看看是哪句话导致出问题了
回复 支持 反对

使用道具 举报

134

主题

417

帖子

844

积分

高级会员

Rank: 4

积分
844
QQ
 楼主| 发表于 2016-5-27 16:39:58 | 显示全部楼层
hecr 发表于 2016-5-27 15:19
那就用二分法, 看看是哪句话导致出问题了

我刚仔细检查过了,var Model = function() {
                this.callParent();
                this.useroneDB = UseroneDB.getInstance();
        };是在model里面写的this.useroneDB = UseroneDB.getInstance();语句导致报错了,怎么解决呢??
回复 支持 反对

使用道具 举报

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2016-5-27 17:27:43 | 显示全部楼层
this.useroneDB = UseroneDB.getInstance();
这个代码是平台别的案例中抄过来的?
如果是的话, 看看平台那个案例运行是否正常?

如果不是的话, 那就看看那个UseroneDB的具体实现, 使用到的哪种本地存储api, 之后到网上找找跟dom exception 18的错误
之前印象中:dom exception 18在使用本地存储时或cookie的某些场景会出问题, 具体你需要根据你使用的技术找解决方案
回复 支持 反对

使用道具 举报

134

主题

417

帖子

844

积分

高级会员

Rank: 4

积分
844
QQ
 楼主| 发表于 2016-5-27 17:31:20 | 显示全部楼层
hecr 发表于 2016-5-27 17:27
this.useroneDB = UseroneDB.getInstance();
这个代码是平台别的案例中抄过来的?
如果是的话, 看看平台 ...

我直接用的是官网demoDB.js文件,我在报错页面直接调用了那个方法,Android手机使用是没有问题的,现在苹果手机使用报错了,我也不知道使用哪种存储方式啊,反正跟官网一样的,其他的我也不清楚,你们这边维护的能帮助我解决一下这个问题吗??
回复 支持 反对

使用道具 举报

134

主题

417

帖子

844

积分

高级会员

Rank: 4

积分
844
QQ
 楼主| 发表于 2016-5-27 17:33:12 | 显示全部楼层
hecr 发表于 2016-5-27 17:27
this.useroneDB = UseroneDB.getInstance();
这个代码是平台别的案例中抄过来的?
如果是的话, 看看平台 ...

define(function(require) {
        var $ = require("jquery");
        var justep = require("$UI/system/lib/justep");
        var SqliteUtil = require("$UI/HouQinApp/sqlite/sqliteUtil");

        var _instance = null;

        var UseroneDB = function() {
//                在调试场景下,这里可以选择用HTML5的Web SQL Database,在Chrome浏览器远程调试时可以直接看到数据库内容
                this.database = window.openDatabase("X5_USERONE_DB", null, null, -1);
//                this.database = window.sqlitePlugin.openDatabase({name : "X5_USERONE_DB"});
               
                /*
                this.database.transaction(function(tx) {
                        tx.executeSql("drop table demo_test");
                        tx.executeSql("drop table demo_region");
                });
                */
        };

        /**
         * 这里构建单例,为了让多个页面共用同一个数据连接,避免死锁
         */
        UseroneDB.getInstance = function() {
                if (!_instance) {
                        _instance = new UseroneDB();
                }
                return _instance;
        };

        /**
         * 获取数据库链接
         */
        UseroneDB.prototype.getDatabase = function() {
                return this.database;
        };

        /**
         * 这里给出一个自动判断并初始化数据库的方案
         */
        UseroneDB.prototype.initData = function(onSuccess) {
                var db = this.getDatabase();
                // 检查表是否已存在
                var sqlCheckExists =  "SELECT count(*) AS cnt FROM sqlite_master WHERE type = 'table' AND UPPER(name) in ('USERONE','USERTYPE') ";
                SqliteUtil.executeSql(db, sqlCheckExists, null, function(res) {
                        if (res.rows.item(0).cnt < 1) {
                                 // 如果不存在则获取初始化脚本
                                require(["text!$UI/HouQinApp/sqlite/useroneDB.sql"], function(data) {
                                        executeSqlFile(data);
                                });
                        } else {
                                doSuccess();
                        }
                });
                // 执行初始化脚本
                function executeSqlFile(content) {
                        var sqls = content.split(";");
                        SqliteUtil.executeBatch(db, sqls, null, function() {
                                doSuccess();
                        });
                }
                function doSuccess() {
                        if ($.isFunction(onSuccess)) {
                                onSuccess.call(this);
                        }
                }
        };

        return UseroneDB;
});
这是useroneDB.js文件,
报错页面调用的方法是        var Model = function() {
                this.callParent();
                this.useroneDB = UseroneDB.getInstance();
        };

一到this.useroneDB = UseroneDB.getInstance();就报错
回复 支持 反对

使用道具 举报

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2016-5-27 17:42:48 | 显示全部楼层
应该是执行
this.database = window.openDatabase("X5_USERONE_DB", null, null, -1);
这句出错了, 你先这么测试:
1. 在ios的safari浏览器中, 访问这个功能, 看看是否也出错
2. 如果也出错, 那在网上找找window.openDatabase dom exception 18, 这应该是ios上的通用问题, 看看网上别人是怎么解决的

dom exception 18在ios上的问题本质是:ios对页面使用的内存有限制, 当超出它的范围时, 就会报这个错误.
所以, 你可以从这个角度看看你的程序

比如参考:https://issues.apache.org/jira/browse/CB-2823
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-3 15:20 , Processed in 0.072523 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表