fancybox jquery プラグインを使用しており、JavaScript をページの読み込みの最後まで延期しようとしています。
<html>
<head>
</head>
<body>
content
/*bottom of body*/
<script src="jquery-1.8.3.min.js" type="text/javascript"></script>
<script type="text/javascript" src="jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.pack.js" ></script>
<script type="text/javascript">
$(document).ready(function() {
$(".example3").fancybox({
'transitionIn' : 'none',
'transitionOut' : 'none'
});
});
</script>
</body>
</html>
この時点でプラグインは機能しますが、javascript は延期されません。次に、スクリプトを次のように変更します
<script defer="defer" type="text/javascript">
window.onload=function(){
var mycode;
mycode=document.createElement("script");
mycode.type="text/javascript";
mycode.src="jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.pack.js";
document.getElementsByTagName("head")[0].appendChild(mycode);
}
</script>
ここで読んだように、プラグインが機能することもあれば、機能しないこともあります。Google pagespeed によると、jquery-1.8.3.min.js スクリプトを延期する必要があります。同じように延期すると、Googleのページ速度は問題ないように見えますが、プラグインはまったく機能しません。
どうすればいいですか?
Jamed Donnelly の回答に基づく完全なソリューション:
head からすべての .js スクリプトを削除しました。次に、タグの直前にこれを追加しました:
<script>
(function() {
function getScript(url,success){
var script=document.createElement('script');
script.src=url;
var head=document.getElementsByTagName('head')[0],
done=false;
script.onload=script.onreadystatechange = function(){
if ( !done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete') ) {
done=true;
success();
script.onload = script.onreadystatechange = null;
head.removeChild(script);
}
};
head.appendChild(script);
}
getScript("jquery-1.8.3.min.js",function(){
getScript("jquery.fancybox-1.3.4/fancybox/jquery.fancybox-1.3.4.pack.js", function() {});
getScript("myCustomScript.js", function() {});
});
})();
</script>
ファイル myCustomScript.js を作成しました。
$(document).ready(function(){
$(".example3").fancybox({
'transitionIn' : 'none',
'transitionOut' : 'none'
});
});
それだけです。