объекты JavaScript не могут видеть друг друга? :: расширение Google Chrome - PullRequest
3 голосов
/ 29 сентября 2010

у меня есть два файла

один называется stats.js

один называется storage.html

в stats.js содержит

var stats = {
  myFunc : function() {
    //do something
  }
}

в storage.html У меня есть

<html>
<head>
<script src="stats.js"></script>
<script>
$(document).ready(function() {
   stats.myFunc(); 
});
</script>
</head>
</html>

Но я получаю

Uncaught TypeError: Невозможно вызвать метод 'myFunc' из неопределенного

<ч /> Обновление
Итак, это был действительно упрощенный пример.

Основы этого,

Это расширение Google Chrome, поэтому вы увидите код, соответствующий этому.

Вот соответствующие буквальные страницы:

Popup.html

<html>
    <head>
        <title>Extension</title>
        <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
        <script src="js/popup.js"></script>
        <script src="js/statsapi.js"></script>
        <link type="text/css" rel="stylesheet" href="css/popup.css" />
    </head>
    <body>
        <div id="content">
        </div>
    </body>
</html>

popup.js

$(document).ready(function() {
    if(background.storage.get('firstRun') == null)
        background.initialize();

    if(background.storage.get('metaExpire') >= Date.parse(Date()))
        background.updateMeta();

    $('#content').append(read_object(stats.getMetaData()));
});

function read_object(object){
    var $obj = $('<div />');
    for(var o in object) {
        $obj.append(o+' : ');
        if(typeof(object[o]) == 'object' && object[o] != null)
            $obj.append(read_object(object[o]));
        else
            $obj.append(object[o]+'<br />');
    }
    return $obj;
}

manifest.json

{
  "name": "Halo Reach: Stats",
  "description": "This extension allows you to keep track of your own, and your friends Halo Reach Stats.",
  "version": "1.0.0.1",
  "permissions": [
    "http://www.bungie.net/"
  ],
  "icons": { 
      "128": "images/logo/logo128.jpg",
      "64": "images/logo/logo64.jpg",
      "32": "images/logo/logo32.jpg",
      "16": "images/logo/logo16.jpg"
  },
  "browser_action": {
    "default_title": "Open Stats",
    "default_icon": "images/logo/logo32.jpg",
    "popup": "popup.html"
  },
  "background_page": "background.html"
}

statsapi.js

var background  = chrome.extension.getBackgroundPage();
var apikey      = background.storage.get('apikey');
var gamertage   = background.storage.get('gamertag');
var page        = '0';

var stats = {
    getMetaData : function() {
        var url = 'http://www.bungie.net/api/reach/reachapijson.svc/game/metadata/'+apikey;
        console.log(url);
        $.ajax({
            url: url,
            success: function(data) {
                return data;
            }
        });
    },

    meta : {
        read : function(param) {
            var meta = background.storage.get('metaData');
        }
    }
};

Background.html

<html>
    <head>
        <script src="js/statsapi.js"></script>
        <script>
            var storage = {
                set : function (key, value) {
                    window.localStorage.removeItem(key);
                    window.localStorage.setItem(key, value);
                },            
                get : function (key) {
                    return window.localStorage.getItem(key);
                },            
                clear : function () {
                    window.localStorage.clear();
                }
            };

            function updateMeta() {
                var meta = stats.getMetaData();
                if(meta['status'] == 0){
                    storage.set('metaData', JSON.stringify(meta));
                    storage.set('metaExpire', Date.parse(Date())+900000);
                }
            }

            function initialize() {
                storage.set('apikey', '***');
                storage.set('gamertag', 'The Hailwood');
                updateMeta();
            }
        </script>
    </head>
</html>

Когда вызывается расширение, оно вызывает popup.html

и javascript готов к документу.

Проверка на первый запуск не удалась,

поэтому он вызывает initialize() в background.html

Но именно здесь возникает ошибка.

фактическая ошибка

Uncaught TypeError: Невозможно вызвать метод 'getMetaData' с неопределенным значением.

Так почему же он не видит класс статистики?

Это не проблема включения скрипта, как если бы путь к statsapi.js был неправильным. Я получаю

Uncaught ReferenceError: статистика не определена.

Проблема, похоже, связана с var stats {}, как будто под этим у меня есть функция с именем test (), которую я могу вызвать так:

Хм,

есть ли проблема, потому что это внешняя таблица стилей?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

Это потому, что в вашем коде есть синтаксическая ошибка.У меня была такая же проблема.Я открыл свою страницу background.html в fire fox с включенным плагином fire-bug.Fire-bug консоль должна мне исправить ошибку, я исправил ее и теперь она работает.

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

Я подозреваю, что ошибка лежит где-то еще - вот мои примеры:

mark@localhost:~/ccsite$ cat cat.js 
var stats = {
  myFunc : function() {
    alert('wtf');
  }
}


mark@localhost:~/ccsite$ cat hat.htm 
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script src="cat.js"></script>
<script>
$(document).ready(function() {
   stats.myFunc(); 
});
</script>
</head>
</html>

Просмотр hat.htm в FF, IE6 или Chrome выдает предупреждение «wtf».Как написано, вы получите $ undefined, так как он, конечно, не включает jQuery, поэтому я добавил это.

Итак, ваши проблемы, вероятно, в другом месте.Я предполагаю, что это упрощенный пример - что еще происходит на вашей странице?

0 голосов
/ 29 сентября 2010

У меня есть подозрения, что это потому, что вы включаете сценарий js/statsapi.js как в свою всплывающую, так и в фоновую страницу, поэтому возникает путаница, какую статистику вы имеете в виду, поскольку у вас есть 2 из них во всплывающем окне - одна включена через тег scriptи еще один загружается с фоновой страницы после вызова chrome.extension.getBackgroundPage()

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