誰かがたまたますべてのオンロードイベントハンドラを呼び出すことができるIFとHOWを知っていますか?私が制御できないいくつかの.jsファイルを参照しています。これらの.jsライブラリは$(document).ready()で初期化を行いますが、残念ながら再初期化する簡単な機能は提供していません。
現在、大きなdivブロックをajax呼び出しからのコンテンツで置き換えようとしているため、外部ライブラリを再初期化する必要があります。したがって、すべてを再初期化するために$(document).ready()を呼び出すだけでいいでしょう。
これまで、私はajax呼び出しでこれを試しました:
_success: function(data) {
alert('1'); // Displays '1'
$('#content').html(data);
alert('2'); // Displays '2'
$(document).ready();
alert('3'); // Does not display
}
_
$(document).ready();
の呼び出しも静かに失敗します。 JavaScriptコンソールにエラーは表示されません。これが可能かどうか誰もが知っていますか(javascriptライブラリファイルを変更することなく)?
外部JSファイルを変更せずにそれを行う方法を尋ねたので、その方法で答えます。デバッガーでjQueryの.ready()
関数をトレースしましたが、ページの準備ができたときに呼び出されるルート関数は次のように表示されます。
_jQuery.ready();
_
ただし、最初に起動すると、以前に登録された関数からバインドが解除されるように見えるため(たとえば、それらを忘れるなど)、目的の処理を実行するためにもう一度呼び出すことはできないようです。そのため、手動でjQuery.ready()
を2回呼び出しても同じ関数呼び出しが再度トリガーされることはなく、デバッガーでブレークポイントが1回だけヒットし、2回目はヒットしませんでした。
したがって、バインドを解除しないようにjQuery実装を変更する(複数の発火を許可する)か、自分のイベントを使用するように準備完了ハンドラーコードの各部分を変更しない限り、この問題を解決できないようです欲しいです。
私は次のようなことをしました:
// When document is ready...
$(function(){
onPageLoad();
});
function onPageLoad(){
// All commands here
}
これで、必要なときにいつでもこの関数を呼び出すことができます。
これを実現する簡単な方法は、次のような独自のイベントを作成することです。
$(document).bind('_page_ready', function() { /* do your stuff here */});
次に、これを追加します:
$(function() { $(document).fire('_page_ready'); }); // shorthand for document.ready
最後に、もう一度実行する必要があるときはいつでも、これを呼び出すだけです:
$(document).fire('_page_ready');
あなたが本当にやりたいことをできるようにするjsFiddleを作った外部スクリプトファイルを本当に編集できない場合は、次のコードを見ることができます: http://jsfiddle.net/5dRxh /
ただし、これを使用したくない場合は、次のようにjQueryを含めた後にこのスクリプトを追加することが重要です。
<script src="jquery.js" type="text/javascript"></script>
<script>
//script from jsFiddle (only the plugin part at the top).
</script>
<!-- All the other script-files you want to include. -->
Jqueryは実行後にreadyイベントのバインドを解除するため、これができるとは思いません。ソースから:
// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
jQuery( document ).trigger( "ready" ).unbind( "ready" );
}
これは簡単にできます。
関数を作成します。
function REinit() {
/// PLACE HERE ALL YOUR DOC.READY SCRIPTS
}
Reinit()関数のみをdoc.ready内に配置します。
$(document).ready(function(){
REinit();
});
次に、ajaxアクションの後に呼び出します
REinit();
本文コンテンツ全体を変更する場合、document.readyを2回トリガーできます。
$('body').html($('body').html())
準備完了のイベントをpjaxの成功に変更するのは簡単だと思います
変更元:
$(document).ready(function() {
// page load stuff
});
に:
$(document).on('ready pjax:success', function() {
// will fire on initial page load, and subsequent PJAX page loads
});
これはあなたが望むものになります、あなたが本当に準備ができるまで、ただ準備ができているイベントを保持してください。
または、これを試してください:
jQuery.extend ({
document_ready: function (value) {
$(document).ready (value);
$(document).ajaxComplete (value);
}/* document_ready */
});
そして、次のように言って関数を定義する代わりに:
$(document).ready (function () { blah blah blah });
いう:
jQuery.document_ready (function () { blah blah blah });
説明:
「document_ready」に読み込まれた関数は、「$(document).ready()」と「$(document).ajaxComplete()」の両方に自動的に読み込まれ、両方の状況で起動します。
私のajax
コードという問題がありました のみ 通常の関数ではなく$(document).ready(function(){});
によって呼び出された場合に機能するため、ラップできませんでした。
コードは私のページの一部をロードすることに関するものであり、 読み込みエラー timeout
の後に再び呼び出されるようにしたかった。
私はコードがそうである必要がないことを発見しました に $(document).ready(function(){});
が、それによって実行でき、また 自ら呼び出される。
だから私はさまざまなページから多くのソリューションを読んだ後、私はこのコードを一緒に持っています:
$(document).ready(loadStuff);
function loadStuff(){
$.ajax({
type: "POST",
url: "path/to/ajax.php",
data: { some: data, action: "setContent"},
timeout: 1000, //only one second, for a short loading time
error: function(){
console.log("An error occured. The div will reload.");
loadStuff();
},
success: function(){
$("#divid").load("path/to/template.php"); //div gets filled with template
}
});
}