Ответ 1
Оказывается, из-за своеобразной смеси фреймворков javascript, которые мне нужно было инициировать script с помощью прослушивателя событий, предоставляется одна из других фреймворков.
У меня есть jquery script, который мне нужно запускать только один раз, когда все остальное на странице, включая некоторые другие javascripts (над которыми я не контролирую) закончил делать свою работу.
Я, возможно, был альтернативой $(document).ready, но я не смог его найти.
Оказывается, из-за своеобразной смеси фреймворков javascript, которые мне нужно было инициировать script с помощью прослушивателя событий, предоставляется одна из других фреймворков.
У вас может быть $(document).ready()
несколько раз на странице. Код запускается в последовательности, в которой он отображается.
Вы можете использовать событие $(window).load()
для своего кода, так как это происходит после полной загрузки страницы и завершения всего кода в различных обработчиках $(document).ready()
.
$(window).load(function(){
//your code here
});
Несколько $(document).ready()
будут стрелять сверху вниз на странице. Последний $(document).ready()
будет срабатывать последним на странице. Внутри последнего $(document).ready()
вы можете запустить новое настраиваемое событие для запуска всех остальных.
Оберните свой код в обработчик событий для нового настраиваемого события.
<html>
<head>
<script>
$(document).on("my-event-afterLastDocumentReady", function () {
// Fires LAST
});
$(document).ready(function() {
// Fires FIRST
});
$(document).ready(function() {
// Fires SECOND
});
$(document).ready(function() {
// Fires THIRD
});
</script>
<body>
... other code, scripts, etc....
</body>
</html>
<script>
$(document).ready(function() {
// Fires FOURTH
// This event will fire after all the other $(document).ready() functions have completed.
// Usefull when your script is at the top of the page, but you need it run last
$(document).trigger("my-event-afterLastDocumentReady");
});
</script>
Этот кодовый блок решает мою проблему,
<script type="text/javascript">
$(window).bind("load", function () {
// Code here
});
</script>
Из здесь:
// Add jQuery
var GM_JQ = document.createElement('script');
GM_JQ.src = 'http://jquery.com/src/jquery-latest.js';
GM_JQ.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(GM_JQ);
// Check if jQuery loaded
function GM_wait()
{
if(typeof unsafeWindow.jQuery == 'undefined')
{
window.setTimeout(GM_wait,100);
}
else
{
$ = unsafeWindow.jQuery;
letsJQuery();
}
}
GM_wait();
// All your GM code must be inside this function
function letsJQuery()
{
// Do your jQuery stuff in here
}
Это будет ждать, пока jQuery будет загружен, чтобы использовать его, но вы можете использовать ту же концепцию, устанавливая переменные в своих других сценариях (или проверяя их, если они не являются вашим script), чтобы ждать, пока они не будут загружены в используйте их.
Например, на моем сайте я использую это для асинхронной загрузки JS и ожидаю, пока они не закончатся, прежде чем что-либо делать с ними с помощью jQuery:
<script type="text/javascript" language="JavaScript">
function js(url){
s = document.createElement("script");
s.type = "text/javascript";
s.src = url;
document.getElementsByTagName("head")[0].appendChild(s);
}
js("/js/jquery-ui.js");
js("/js/jrails.js");
js("/js/jquery.jgrowl-min.js");
js("/js/jquery.scrollTo-min.js");
js("/js/jquery.corner-min.js");
js("/js/jquery.cookie-min.js");
js("/js/application-min.js");
function JS_wait() {
if (typeof $.cookie == 'undefined' || // set in jquery.cookie-min.js
typeof getLastViewedAnchor == 'undefined' || // set in application-min.js
typeof getLastViewedArchive == 'undefined' || // set in application-min.js
typeof getAntiSpamValue == 'undefined') // set in application-min.js
{
window.setTimeout(JS_wait, 100);
}
else
{
JS_ready();
}
}
function JS_ready() {
// snipped
};
$(document).ready(JS_wait);
</script>
Вы пытались загрузить все функции инициализации с помощью $().ready
, запустив функцию jQuery, которую вы хотели в последний раз?
Возможно, вы можете использовать setTimeout()
в функции $().ready
, которую вы хотели запустить, вызывая функциональность, которую вы хотели загрузить.
Или используйте setInterval()
и проверьте интервал, чтобы проверить, завершены ли все остальные функции загрузки (сохранить статус в логической переменной). Когда условия выполнены, вы можете отменить интервал и запустить функцию загрузки.