DataTables.js 的 CDN 回退
CDN fallback for DataTables.js
我正在尝试为 datatables.min.js
编写 CDN 回退——不知何故,我在 Google 或 datatables.net 上找不到任何内容。看完这篇 and this DataTables post,我想到了这篇未成功的文章(甚至尝试了各种表达方式如图所示):
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
document.write('<script src="~/scripts/datatables.min.js"><\/script>');
//document.write('<script src="~/scripts/datatables.min.js">\x3C/script>'); //same
//document.write('\x3Cscript src="~/scripts/datatables.min.js"\x3E\x3C/script\x3E'); //same
}
</script>
为了排除故障,我直接加载了 datatables.min.js
并得到了这两个令人困惑的结果:
1/ 我从中得到 undefined
(BAD):
<script>
document.write('<script src="~/scripts/datatables.min.js"><\/script>');
</script>
<script>
alert(typeof jQuery.fn.dataTable);
</script>
2/ ... 但不知何故我从中得到 function
(GOOD):
<script src="~/scripts/datatables.min.js"></script>
<script>
alert(typeof jQuery.fn.dataTable);
</script>
这对我来说看起来是一样的,特别是因为 document.write
使用同步加载。我也尝试了一种纯粹的 DOM 方法,但没有成功。
document.write
我错过了什么?
试试这个
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
$.getScript(baseURL + '/scripts/datatables.min.js?' + Math.random(), function () {
//do stuff here
alert(typeof jQuery.fn.dataTable);
});
}
</script>
在您的代码中 document.write 和警报将同时处理,请注意警报将在 "database.min.js" 可用时完成。
使用 $(document).ready() 或 winidow.onload 你会看到预期的结果。
虽然在执行此操作之前先阅读此处的最佳实践、优缺点 -
http://www.stevesouders.com/blog/2012/04/10/dont-docwrite-scripts/
我会推荐使用 RequireJS 来有效地执行此操作,正如 Scott Hanselman 所描述的那样,请在尝试之前阅读下面的内容 link,因为他详细讨论了 CDN 回退并涵盖了它的各个方面 -
http://www.hanselman.com/blog/CDNsFailButYourScriptsDontHaveToFallbackFromCDNToLocalJQuery.aspx
希望它能对您有所帮助,并为您找到正确的方向打下坚实的基础。
遵循公认的回退做法的 DataTables 的正确 CDN 回退是:
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
document.write('\x3Cscript src="/scripts/datatables.min.js"\x3E\x3C/script\x3E');
//document.write('<script src="/scripts/datatables.min.js"><\/script>');
}
</script>
或者干脆
<script>window.jQuery.fn.dataTable || document.write('\x3Cscript src="/scripts/datatables.min.js"\x3E\x3C/script\x3E')</script>
src=""
中的 tilda / 相对路径是问题所在,正如@ParthTrivedi 所建议的(参见评论)。根据此 post,“在脚本中,路径相对于显示的页面”。
我正在尝试为 datatables.min.js
编写 CDN 回退——不知何故,我在 Google 或 datatables.net 上找不到任何内容。看完这篇
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
document.write('<script src="~/scripts/datatables.min.js"><\/script>');
//document.write('<script src="~/scripts/datatables.min.js">\x3C/script>'); //same
//document.write('\x3Cscript src="~/scripts/datatables.min.js"\x3E\x3C/script\x3E'); //same
}
</script>
为了排除故障,我直接加载了 datatables.min.js
并得到了这两个令人困惑的结果:
1/ 我从中得到 undefined
(BAD):
<script>
document.write('<script src="~/scripts/datatables.min.js"><\/script>');
</script>
<script>
alert(typeof jQuery.fn.dataTable);
</script>
2/ ... 但不知何故我从中得到 function
(GOOD):
<script src="~/scripts/datatables.min.js"></script>
<script>
alert(typeof jQuery.fn.dataTable);
</script>
这对我来说看起来是一样的,特别是因为 document.write
使用同步加载。我也尝试了一种纯粹的 DOM 方法,但没有成功。
document.write
我错过了什么?
试试这个
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
$.getScript(baseURL + '/scripts/datatables.min.js?' + Math.random(), function () {
//do stuff here
alert(typeof jQuery.fn.dataTable);
});
}
</script>
在您的代码中 document.write 和警报将同时处理,请注意警报将在 "database.min.js" 可用时完成。
使用 $(document).ready() 或 winidow.onload 你会看到预期的结果。
虽然在执行此操作之前先阅读此处的最佳实践、优缺点 -
http://www.stevesouders.com/blog/2012/04/10/dont-docwrite-scripts/
我会推荐使用 RequireJS 来有效地执行此操作,正如 Scott Hanselman 所描述的那样,请在尝试之前阅读下面的内容 link,因为他详细讨论了 CDN 回退并涵盖了它的各个方面 -
http://www.hanselman.com/blog/CDNsFailButYourScriptsDontHaveToFallbackFromCDNToLocalJQuery.aspx
希望它能对您有所帮助,并为您找到正确的方向打下坚实的基础。
遵循公认的回退做法的 DataTables 的正确 CDN 回退是:
<script>
if (typeof jQuery.fn.dataTable === 'undefined') {
document.write('\x3Cscript src="/scripts/datatables.min.js"\x3E\x3C/script\x3E');
//document.write('<script src="/scripts/datatables.min.js"><\/script>');
}
</script>
或者干脆
<script>window.jQuery.fn.dataTable || document.write('\x3Cscript src="/scripts/datatables.min.js"\x3E\x3C/script\x3E')</script>
src=""
中的 tilda / 相对路径是问题所在,正如@ParthTrivedi 所建议的(参见评论)。根据此 post,“在脚本中,路径相对于显示的页面”。