2017-04-13 20 views
0

HTML:ローカル変数が親関数の入力パラメータである場合にのみ、コールバック関数でローカル変数にアクセスできるのはなぜですか?

<div id="header" p-include="components/header.htm" p-param="{'lblCurPos':'User Profile Page'}"></div> 
<!--Other mark up here--> 
<div id="footer" p-include="components/footer.htm" p-param="{'lblScreenID':'SYS-027'}"></div> 

JSコード:

/*Replace div that has p-include attr */ 
$(window).on('load',function() { 
    $("div[p-include]").each(
     function() { 
      p_include_replace(this); 
      //p_include_replace2(this); 
     } 
    ); 
}); 

//this works 
function p_include_replace(obj) { 
    //load html fragment 
    $(obj).load($(obj).attr("p-include"), function(){ 
     //parse param 
     param = JSON.parse($(obj).attr("p-param").replace(/'/g, '"'));   
     jQuery.each(param, function (k, val) { 
      $("#" + k).html(val); 
     }); 
    }); 
} 

//this doesn't work 
function p_include_replace2(obj) { 
    //parse param  
    param = JSON.parse($(obj).attr("p-param").replace(/'/g, '"')); 
    //load html fragment  
    $(obj).load($(obj).attr("p-include"), function(){   
     jQuery.each(param, function (k, val) { 
      $("#" + k).html(val); 
     }); 
    }); 
} 

p_include_replace2実行loadコールバック関数の時に、ローカル変数paramが上書きされるとするためのパラメータを含んでいるので、ヘッダーのために動作しませんフッター。

しかし、p_include_replaceはなぜ機能していますか?両方とも親関数のローカル変数である場合、コールバック関数でobj/paramを使用するのはなぜ違うのですか?

20170413編集:

明確にするために、私は次のようにコードを変更する必要があり:

/*Replace div that has p-include attr */ 
$(window).on('load',function() { 
    $("div[p-include]").each(
     function() {    
      p_include_test(this);   
     } 
    ); 
}); 


function p_include_test(obj) { 
    param = obj.id + "param" 
    console.log("Parent:" + obj.id); 
    console.log("Parent param:" + param); 
    $(obj).load($(obj).attr("p-include"), function(){ 
     console.log("Callback:" + obj.id); 
     console.log("Callback param:" + param); 
    }); 
} 

、結果は以下の通りです:

result

両方paramobjコールバックの外側で変更されました。なぜobjに2つのdiffeコールバックの値を正しくレンタルしますが、paramは正しくありませんか?

+0

あなたの最新の追加例はあなたの問題を示しています: 'var'を使わずに' param'を使って、グローバル変数にしています。だから、あなたはそれをグローバルに変更して、他のループに影響を与えます。 – devnull69

+0

@ devnull69私の2番目のメソッドに 'var'を追加しました。したがって、 'param'は実際にはグローバル変数でした。私は今、それを得る、ありがとう! – jack3694078

答えて

1

どちらの場合も内部関数(ロードコールバック)は非同期です。したがって、最初のメソッドでは、paramはコールバック内でのみ変更されます。これは問題ありません。

varを使用せずにパラメータをコールバック外に変更すると、paramがグローバルに変更され、コールバックが一度呼び出される前にさらに変更される可能性があります。この変更により、コールバック内にparamが変更されるため、結果は確定的ではありません。

+0

しかし、それがどのように 'obj'のために働くのでしょうか?なぜ2つの異なる値を保持することができますが、 'param'は1しか保持できません。 – jack3694078

+0

私はあなたを取得しません...メソッドの中で 'obj'はどこで変更されますか? – devnull69

+0

コールバックが一度呼び出される前に、最初のメソッドが2回呼び出されました。ヘッダー用に1回、フッター用に1回。後で実行されるコールバック関数で 'obj'が毎回正しい値を保持するのはなぜですか?私は 'param'とどう違うのか分かりません – jack3694078

-1

div(または他の要素)を置き換えたら、DOMから何かを削除してもう一度追加しました。したがって、委任を使用する必要があります。すでに存在していた親要素を探すのでなければ、もともとDOMの一部ではなかったものを聞くことはできません。この問題は、私には何度も噛み付いています。

Check this out

+0

質問はイベントバインディングとは関係ありません – devnull69

関連する問題