Нужна помощь с областью Javascript - PullRequest
1 голос
/ 29 сентября 2011

Мне нужна помощь в понимании области видимости в Javascript.Я опубликовал аналогичный вопрос ранее и преждевременно пометил его как принятый.(В моем случае решение не сработало).

У меня есть javascript (a) и jQuery script (b).Мне нужно получить доступ к некоторым значениям из (a) в (b).

В (a) у меня есть:

function map_maker_js( args ) {
 var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
//rest of the code for building the map goes here

google.maps.event.addListener(map, 'tilesloaded', viewport_bounds);

function viewport_bounds() {
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();

    var maxLat = ne.lat();
    var maxLong = ne.lng();
    var minLat = sw.lat();
    var minLong = sw.lng();

    var the_maps_bounds = [maxLat, maxLong, minLat, minLong];

    //return(the_maps_bounds);

 }

}

В скрипте jQuery (b) мне нужны the_maps_bounds,который рассчитывается с помощью viewport_bounds ().Я не могу просто переместить google.maps.event.addListener(map, 'tilesloaded', viewport_bounds); в (b), потому что «карта» выходит за рамки.Это не будет работать в (b):

google.maps.event.addListener(map, 'tilesloaded',  function() {
    // This code will only execute after event `tilesloaded` happens

    var the_maps_bounds = viewport_bounds()

    // now do something with the bounds
    // ...
});

Если я переместу функцию viewport_bounds () за пределы map_maker_js, то мне придется добавить карту в качестве аргумента, который не будет работать в (б) либо.

Код, над которым я работаю, находится в плагине WordPress.Я не думаю, что это повлияет на ответ.

Я учусь, все еще изучаю JavaScript.Какой лучший способ решить эту проблему?

Спасибо


Обновление:

Спасибо Робу У за ваше предложение.Вот что я получил сейчас:

var the_maps_bounds;

function map_maker_js( args ) {
     var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
    //rest of the code for building the map goes here

    google.maps.event.addListener(map, 'tilesloaded', viewport_bounds);

    function viewport_bounds() {
        var bounds = map.getBounds();
        var ne = bounds.getNorthEast();
        var sw = bounds.getSouthWest();

        var maxLat = ne.lat();
        var maxLong = ne.lng();
        var minLat = sw.lat();
        var minLong = sw.lng();

        the_maps_bounds = [maxLat, maxLong, minLat, minLong];

        alert(the_maps_bounds); //is the the_map_bounds working

        return(the_maps_bounds);

     }

    }

В скрипте (b) я получил:

jQuery.noConflict();

jQuery(document).ready(function($) { //how jQuery scripts are written in WordPress

 alert(window.the_maps_bounds);

//rest of my functions

});

Когда я просматриваю страницу, я получаю "undefined" вокно оповещения, а затем окно оповещения с лат-лонгами.Я также попробовал предупреждение без «окна».А на событии ready:

$('#map').ready(function() {
     alert(the_maps_bounds);
 });

Я предполагаю, что the_maps_bounds в скрипте (b) не имеет значения по причине соема.Оповещение срабатывает до того, как его значение установлено в сценарии (а)?Что-то еще происходит?Есть идеи?Спасибо.

1 Ответ

1 голос
/ 29 сентября 2011

Удалите var перед вашими the_maps_bound объявлениями и используйте этот код:

var the_maps_bound;
function map_maker_js( args ) {
 var map = new google.maps.Map(document.getElementById( args['id'] ), myOptions);
//rest of the code for building the map goes
....

Таким образом, вы определяете the_maps_bound вне области действия этих функций.Если ваши функции определены в глобальной области действия (window), переменная the_maps_bound также будет доступна через window.the_maps_bound. Примечание: объявление var должно находиться в ближайшей общей родительской области , чтобы код заработал (более подробное объяснение см. Ниже).

Это хорошая практикаиспользуйте var, чтобы предотвратить утечку в глобальную область.Когда вы уже определили переменную в родительской области, пропуск var в локальной области не будет попадать в глобальную область.Вместо этого будет использоваться самая близкая переменная (то есть самая близкая область, где переменная определена).Если такой переменной нет, глобальная область будет использоваться для хранения переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...