如何在加载前将参数传递到javascript文件url

How to pass a parameter to javascript file url before load?

本文关键字:javascript 文件 url 参数传递 加载      更新时间:2023-09-26

我正在使用angularjs,并希望检查参数lang=XX的url。

如果找到,我的js调用应该将语言参数替换为url中的参数:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?language=en"></script>

这可能吗?

有一种"Angular"方法,但是,我不确定它对简单的Javascript解决方案有多有用。无论如何,您都可以使用$location服务来搜索当前URL。假设您有lang作为参数,那么您将使用$location.search().lang来返回lang的值(如果存在的话)。

然后,您将创建一个服务或工厂,使用语言参数异步加载谷歌地图。您还需要提供一个回调方法。那个回调方法将是一个承诺。这是样品工厂:

app.factory('GMapsFactory', function($q, $window) {
    var _base = 'https://maps.googleapis.com/maps/api/js?language=';
    return {
        loadLocale: function(loc) {
            var _defer = $q.defer();
            var _tag = document.createElement('script');
            _tag.src = _base + loc + '&callback=gmLocaleCallback';
            $window.gmLocaleCallback = _defer.resolve;
            document.body.appendChild(_tag);
            return _defer.promise;
        }
    };
});

作为一个工厂,这是很有用的,因为它可以从应用程序移植到应用程序。然而,在单个应用程序中,它只会有用一次,因为您不会多次调用它。

然后,在您的控制器中:

app.controller('MainCtrl', function($scope, $location, GMapsFactory) {
    var lang = $location.search().lang || 'en';
    GMapsFactory.loadLocale(lang).then(function() {
        console.log(google.maps);
    });
});

除非你有理由需要使用Angular,否则简单的方法还是在你的索引中使用简单的javascript:

// From SO solution: http://stackoverflow.com/a/901144/715597
function getParameterByName(name) {
    name = name.replace(/['[]/, "''[").replace(/[']]/, "'']");
    var regex = new RegExp("[''?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/'+/g, " "));
}
var _lang = getParameterByName('lang');
document.write('<script src="https://maps.googleapis.com/maps/api/js?language='+_lang+'">'x3C/script>');

这不是一种"角度"方式,但允许您向页面添加脚本:

    var script=document.createElement('script');
    script.src='path-to-file.js';
    script.className='myscript';
    script.setAttribute('data-lang','en-US');
    document.body.appendChild(script);