2

次のコードがあります。

function Notification(type) 
{
    switch (type) 
    {
        case "success":
           notificationID="not1";
           break;
        case "error":
           notificationID="not2";
           break;  
    }

    setNotificationTimeoutId = setTimeout(function () {
        jQuery('#' + notificationID).fadeOut(200, function () {
            var notification = document.getElementById(notificationID);
            if (notification) 
            {
                jQuery(notification.parentNode).remove();

                if (type == "success")
                        DoSomething();
            }

            setNotificationTimeoutId = null;
        });
    }, 5000);
}

私の質問は、関数(通知)がクリックイベントで呼び出され、2回(最初に通知(「成功」)で、次に通知(「エラー」)で)2回呼び出された場合、それは可能ですか? 2 番目の関数呼び出しが最初の関数呼び出しの型変数の値を変更することは?

例: 最初の呼び出し (成功したもの) が setTimeout 内の関数に入ると (通知への 2 番目の呼び出しが type = "error" で既に行われている)、この呼び出しが最初に type = "success" で呼び出されましたか?

4

3 に答える 3

2

関数Notificationがクリック イベントで呼び出され、2 回のクリック イベントによって (最初はNotification("success")で) 呼び出された場合、2 回目の関数呼び出しが最初の関数呼び出しの変数値をNotification("error")変更する可能性はありますか?type

いいえ。type変数はパラメーターであるため、関数にスコープ バインドされます。その値は後続の呼び出しで変更されません。すべての関数呼び出しは、この変数の新しいインスタンスを作成し、他のインスタンスにはアクセスできません。

タイムアウト用の匿名関数には、の「サブスコープ」であるスコープがあるNotificationため、常に正しいtype変数にアクセスします。

ただし、 yournotificationIDはグローバル変数 (ローカル スコープではない) であり、同じ変数インスタンスがNotificationすべてのタイムアウトとの間のすべての呼び出しで使用されます。Notificationそのため、最初のアクセスからのタイムアウトの前に、2 番目の呼び出しがそれを変更することが起こります。これを修正するには、varキーワードを追加します。

または、setNotificationTimeoutId外側のスコープにもあり、両方の呼び出しからアクセスできるため、次の行を追加して、新しいタイムアウトを作成する前にアクティブなタイムアウトをクリアすることができます (必要ですか?):

clearTimeout(setNotificationTimeoutId);
于 2012-07-18T12:02:03.383 に答える
1

グローバルであるため、notificationID 変数をローカライズする必要があります。これにより、関数を 2 回目に実行して、最初に実行したときの出力を変更できるようになります。

var を使用してローカライズします。

 var notificationID;

 switch (type) 
 {
    case "success":
      notificationID="not1";
      break;
    case "error":
      notificationID="not2";
      break;
 }
于 2012-07-18T11:58:56.733 に答える
0

これはどのように機能しますか? http://jsfiddle.net/gRoberts/vgSGL/

setTimeout を使用する代わりに、同様の jQuery の遅延メソッドを使用できます。

それが役に立てば幸い?

ガブ

于 2012-07-18T12:06:50.847 に答える