Cordova / Phonegap ios加载脚本无法正常工作

时间:2014-05-08 15:40:00

标签: javascript android jquery ios cordova

我正在构建一个带有cordova.js库[版本3.4.1],我还希望使用Web浏览器直接将其调试为网页。

在动态加载外部cordova.js库时,iOS模拟器中存在一些问题[我有2个特定于Android和iOS的版本]

我有这段代码来处理这个问题:

//check if mobile or local browser:
var isMobile = true;
if (document.URL.indexOf("local") > 0) {
    isMobile = false;
}

var deviceReadyDeferred = $.Deferred();
var jqmReadyDeferred = $.Deferred();

function onDeviceReady () {
    deviceReadyDeferred.resolve();
}
if (isMobile) {
    $(document).bind('mobileinit', function () {
        $.mobile.allowCrossDomainPages = true;
        jqmReadyDeferred.resolve();
        var useragent = navigator.userAgent;

        var loadScript = function (url) {
            url = url.replace(/\//, '\\/');
            document.write('<script charset="utf-8" src="' + url + ' "><\/script>');
        };

        if (/Android/i.test(useragent)) {
            $.getScript('js/lib/cordova_android.js', function (data, textStatus, jqxhr) {
                document.addEventListener("deviceReady", onDeviceReady, false);
            });
        } else {
            loadScript('js/lib/cordova_ios.js');
            setTimeout(function () {
                document.addEventListener("deviceReady", onDeviceReady, false);
            }, 500);
        }
    });
} else {
    jqmReadyDeferred.resolve();
    onDeviceReady();
}

因此,当使用localhost请求页面时...然后将isMobile设置为false。 有没有理由说iOS [6.1]没有加载像Android这样的外部脚本[使用jQuery getscript]而不是可怕的黑客攻击?我尝试调试,似乎iOS在请求脚本时报告状态错误400.

遵循其他SO问题中使用的逻辑: Issue with dynamically loaded phonegap.js

更新

根据接受答案的建议,我重写了整个功能,现在它在iOS / ANDROID和本地浏览器中都运行良好:

var deviceReadyDeferred = $.Deferred();
var jqmReadyDeferred = $.Deferred();

(function () {
    //check if mobile or local browser:
    var isMobile = true;
    var useragent = navigator.userAgent;

    var cordova_js = 'cordova_';
    if (/Android/i.test(useragent)) {
        cordova_js += 'android.js'
    } else if ((/iPhone/i.test(useragent)) || (/iPad/i.test(useragent))) {
        cordova_js += 'ios.js'
    } else {
        // local browser testing
        isMobile = false;
        jqmReadyDeferred.resolve();
        onDeviceReady();
    }

    if (isMobile) {
        $(document).bind('mobileinit', function () {
            $.mobile.allowCrossDomainPages = true;
            jqmReadyDeferred.resolve();

            var url = document.URL;
            url = url.substring(0, url.lastIndexOf("/"));
            $.getScript(url + '/js/lib/' + cordova_js, function (data, textStatus, jqxhr) {
                document.addEventListener("deviceReady", onDeviceReady, false);
            });
        });
    }

    function onDeviceReady () {
        deviceReadyDeferred.resolve();
    }
})();

1 个答案:

答案 0 :(得分:0)

您的isMobile检查很容易破裂。想想这样的远程URL:

http://www.somesite.com/local/foo/bar

可能是&#34;本地&#34; iOS中的URL看起来不同。尝试在iOS中记录document.URL以检查,或者如果控制台不是选项,则可以在警报中显示它。