【问题标题】:Can't call functions from first included javascript file from the second included js file无法从第二个包含的 js 文件中调用第一个包含的 javascript 文件中的函数
【发布时间】:2017-04-28 05:36:02
【问题描述】:

我正在使用 Apache Cordova 制作一个 Android 应用程序。一切都可以在默认使用 Chrome 的 Android 6.0 上运行,问题出在使用默认 Android 浏览器的 Android 4.2.2 (Samsung Galaxy S4 mini) 上。

如果我没记错的话,在使用cordova编译并安装到Android操作系统后,应用程序会在默认的Android浏览器中“启动”。

在默认的 Android 浏览器中,页面加载时为空。但在 Chrome 中一切正常。

问题出在默认的 Android 4.2.2 浏览器中。它在诺基亚 1520(使用 Windows Phone 操作系统)的默认浏览器中不起作用。

index.html:

<!DOCTYPE html>
<html>
    <head>
        <script src="js/jquery-3.1.1.min.js" type="text/javascript"></script>
        <script src="2.js" type="text/javascript"></script>
        <script src="1.js" type="text/javascript"></script> 
    </head>
    <body>
        <div id="content">
        </div>
    </body>
</html>

1.js:

$(document).ready(function() {
    $('#content').html("<span>test3</span>"); // Works fine (i can see test3 on the page).
    showLogin();
});

2.js(这个文件里面没有任何东西,我在页面上看不到 test1 和 test2):

$('#content').html("<span>test1</span>");

function showLogin() {
    $('#content').html(`<span>
                        test2
                        </span>`);
}

我尝试了#1

我还尝试在setTimeout() 中调用showLogin()

setTimeout(function() {
    showLogin();
}, 1000);

我尝试了#2

1.js:

$(document).ready(function() {
    $('#content').html("<span>test3</span>"); // Works fine.
    showLogin();
});

2.js(此文件中没有任何内容):

$(document).ready(function() {
 $('#content').html("<span>test1</span>");

    function showLogin() {
        $('#content').html(`<span>
                    test2
                    </span>`);
    }
});

【问题讨论】:

  • 我觉得可以帮到你:medium.freecodecamp.com/…
  • &lt;span&gt;test3&lt;/span&gt; 是否在内容中正确添加?而加载页面时#content的可见值是多少?
  • @maxime_039 页面加载时,#content div 为空。然后我用 HTML 登录表单填写它。
  • 你不能。应该烧掉默认的安卓浏览器。
  • 其他建议:(1) 将两个代码文件的&lt;script ...&gt;&lt;/script&gt; 行移动到body 部分的底部,并从代码中删除$(document).ready,(2) 清除浏览器缓存并再次测试。

标签: javascript android jquery cordova android-browser


【解决方案1】:

所以 Android 4.2.2 库存浏览器有问题。并且调试输出不起作用。你想在这个问题上继续打多久?

这是一种解决方法:将您的文件写入多个文件并合并它们,然后再将它们推送到 .apk,这样您最终只会得到 1 个文件。缺点是您可能很难使用合并的文件进行调试。但是,正如您所说,在 Android 6.0 上它可以工作,所以用它来调试。一点 Google-fu 显示了这些选项:GruntGulp.js

其他选项是查看使用requirejs 是否有效。请参阅此post 了解更多信息。

【讨论】:

  • 我将检查 Grunt 和 Gulp.js。因为我们的文件太多,每次都要手动合并。看起来很有希望。谢谢。
【解决方案2】:

问题是由多行 JavaScript 字符串“`”的引号引起的。

在我改变这个之后:

function showLogin() {
    $('#content').html(`<span>
                        test2
                        </span>`);
}

到这里:

function showLogin() {
    $('#content').html("<span>test2</span>");
}

一切正常。

看起来这些引号在现有的 Android 浏览器中不受支持。我猜这触发了 2.js 文件中的异常,这就是 2.js 中的其他代码没有执行的原因。

我最终对多行字符串使用了反斜杠,如下所示:

function showLogin() {
        $('#content').html("<span>\
                            test2\
                            </span>");
}

反斜杠也适用于单引号内,如下所示:

function showLogin() {
        $('#content').html('<span>\
                            test2\
                            </span>');
}

【讨论】:

  • 当然!那是 ES6 语法,不会在旧浏览器中运行。您没有在问题中包含此代码。
  • @Gaafar 我知道。我的错。对不起。 :/我永远不会想到这可能会导致问题。谢谢大家的帮助。非常感谢!
  • 现在没关系。下次包括确切的代码。很高兴它已经解决了。
  • @Tadej 很高兴它已解决。但不幸的是,我想这会浪费我们大部分时间,因为问题不完整
  • 我想这不是完全浪费时间,你帮了我很多找到问题。谢谢。 Stackoverflow 也需要为 cmets 授予声誉,现在我可以投票,但你不会因此获得任何声誉。只为解答。 :(
【解决方案3】:

试试这个,你可以在 deviceready 1.JS 或你的事件触发调用上动态加载脚本:

var script = document.createElement('script');
script.src = //path of 2.JS file;
script.type = "text/javascript";
script.onload = function () {
     showLogin();//
};

【讨论】:

    【解决方案4】:

    问题出在 2.js 文件中

    $('#content').html("<span>test1</span>");
    
    function showLogin() {
        $('#content').html("<span>test2</span>");
    });
    

    在最后一行你使用了小括号来制动函数,所以它是未定义的。去掉大括号后面的小括号。 工作示例See here

    【讨论】:

    • 就像我说的那样,如果@Tadej 费心查看堆栈跟踪,他一开始就不需要问这个问题。
    • 同意@StephanBijzitter
    • 这是一个错字,但即使有这个修复,它仍然无法正常工作。
    【解决方案5】:

    也许我错了,但我认为 "$('#content').html("test1");"它的崩溃 2.js 和 showLogin 它从未调用过。

    我会尝试这样的:

    $(document).ready(function() {
        $('#content').html("<span>test1</span>");
    });
    function showLogin() {
        $('#content').html("<span>test2</span>");
    }
    

    或者至少单独使用 showlogin 功能尝试一下。

    希望对你有帮助

    【讨论】:

    • 我试过并删除了$('#content').html("&lt;span&gt;test1&lt;/span&gt;");,但还是不行。
    • 你为什么要关闭 showLogin() 函数并带有花括号和圆括号?
    • 是个错误,我真的很累。 OP的第二次尝试虽然是错误的。你不能把函数放在文档旁边。准备好@Tadej 我要纠正这个例子,请再试一次。
    猜你喜欢
    • 2015-10-07
    • 2010-10-19
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2014-05-22
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多