AssetsLoader.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. export default class AssetsLoader {
  2. constructor(Dcat) {
  3. let _this = this;
  4. _this.dcat = Dcat;
  5. Dcat.assets = {
  6. // 加载js脚本,并触发 ready 事件
  7. loadScripts: _this.load.bind(_this),
  8. // 从给定的内容中过滤"<script>"标签内容,并自动加载其中的js脚本
  9. filterScriptsAndLoad: _this.filterScriptsAndLoad.bind(_this)
  10. };
  11. }
  12. // 按顺序加载静态资源
  13. // 并在所有静态资源加载完毕后执行回调函数
  14. load(urls, callback, args) {
  15. let _this = this;
  16. if (urls.length < 1) {
  17. (! callback) || callback(args);
  18. _this.fire();
  19. return;
  20. }
  21. seajs.use([urls.shift()], function () {
  22. _this.load(urls, callback, args);
  23. });
  24. }
  25. // 过滤 <script src> 标签
  26. filterScripts(content) {
  27. var obj = {};
  28. if (typeof content == 'string') {
  29. content = $(content);
  30. }
  31. obj.scripts = this.findAll(content, 'script[src]').remove();
  32. obj.contents = content.not(obj.scripts);
  33. obj.contents.render = this.toString;
  34. obj.js = (function () {
  35. var urls = [];
  36. obj.scripts.each(function (k, v) {
  37. if (v.src) {
  38. urls.push(v.src);
  39. }
  40. });
  41. return urls;
  42. })();
  43. return obj;
  44. }
  45. // 返回过滤 <script src> 标签后的内容,并在加载完 script 脚本后触发 "pjax:script" 事件
  46. filterScriptsAndLoad(content, callback) {
  47. var obj = this.filterScripts(content);
  48. this.load(obj.js, function () {
  49. (!callback) || callback(obj.contents);
  50. });
  51. return obj.contents;
  52. }
  53. findAll(elems, selector) {
  54. if (typeof elems == 'string') {
  55. elems = $(elems);
  56. }
  57. return elems.filter(selector).add(elems.find(selector));
  58. }
  59. fire() {
  60. this.dcat.pjaxResponded();
  61. // js加载完毕 触发 ready 事件
  62. // setTimeout用于保证在所有js代码最后执行
  63. setTimeout(this.dcat.triggerReady, 1);
  64. }
  65. toString(th) {
  66. var html = '', out;
  67. this.each(function (k, v) {
  68. if ((out = v.outerHTML)) {
  69. html += out;
  70. }
  71. });
  72. return html;
  73. }
  74. }