jquery bbq
私はajax リクエストがdiv
発生し、レスポンスが受信されたときにボディのどこかが置き換えられるWeb サイト (を使用する) を持っています。次のようなもの:
var mainContent = $('#main_content');
if ( cache[ url ] ) {
mainContent.fadeOut(duration, function() {
mainContent.html(cache[ url ]);
mainContent.fadeIn(duration, function() {
$(document).trigger("ajax_loaded");
});
});
} else {
mainContent.fadeOut(duration, function() {
var postAjaxCallback = function() {
cache[ url ] = mainContent.html();
$(document).trigger("ajax_loaded");
};
$('#loading').fadeIn(duration, do_ajax(url, duration, postAjaxCallback));
} );
}
function do_ajax(linkVal, duration, callback) {
$.ajax({
type: "GET",
url: linkVal,
dataType: "html",
success: function(page){
var mainContent = $('#main_content');
mainContent.stop(true, true);
if(parseInt(page)!=0)
{
mainContent.html(page);
$('#loading').fadeOut(duration, function() {
mainContent.fadeIn(duration, callback);
} );
}
}
});
}
全体として、これはうまく機能します。メインページは次のようなものです。
<html>
<head>
...
</head>
<body>
<div id="main_content");
<p>Hello world!</p>
</div>
/body>
</html>
ajaxの戻り値#page2
は次のようなものです
<p>Hello to a different world!</p>
その#page3
上で、もう少し複雑になります。返される ajax は次のとおりです。
<script type="text/javascript">
function initialize() {
var mapOptions = {
zoom: 11,
streetViewControlOptions: true,
center: new google.maps.LatLng(26.737792, 49.878273),
mapTypeId: google.maps.MapTypeId.SATELLITE
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
}
function loadScript() {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize";
document.body.appendChild(script);
}
loadScript();
$(document).bind("ajax_loaded", function() {
console.log("map resize called");
google.maps.event.trigger(map, 'resize');
});
</script>
これで初めて#page3
ロードされ、すべて正常に動作し、コンソール ログが起動し、マップのサイズが変更されます (灰色の領域の問題のため、サイズを変更する必要があります)。ここで私が望んでいるのは、他のすべてのページが引き続き正常にロードされ (ajax 呼び出しまたはキャッシュから)、#page3
再度ナビゲートされたときに (つまり、#("main_content")
キャッシュから設定され、サイズ変更イベントが再び発生することです)。最も簡単に言えば、各 ajax ページがロードされた後にトリガーするイベントを作成しようとしており、$(document).bind("ajax_loaded", function() {});
必要な後処理を行うことができる各 ajax 取得ページでカスタムを持つことができます。ロードするまで発生します#page3
(そして、私が述べたように、マップのサイズが変更され、すべてがグレービーになります)。その後、ページが読み込まれるたびにバインドされた関数がトリガーされ、コンソールに出力されます (バインドされているので合理的だと思いますが$(document)
、各ページに固有のものにするために何か良いことはありますか?)。リロードしようとする#page3
と、マップが読み込まれますが、サイズが変更されません (コンソールはまだ印刷されます)。そのため、マップに灰色の領域が表示されます。ワークフローを正しくするために、JavaScript の経験が限られているので、誰か助けてくれませんか。繰り返します:
- 各 ajax ロード (またはキャッシュからのロード) は、いくつかのイベントをトリガーします
- 各 ajax ページ ( など) 内には
#page1
、#page2
各 ajax ページに固有のセットアップを行うことができる上記の手順からトリガーされる関数があります。
助けてくれてありがとう!
編集 私は以下を使用してみました:
mainContent.find("script").each(function(i) {
eval($(this).text());
});
イベントをトリガーする代わりに、ajax_loaded
役に立ちません。他に試せることはありますか?