assets-loader.js 2.2 KB

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