0

Cakephp フレームワークを使用しており、2 つの個別の JavaScript ファイルを作成し、それらを webroot/js フォルダーに配置しました。最初の JavaScript ファイルには、ダイアログ ボックスの設定を含むモーダル ダイアログ変数が含まれています。2 番目の JavaScript ファイルには、データをアクションに送信してからダイアログを開く他のクリック イベント ハンドラーが含まれています。

私が抱えている問題は、2 番目のファイルが $ variablenameを使用して最初のファイルから変数を呼び出し、変数名が定義されていないというエラーが表示されることです。

私が何を意味するかを示すために、いくつかのコードを以下に示します。最初のファイルから:

var $editSel = $("#editSel_dialog").dialog(
{
    autoOpen: false,
    height: 530,
    width: 800,
    resizable: true,
    modal: true,
    buttons:
    {
        "Cancel": function()
        {
            $(this).dialog("close");
        }
    }
});

2 番目のファイルから:

$('.neweditSel_dialog').live('click', function()
{
    $.ajaxSetup({ async: false });

    var selected = [];

    $("#[id*=LocalClocks]").each(function()
    {
        if(false != $(this).is(':checked'))
        {
            var string = $(this).attr('id').replace('LocalClocks', '');
            string = string.substring(10);
            selected.push(string);
        }
    });

    if(0 === selected.length)
    {
        $selError.dialog('open');
        $selError.text('No Local Clocks Were Selected')
    }
    else
    {
        $.post('/LocalClocks/editSelected', { "data[Session][selected]": selected }, function(data)
        {
        });
        $editSel.load($(this).attr('href'), function ()
        {
            $editSel.dialog('open');
        });
    }
    return false;
});

これは、jquery-1.4.2.min.js を使用していたときに機能していましたが、現在は jquery1.7 を使用しています。また、すべての変数を含む最初のファイルを入れてしまいまし$(document).ready(function(){}); た。2番目のファイルを document.read() 関数の中に入れてみましたが、違いはありませんでした。

どんな助けでも素晴らしいでしょう。ありがとう

4

3 に答える 3

2

あなたは範囲内の問題に取り組んでいます。JavaScript の場合:

function foo() {
    var greet = "hi";
}

function bar() {
    console.log(greet); // will throw error
}

でも:

var greet;
function foo() {
    greet = "hi";
}

function bar() {
    console.log(greet); // will log "hi"
}

変数にアクセスする必要がある両方の関数の共通の親で変数を定義する必要があります。残念ながら、モデル化の規則やフレームワークを使用していないため、それは window オブジェクトです (なぜグローバル変数が悪いのですか? )。

したがって、両方の のvar $whateveryouneed beforeoutside を定義する必要があります$(document).ready

また、 と は分けて保管してdeclarationくださいdefinition。定義は jQuery オブジェクトをインスタンス化するため、$(document).ready()($(function() {})代わりに使用して)内にカプセル化する必要があります。

var $editSel;
$(function () {
    $editSel = $("#editSel_dialog").dialog(
    {
        autoOpen: false,
        height: 530,
        width: 800,
        resizable: true,
        modal: true,
        buttons:
        {
            "Cancel": function()
            {
                $(this).dialog("close");
            }
        }
    });
});
于 2012-07-18T12:31:18.760 に答える
1

一方のファイルがもう一方のファイルより先にロードされることを保証することはできません。また、一方のファイルのdocument.readyがもう一方のファイルよりも先に起動することを保証することはできません。

したがって、コードを関数でラップし、必要な順序で単一のdocument.readyハンドラーで呼び出すことをお勧めします。

例えば:

function initVariables(){
    window.$editSel = ... // your code from the first file here
}

function initHandlers(){
    // your code from the second file here
}

その後:

$(document).ready(function() {
    initVariables();
    initHandlers();
});

window変数を公開するためにグローバルオブジェクトを使用したことに気付くでしょう。それらに共通の名前空間を使用するとさらに良いでしょう。

于 2012-07-18T12:45:38.340 に答える
1

ハンドラーが起動される順序を保証できるとは思いません。つまり、準備完了のドキュメントが予想とは異なる順序で起動される可能性があります。2 番目のファイルでアクセスしようとしている変数はグローバル変数ですか? これが問題だと思っていたので、変数のスコープについて考えてみてください。

于 2012-07-18T12:23:24.137 に答える