5

これは私の HTML ページです:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>

<script type="text/javascript" src="jquery-1.8.2.min.js"></script>

<script type="text/javascript" src="myscript.js"></script>

<script type="text/javascript">

$(document).ready(function() {
function closecontactform(){
alert("closing the form");
};
});
</script>
</head>
<body>
<p id="elementname">Click me to call function</p>
</body>

これは myscripts.js ファイルにあります。

$(document).ready(function() {
$('#elementname').click(function() {
alert("click detected");
closecontactform();
}); 
});

私の実際のページはこれよりもかなり複雑で、多くの jquery が含まれていますが、これは必要なコードのみを示す基本的な問題です。別の .js ファイルから関数を呼び出せるようにしたいのですが、関数はメイン ページで定義されています。この基本的な単純なバージョンでは、 $(document).read(function()... を削除しようとしましたが、この単純な例では、より複雑なページでその行を必要とするのに役立ちます。の上。

「クリック検出」が呼び出されるのがわかりますが、「フォームを閉じる」は呼び出されません。

何かヒントを教えていただけますか?

ありがとう、

4

3 に答える 3

13

スコープに問題があります。名前付き関数を でラップする必要はありません$(document).ready()

そのスコープ内にラップされている場合ready、関数内のクロージャーにより、その準備ができている関数内でのみ使用できます。

例:

$(document).ready(function() {
    function doAlert() {
        alert('foo');
    } 
    /* can call function since scope in same parent function*/
    doAlert();
}); 
/* function not in scope, is undefined here*/
doAlert();

関数がグローバルに利用可能になり、どこからでも呼び出された場合に機能するようにリファクタリングします。以下の両方の場合に機能します。

function doAlert() {
    alert('foo');
}

$(document).ready(function() {
    doAlert();
});
doAlert();

さらに注意:

多くの人は、jQuery セレクターとメソッドを使用する関数を でラップする必要があることを心配しています$(document).ready()。以外の名前付き関数にreadyは、すべての jQuery コードを含めることができます...しかし... HTML が存在することを確認するために、DOM の準備が整った後に呼び出す必要があります

于 2012-12-22T23:56:49.173 に答える
0

まず、スクリプトタグをタグの真上に移動する必要があります</body>

次に、ドキュメントを削除するだけで、上記で機能するはずです。問題は、クロージャの意味の中で関数を定義したことです。それは範囲外です。関数は、他のドキュメントの準備ができている(つまり、ドキュメントの準備ができている)ときにのみ起動されるため、ドキュメントの準備ができている必要はありません。

于 2012-12-22T23:58:57.530 に答える
0

動かしてみましたか

<script type="text/javascript" src="myscript.js"></script>

タグの下<body>

于 2012-12-22T23:56:29.743 に答える