Javascript函数无法在外部.js文件中运行

Dav*_*ore 7 html javascript function

我正在为我的JavaScript使用外部.js文件但是我遇到了一个问题,我的HTML无法找到我的任何JavaScript函数.我知道函数有效,因为如果我将它从外部文件移动到我的html文件,它工作正常.我在Chrome上的JavaScript控制台中遇到的错误是我的函数没有定义.我也知道我的外部页面的路径是有效的,因为我有一些画布标签,可以很好地读取JavaScript.

总结一下,这有效:

HTML:

<canvas id="Canvas7"></canvas>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

window.onload = function() {
    var g=document.getElementById("Canvas7");
    var ctx=g.getContext("2d");
    var grd=ctx.createRadialGradient(75,50,5,90,60,100);
    grd.addColorStop(0,"red");
    grd.addColorStop(1,"white");
    ctx.fillStyle=grd;
    ctx.fillRect(10,10,150,80);

    // ...
};
Run Code Online (Sandbox Code Playgroud)

但是下面给出了错误"Uncaught ReferenceError:getLocation is not defined":

HTML:

<button onclick="getLocation()">Click here</button>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

window.onload = function() {
    var x=document.getElementById("location");
    function getLocation(){
        if (navigator.getlocation){
            navigator.getlocation.getCurrentPosition(showPosition,showError);
        }
        else{
            x.innerHTML="GeoLocation is not supported by this browser.";
        }
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这不是一个大问题,因为我可以将JavaScript保存在我的HTML文件中,但它占用了大量空间,我宁愿保持一切井井有条.如果有人知道如何解决这个问题,我将不胜感激.

Bri*_*汤莱恩 2

由于您在回调中定义了函数window.onloadgetLocation所以它不是全局函数,因此提供给属性的代码不知道它onclick。这就是您的浏览器返回的原因undefined。简单的解决方法是将其设为全局函数。例如:

window.getLocation = function() { ... }
Run Code Online (Sandbox Code Playgroud)

但是,在大型项目中长期需要避免要求全局定义变量和函数。

您可以通过放弃使用 HTMLonclick属性并从主代码中绑定(非全局)回调来实现此目的:

HTML:

<button id="getloc">Click here</button>
Run Code Online (Sandbox Code Playgroud)

JavaScript:

document.addEventListener("DOMContentLoaded", function() {
    var x = document.getElementById("location");

    getloc.addEventListener("click", function() {
        if (navigator.getlocation){
            navigator.getlocation.getCurrentPosition(showPosition,showError);
        }
        else{
            x.textContent = "GeoLocation is not supported by this browser.";
        }
    });
    // ...
}
Run Code Online (Sandbox Code Playgroud)