1

継承したサイトのバグを調査しています。調査の結果、興味深い JavaScript スコープの問題が発生しました。以下のコードは、関連する詳細のみを表示するために簡略化されています。

以下の一般的なサービスには、ログアウト後にデータが返されない場合があるという問題があります (もちろん、本番環境のみ)。その場合、ApplyToolbarBindings の "data" 引数が null または空のオブジェクトではないことがわかります。実際には、前のページ リクエストの状態でハイドレートされています。そのオブジェクトの状態は、asp.net ポストバックを通じて存続します。つまり、ログアウトした後でもツールバーに「既知の」ユーザーが表示されるという最終的な効果です。

function ApplyToolbarBindings(data) {
    if (!data.IsKnown) {
        jQuery("#ToolBar").attr("data-bind", 'template: { name: "AnonymousUserToolbarTemplate" }');
    } else {
        jQuery("#ToolBar").attr("data-bind", 'template: { name: "KnownUserToolbarTemplate" }');
    }
    ko.applyBindings(data, document.getElementById('ToolBar'));
}
function GetToolBarData(callbackFunction) {
    jQuery.ajax({
        url: '/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV,
        success: callbackFunction,
        dataType: 'json',
        type: 'GET'
    });
}
function loadToolbar() {
    GetToolBarUserData(ApplyToolbarBindings);
}
jQuery(function () { loadToolbar(); });

関数がグローバルに定義されている場合、関数への引数のライフサイクルはどのようなものですか? データが返されないときに ajax オブジェクトの状態が変更されないため、この動作ですか?

4

2 に答える 2

4

これは JavaScript スコープに関連したものではありません。ページロード間のスコープなどはありません。

ブラウザー (またはユーザーとサーバー間の何らかのデバイス) が AJAX 要求を にキャッシュしていることがわかります'/Services/Toolbar/ToolBarService.ashx?v=' + toolbarV

このオプションを使用するcache: false jQuery.ajaxか (ランダムな文字列を URL に効果的に追加してキャッシュを停止します)、または正しいCache-Controlヘッダーを発行することで ( no-cache)、これを回避できます。

于 2012-05-04T13:49:23.123 に答える
0

ほとんどのサーバーでは、セッション、アプリケーション、およびリクエストのスコープがあります。つまり、js スコープは、リクエストが設定されてから応答を取得した後、短時間存在するため、リクエスト スコープのどこかにあるということです。

スコープ値が必要な場合は、テンプレート システムと Bean を使用できます。(速度、JSFなど)。そうでなければ...

クッキーが使える!

/**
 * deletes a cookie
 **/
function deleteCookie(c_name) {
    now = new Date();
    document.cookie=c_name+"=; expires="+now.toGMTString();
}

/**
 * sets a cookie
 **/
function setCookie(c_name,value,exdays) {
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}

/**
 * Returns the cookie Value with unescaped content
 **/
function getCookie(c_name) {
    var i,x,y,ARRcookies=document.cookie.split(";");
    for (i=0;i<ARRcookies.length;i++) {
        x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
        y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
        x=x.replace(/^\s+|\s+$/g,"");
        if (x==c_name) {
            return unescape(y);
        }
    }
}
于 2012-05-04T13:53:50.513 に答える