3

これは私のメインファイルです:

$(document).ready(function () {
  function Page() {
    this.menu = new Menu();
    this.management = new Management();
    this.text = "text";
  }
window.Page= Page();
});

ここで、他のすべての JS ファイルからページにアクセスしたいと思います。

私はこれを試しました:

console.log(Page.text);

私に与えます:Uncaught ReferenceError: Page is not defined

これを試しました:

console.log(window.Page.text);

私に与えます:Uncaught TypeError: Cannot read property 'text' of undefined

私は何を間違っていますか?

4

4 に答える 4

4

あなたの問題は、 Page 関数内で、グローバルコンテキストで新しいオブジェクトを作成していないことです。新しいメニューと新しい管理インスタンスを作成していますが、現在のコンテキストで作成しています。

さらに、Window.Page = Page() を呼び出すことにより、Page 関数 (無効) の結果を window.Page オブジェクトに割り当てます。

次のようなことをお勧めします:

//- from any js file 
    function createPage() {
            var newPage = { title : 'new page', count : '2' };
            return newPage;
          }
    window.Page = createPage();

...

//- and from other js file
    $(document).ready(function () {                
    alert(window.Page.title);
    });

このサンプルでは、​​メニューと管理のプロパティをダミー コンテンツに置き換えました。サンプルはこの JSFiddleで入手可能

更新 : 複数の js ファイルの適切な使用法を示すためにコードが更新されました。

お役に立てれば

于 2013-01-15T07:41:32.820 に答える
1

関数定義は、関数内にある必要はありませんdocument.ready()。DOM の準備ができたときにすぐに実行する必要があるアクションのみをそこに配置する必要があります。したがって、関数をトップレベルに移動します。

于 2013-01-15T07:27:57.340 に答える
1

を使用する必要がありますwindow.Page = new Page();

于 2013-01-15T07:27:27.667 に答える
0

また

window.Page = new Page();

また

function Page(){
   this.menu = new Menu();
   this.management = new Management();
   this.text = "text";
   return this;
}
window.Page = Page();

次に、宣言される前に他のスクリプトが window.Page を使用しようとしないことを確認します。document.ready() コールバック関数で宣言するので、DOM の準備ができてコールバック関数が起動された後にのみアクセス可能になります。

編集:

コンテキストがなければ、これがまさにあなたがやろうとしていることかどうかはわかりませんが、いくつかのプロパティ/メソッドを持つグローバル Page オブジェクトが必要なだけだと思います。それを作成する最も簡単な方法は

window.Page = {
    menu : new Menu(),
    management = new Management(),
    text = "text"
};

document.ready() ラッパーなし。明らかにMenuManagementこのコードが実行される前に定義する必要があります。これらの関数のいずれかが DOM に依存している場合は、すべてのスクリプトをドキュメントの最後に移動してください。window.Page へのアクセスが必要なスクリプトは、このスクリプトの後に含める必要があります。

于 2013-01-15T07:36:01.150 に答える