科尔多瓦试图告诉我什么?

时间:2015-03-24 11:31:28

标签: android cordova

logcat中的Cordova错误消息:

D/chromium(24894): Unknown chromium error: 0
D/CordovaLog(24894): file:///android_asset/www/index.html: Line 2 : Uncaught TypeError: object is not a function
E/Web Console(24894): Uncaught TypeError: object is not a function at file:///android_asset/www/index.html:2

我没找到android_asset文件夹。我最好的选择是myapp-debug.apk/assets/www/index.html,但第2行应该在哪里出现问题?

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <link rel="apple-touch-icon" href="resources/icons/myApp-ico.png">
    <title>myApp</title>
    <script type="text/javascript" src="cordova.js"></script>
    <style type="text/css">
         /**
         * Example of an initial loading indicator.
         * It is recommended to keep this as minimal as possible to provide instant feedback
         * while other resources are still being loaded for the first time
         */
        html, body {
            height: 100%;
            background-color: #1985D0
        }

        #appLoadingIndicator {
            position: absolute;
            top: 50%;
            margin-top: -15px;
            text-align: center;
            width: 100%;
            height: 30px;
            -webkit-animation-name: appLoadingIndicator;
            -webkit-animation-duration: 0.5s;
            -webkit-animation-iteration-count: infinite;
            -webkit-animation-direction: linear;
        }

        #appLoadingIndicator > * {
            background-color: #FFFFFF;
            display: inline-block;
            height: 30px;
            -webkit-border-radius: 15px;
            margin: 0 5px;
            width: 30px;
            opacity: 0.8;
        }

        @-webkit-keyframes appLoadingIndicator{
            0% {
                opacity: 0.8
            }
            50% {
                opacity: 0
            }
            100% {
                opacity: 0.8
            }
        }
    </style>
    <!-- The line below must be kept intact for Sencha Command to build your application -->
    <script type="text/javascript">
/**
 * Sencha Blink - Testing
 * @author Jacky Nguyen <jacky@sencha.com>
 */
(function(global) {
    var head = global.document.head,
        Ext = global.Ext;

    if (typeof Ext == 'undefined') {
        global.Ext = Ext = {};
    }

    function write(content) {
        document.write(content);
    }

    function addMeta(name, content) {
        var meta = document.createElement('meta');

        meta.setAttribute('name', name);
        meta.setAttribute('content', content);
        head.appendChild(meta);
    }

    Ext.blink = function(options) {
        var scripts = options.js || [],
            styleSheets = options.css || [],
            i, ln, path, platform, theme;

        if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
            var msViewportStyle = document.createElement("style");
            msViewportStyle.appendChild(
                document.createTextNode(
                    "@media screen and (orientation: portrait) {" +
                        "@-ms-viewport {width: 320px !important;}" +
                    "}" +
                    "@media screen and (orientation: landscape) {" +
                        "@-ms-viewport {width: 560px !important;}" +
                    "}"
                )
            );
            document.getElementsByTagName("head")[0].appendChild(msViewportStyle);
        }
        addMeta('viewport', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no');
        addMeta('apple-mobile-web-app-capable', 'yes');
        addMeta('apple-touch-fullscreen', 'yes');

        Ext.microloaded = true;

        var filterPlatform = window.Ext.filterPlatform = function(platform) {
            var profileMatch = false,
                ua = navigator.userAgent,
                j, jln, exclude;

            platform = [].concat(platform);

            function isPhone(ua) {
                var isMobile = /Mobile(\/|\s)/.test(ua);

                // Either:
                // - iOS but not iPad
                // - Android 2
                // - Android with "Mobile" in the UA

                return /(iPhone|iPod)/.test(ua) ||
                          (!/(Silk)/.test(ua) && (/(Android)/.test(ua) && (/(Android 2)/.test(ua) || isMobile))) ||
                          (/(BlackBerry|BB)/.test(ua) && isMobile) ||
                          /(Windows Phone)/.test(ua);
            }

            function isTablet(ua) {
                return !isPhone(ua) && (/iPad/.test(ua) || /Android|Silk/.test(ua) || /(RIM Tablet OS)/.test(ua) ||
                    (/MSIE 10/.test(ua) && /; Touch/.test(ua)));
            }

            // Check if the ?platform parameter is set in the URL
            var paramsString = window.location.search.substr(1),
                paramsArray = paramsString.split("&"),
                params = {},
                testPlatform, i;

            for (i = 0; i < paramsArray.length; i++) {
                var tmpArray = paramsArray[i].split("=");
                params[tmpArray[0]] = tmpArray[1];
            }

            testPlatform = params.platform;
            if (testPlatform) {
                return platform.indexOf(testPlatform) != -1;
            }

            for (j = 0, jln = platform.length; j < jln; j++) {
                switch (platform[j]) {
                    case 'phone':
                        profileMatch = isPhone(ua);
                        break;
                    case 'tablet':
                        profileMatch = isTablet(ua);
                        break;
                    case 'desktop':
                        profileMatch = !isPhone(ua) && !isTablet(ua);
                        break;
                    case 'ios':
                        profileMatch = /(iPad|iPhone|iPod)/.test(ua);
                        break;
                    case 'android':
                        profileMatch = /(Android|Silk)/.test(ua);
                        break;
                    case 'blackberry':
                        profileMatch = /(BlackBerry|BB)/.test(ua);
                        break;
                    case 'safari':
                        profileMatch = /Safari/.test(ua) && !(/(BlackBerry|BB)/.test(ua));
                        break;
                    case 'chrome':
                        profileMatch = /Chrome/.test(ua);
                        break;
                    case 'ie10':
                        profileMatch = /MSIE 10/.test(ua);
                        break;
                    case 'windows':
                        profileMatch = /MSIE 10/.test(ua) || /Trident/.test(ua);
                        break;
                    case 'tizen':
                        profileMatch = /Tizen/.test(ua);
                        break;
                    case 'firefox':
                        profileMatch = /Firefox/.test(ua);
                }
                if (profileMatch) {
                    return true;
                }
            }
            return false;
        };

        for (i = 0,ln = styleSheets.length; i < ln; i++) {
            path = styleSheets[i];

            if (typeof path != 'string') {
                platform = path.platform;
                exclude = path.exclude;
                theme = path.theme;
                path = path.path;
            }

            if (platform) {
                if (!filterPlatform(platform) || filterPlatform(exclude)) {
                    continue;
                }
                Ext.theme = {
                    name: theme || 'Default'
                };
            }
            write('<link rel="stylesheet" href="'+path+'">');
        }

        for (i = 0,ln = scripts.length; i < ln; i++) {
            path = scripts[i];

            if (typeof path != 'string') {
                platform = path.platform;
                exclude = path.exclude;
                path = path.path;
            }

            if (platform) {
                if (!filterPlatform(platform) || filterPlatform(exclude)) {
                    continue;
                }
            }

            write('<script src="'+path+'"></'+'script>');
        }
    }

})(this);

if(document.URL.indexOf('file://')==0) {
    oldBlink = Ext.blink;
    Ext.blink = function(options) {
        document.addEventListener("deviceready", function() {
            oldBlink(options);
        }, false);
    }
}
    </script>
</head>
<body>
    <div id="appLoadingIndicator">
        <div></div>
        <div></div>
        <div></div>
    </div>
</body>
</html>

可能是“第2行”确实指的是完全不同的东西吗?如果是的话,它指的是什么?

3 个答案:

答案 0 :(得分:0)

Prettify这个丑陋的代码行再次尝试获取有用的错误消息。

<script type="text/javascript">
    (function(e) {
        var c = e.document.head,
            b = e.Ext;
        if (typeof b == "undefined") {
            e.Ext = b = {}
        }

        function d(f) {
            document.write(f)
        }

        function a(f, g) {
            var h = document.createElement("meta");
            h.setAttribute("name", f);
            h.setAttribute("content", g);
            c.appendChild(h)
        }
        b.blink = function(p) {
            var j = p.js || [],
                n = p.css || [],
                l, m, o, g, k;
            if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
                var h = document.createElement("style");
                h.appendChild(document.createTextNode("@media screen and (orientation: portrait) {@-ms-viewport {width: 320px !important;}}@media screen and (orientation: landscape) {@-ms-viewport {width: 560px !important;}}"));
                document.getElementsByTagName("head")[0].appendChild(h)
            }
            a("viewport", "width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no");
            a("apple-mobile-web-app-capable", "yes");
            a("apple-touch-fullscreen", "yes");
            b.microloaded = true;
            var f = window.Ext.filterPlatform = function(u) {
                var D = false,
                    r = navigator.userAgent,
                    w, A, s;
                u = [].concat(u);

                function z(E) {
                    var i = /Mobile(\/|\s)/.test(E);
                    return /(iPhone|iPod)/.test(E) || (!/(Silk)/.test(E) && (/(Android)/.test(E) && (/(Android 2)/.test(E) || i))) || (/(BlackBerry|BB)/.test(E) && i) || /(Windows Phone)/.test(E)
                }

                function y(i) {
                    return !z(i) && (/iPad/.test(i) || /Android|Silk/.test(i) || /(RIM Tablet OS)/.test(i) || (/MSIE 10/.test(i) && /; Touch/.test(i)))
                }
                var q = window.location.search.substr(1),
                    t = q.split("&"),
                    v = {},
                    B, x;
                for (x = 0; x < t.length; x++) {
                    var C = t[x].split("=");
                    v[C[0]] = C[1]
                }
                B = v.platform;
                if (B) {
                    return u.indexOf(B) != -1
                }
                for (w = 0, A = u.length; w < A; w++) {
                    switch (u[w]) {
                        case "phone":
                            D = z(r);
                            break;
                        case "tablet":
                            D = y(r);
                            break;
                        case "desktop":
                            D = !z(r) && !y(r);
                            break;
                        case "ios":
                            D = /(iPad|iPhone|iPod)/.test(r);
                            break;
                        case "android":
                            D = /(Android|Silk)/.test(r);
                            break;
                        case "blackberry":
                            D = /(BlackBerry|BB)/.test(r);
                            break;
                        case "safari":
                            D = /Safari/.test(r) && !(/(BlackBerry|BB)/.test(r));
                            break;
                        case "chrome":
                            D = /Chrome/.test(r);
                            break;
                        case "ie10":
                            D = /MSIE 10/.test(r);
                            break;
                        case "windows":
                            D = /MSIE 10/.test(r) || /Trident/.test(r);
                            break;
                        case "tizen":
                            D = /Tizen/.test(r);
                            break;
                        case "firefox":
                            D = /Firefox/.test(r)
                    }
                    if (D) {
                        return true
                    }
                }
                return false
            };
            for (l = 0, m = n.length; l < m; l++) {
                o = n[l];
                if (typeof o != "string") {
                    g = o.platform;
                    exclude = o.exclude;
                    k = o.theme;
                    o = o.path
                }
                if (g) {
                    if (!f(g) || f(exclude)) {
                        continue
                    }
                    b.theme = {
                        name: k || "Default"
                    }
                }
                d('<link rel="stylesheet" href="' + o + '">')
            }
            for (l = 0, m = j.length; l < m; l++) {
                o = j[l];
                if (typeof o != "string") {
                    g = o.platform;
                    exclude = o.exclude;
                    o = o.path
                }
                if (g) {
                    if (!f(g) || f(exclude)) {
                        continue
                    }
                }
                d('<script src="' + o + '"><\/script>')
            }
        }
    })(this);
    if (document.URL.indexOf("file://") == 0) {
        oldBlink = Ext.blink;
        Ext.blink = function(a) {
            document.addEventListener("deviceready", function() {
                oldBlink(a)
            }, false)
        }
    }
    Ext.blink({
        id: "8b19cfab-9dd1-44d0-892e-28f50a42aecd",
        js: [{
            path: "lzstring.js",
            update: "full",
            version: "1.0.0"
        }, {
            path: "microloader-enhancement.js",
            update: "full",
            version: "1.0.0"
        }, {
            path: "app.js",
            update: "full",
            version: "1.1.11"
        }],
        css: [{
            path: "resources/css/app.css",
            update: "full",
            theme: "Default"
        }, {
            path: "resources/css/sch.css",
            update: "full"
        }, {
            path: "resources/css/myApp.css",
            update: "full"
        }]
    });
</script>

答案 1 :(得分:0)

webview只是试图让你明白你正在尝试从对象Ext(如Ext.blink)调用函数,但是没有包含任何包含该对象的js库。

您需要在jour www文件夹中的某处复制extjs,然后添加缺少的<script type="text/javascript" src="somewhere/extjs.js"></script>行。

下次,将你的js放在一个单独的文件中,你应该得到更准确的错误信息。

答案 2 :(得分:0)

我发现错误是由使用Ext.Loader.injectScriptElement的其他javascript中的代码添加到index.html的脚本引起的,该脚本大致转换为以下JS:

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);

由于某些原因尚待确定,引用脚本中的“对象不是函数”错误会在Cordova WebView中抛出,但不会在Chrome内部抛出。一旦我找到抛出并修正它的行,就不会再抛出错误了。

由于某些其他原因尚未确定,它会被抛出为“index.html:2中的错误”,而错误也可能是“locale-de.js中的错误:72”。

不要问我是怎么发现的,这个小问题只需要整整一周的调试......