瀏覽代碼

Fast loading for links [DON'T USE - BREAKS YEMI FUNCTIONALITY]

Vijayakrishnan 5 年之前
父節點
當前提交
d3f51a7c28
共有 2 個文件被更改,包括 105 次插入1 次删除
  1. 104 0
      public/js/mc.js
  2. 1 1
      resources/views/layouts/template.blade.php

+ 104 - 0
public/js/mc.js

@@ -1,3 +1,68 @@
+var findEventHandlers = function (eventType, jqSelector) {
+    var results = [];
+    var $ = jQuery;// to avoid conflict between others frameworks like Mootools
+
+    var arrayIntersection = function (array1, array2) {
+        return $(array1).filter(function (index, element) {
+            return $.inArray(element, $(array2)) !== -1;
+        });
+    };
+
+    var haveCommonElements = function (array1, array2) {
+        return arrayIntersection(array1, array2).length !== 0;
+    };
+
+
+    var addEventHandlerInfo = function (element, event, $elementsCovered) {
+        var extendedEvent = event;
+        if ($elementsCovered !== void 0 && $elementsCovered !== null) {
+            $.extend(extendedEvent, { targets: $elementsCovered.toArray() });
+        }
+        var eventInfo;
+        var eventsInfo = $.grep(results, function (evInfo, index) {
+            return element === evInfo.element;
+        });
+
+        if (eventsInfo.length === 0) {
+            eventInfo = {
+                element: element,
+                events: [extendedEvent]
+            };
+            results.push(eventInfo);
+        } else {
+            eventInfo = eventsInfo[0];
+            eventInfo.events.push(extendedEvent);
+        }
+    };
+
+
+    var $elementsToWatch = $(jqSelector);
+    if (jqSelector === "*")//* does not include document and we might be interested in handlers registered there
+        $elementsToWatch = $elementsToWatch.add(document);
+    var $allElements = $("*").add(document);
+
+    $.each($allElements, function (elementIndex, element) {
+        var allElementEvents = $._data(element, "events");
+        if (allElementEvents !== void 0 && allElementEvents[eventType] !== void 0) {
+            var eventContainer = allElementEvents[eventType];
+            $.each(eventContainer, function(eventIndex, event){
+                var isDelegateEvent = event.selector !== void 0 && event.selector !== null;
+                var $elementsCovered;
+                if (isDelegateEvent) {
+                    $elementsCovered = $(event.selector, element); //only look at children of the element, since those are the only ones the handler covers
+                } else {
+                    $elementsCovered = $(element); //just itself
+                }
+                if (haveCommonElements($elementsCovered, $elementsToWatch)) {
+                    addEventHandlerInfo(element, event, $elementsCovered);
+                }
+            });
+        }
+    });
+
+    return results;
+};
+
 window.top.addEventListener('popstate', function(event) {
     if(!!event.state) window.location = event.state;
 });
@@ -16,7 +81,46 @@ $(document).ready(function() {
     if(body.is('.stag_rhs_collapsed')) {
         icon.removeClass().addClass('fa fa-arrow-left');
     }
+
+    initFastLoad();
 });
+function initFastLoad(_parent = false) {
+
+    var allAs = $('a:not([onclick]):not([href="#"]):visible');
+    if(_parent) {
+        allAs = _parent.find('a:not([onclick]):not([href="#"]):visible');
+    }
+    // find links without event handlers
+    allAs.each(function() {
+        if(!$(this).closest('[moe]').length) {
+            var handlers = findEventHandlers('click', this);
+            if(!handlers || !handlers.length) {
+                enableFastLoad(this);
+            }
+        }
+    });
+
+    function enableFastLoad(_a) {
+        var targetParent = $('.stag-content');
+        $(_a).on('click', function() {
+            $.get(_a.href, function(_data) {
+                _data = '<div>' + _data + '</div>';
+                var content = $(_data).find('.stag-content');
+                if(content) {
+                    content = content.html();
+                    console.log(content);
+                    targetParent.html(content);
+                    initFastLoad(targetParent);
+                }
+                else {
+                    console.warn('Target page not found: ' + this.href);
+                }
+            });
+            return false;
+        });
+        console.info('FastLoad enabled for ' + _a.innerText + ' [' + _a.href + ']');
+    }
+}
 function openInRHS(_url) {
     window.top.showRHS();
     var icon = $('.stag_rhs_toggle i');

+ 1 - 1
resources/views/layouts/template.blade.php

@@ -72,7 +72,7 @@
     </nav>
 
 
-    <main role="main">
+    <main role="main" class="stag-content">
 
         @yield('content')