2012-01-16 5 views
2

私は以下の状況に直面しています。 バックエンドとの通信にajaxを使用し、html/jsの混在コードで応答します。すなわち$("#mydiv").html(ajaxResponse);jQuery ajax mixed html/js <script><script>が開かれたときにコンテキストが失われるのを避ける

しかし、JSのグローバル(ウィンドウ)のコンテキストで実行されますで<script>タグに埋め込まれたコードではなく、私の事前に定義された1 - 私はdivの中に私のコンテンツをロードするために、HTML()関数を使用します。

この状況で実行のコンテキストを変更する方法はありますか?

コードは以下の

のindex.htmlのようになります。

<div id="mydiv"></div> 
<script type="text/javascript"> 
$(function(){ 
    $.ajax({ 
     url: '/myAjaxResponse.html', 
     context: $(this), 
     success: function(resp) { $("#mydiv").html(resp); } 
    }); 
}); 
</script> 

myAjaxResponse.html:

<!-- Some html... really just anything :) --> 
<script type="text/javascript"> 
    console.log($(this)); // $(this) points to window object :(
</script> 
+0

あなたの希望するコンテキストは何ですか? '#mydiv'? – vzwick

答えて

1

編集:ええと、待って、私はちょうど私が誤解実現あなたの質問...

DOMに挿入しているので、XHR経由でロードされたJSはすべて自動的にwindowのスコープにあります。そして、afaik、その周りには適切な方法はありません。 contextオプションが$.ajax()の場合、thisという値をコールバック関数に設定しています。

(さらに、私が今まで以上に良いことを説明するthis answerをチェックしてください)

一つ、可能性の問題の周りに非常に非常に風変わりな方法は、あなたが(これらの線に沿って何か)後で呼び出すことができるグローバル変数を設定することですが、:

var context; 

$(function(){ 
    context = $('whatever'); 
    $.ajax({ 
     url: '/myAjaxResponse.html', 
     success: function(resp) { $("#mydiv").html(resp); } 
    }); 
}); 

myAjaxResponse.html:

<script type="text/javascript"> 
    $this = context; 
    console.log($this); // $this points to whatever you set context to before XHR 
</script> 
を短い長い話作るために

$(this)は、あなたの$.ajax()呼び出しのコンテキストでは、実際にwindowを指すん。

あなたは/要素へthisポイントが$.each()で反復処理されている

$(function(){ 
    $('#mydiv').each(function(){ 
     $.ajax({ 
      url: '/myAjaxResponse.html', 
      context: $(this), 
      success: function(resp) { $("#mydiv").html(resp); } 
     }); 
    }) 
}); 

...と(ややquirkily)

$(function(){ 
    $.ajax({ 
     url: '/myAjaxResponse.html', 
     context: $('#mydiv'), 
     success: function(resp) { $("#mydiv").html(resp); } 
    }); 
}); 

かに行く必要がある可能性がどちらか。

+0

"XHR経由でロードされたすべてのJSは自動的にウィンドウの有効範囲にあります。 – lonesomeday

+0

ああ、私の悪い(誤字)、はい、$ .ajax({コンテキスト:$( "#mydiv)...})は、私が意味していたものです: 唯一の方法は、 ( それで、uidを構築する場合は、#mydivデータに接続して、そのUIDに基づいて「選択」してください。 (提供されたリンクも読みます。 – ptheofan

関連する問題