2010-09-29 11 views
3

У меня есть два файлаобъекты javascript не могут видеть друг друга? :: Google Chrome расширение

одна называется 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: Cannot call method 'myFunc' of undefined


Update
Ok, так что было очень упрощенный пример.

Основы ней,

Это расширение Chrome Google, Таким образом, вы будете видеть некоторый код специфичны для этого.

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

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 вызывается ,

Проверка на первом запуске не удается,

так заезжает background.html

initialize() Но это, где происходит ошибка.

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

Uncaught TypeError: Cannot call method 'getMetaData' of undefined.

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

его не сценарий включает проблему, как если бы путь был неправильным для statsapi.JS я

Uncaught ReferenceError: stats is not defined.

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

Хм,

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

+1

Это * все * это в 'stats.js'? Или это обернуто чем-то другим? –

+0

Можете ли вы предоставить структуру 'manifest.json', пожалуйста. – RobertPitt

+0

Я добавил его в список. – Hailwood

ответ

1

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

[email protected]:~/ccsite$ cat cat.js 
var stats = { 
    myFunc : function() { 
    alert('wtf'); 
    } 
} 


[email protected]:~/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

Я обновил код. – Hailwood

0

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

+0

Нет, мне нужно включить его отдельно в фоновом режиме, поскольку все вызовы на него не зависят от всплывающей страницы. – Hailwood

1

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

Смежные вопросы