diff options
author | mayx | 2025-08-04 05:19:53 +0000 |
---|---|---|
committer | mayx | 2025-08-04 05:19:53 +0000 |
commit | be9602047b40dbbfc1c6e9f63a9254e875ba92bc (patch) | |
tree | 58bc8b17477d6b2552d40114f314ac4f025f721c | |
parent | 53008706207ffa26ea468c4fbd9ed57faadac808 (diff) |
Update file rss-feed-preview.js
-rw-r--r-- | assets/js/rss-feed-preview.js | 71 |
1 files changed, 44 insertions, 27 deletions
diff --git a/assets/js/rss-feed-preview.js b/assets/js/rss-feed-preview.js index 30af324..acf9af5 100644 --- a/assets/js/rss-feed-preview.js +++ b/assets/js/rss-feed-preview.js @@ -66,17 +66,17 @@ return result; } - function checkFeed(url, callback) { - $.ajax({ + function checkFeed(url, onSuccess, onError) { + return $.ajax({ url: CORS_PROXY + url, type: 'GET', dataType: 'text', success: function (data) { var items = parseRSS(data); - callback(items); + onSuccess(items); }, error: function () { - callback(null); + onError(); } }); } @@ -130,17 +130,20 @@ var cache = {}; var currentLink = null; var timeout = null; + var currentRequest = null; + var currentRequestId = 0; + $('main table tbody').on('mouseenter mousemove mouseleave', 'tr td a', function (e) { - $('main table tbody tr td a').each(function () { - var $link = $(this); - - $link.on('mouseenter', function (e) { - currentLink = this; + if (e.type === 'mouseenter') { + var $link = $(this); var siteName = $link.text(); var url = $link.attr('data-feed'); if (!url) return; + currentLink = $link[0]; + var requestId = ++currentRequestId; + $previewEl.html('<p>Checking for RSS/Atom feed...</p>').show(); positionPreview(e); @@ -148,38 +151,51 @@ clearTimeout(timeout); timeout = setTimeout(function () { if (cache[url]) { - renderFeedItems(cache[url], siteName); - positionPreview(e); + if (currentLink === $link[0] && requestId === currentRequestId) { + renderFeedItems(cache[url], siteName); + positionPreview(e); + } return; } - if (url) { - checkFeed(url, function (items) { - if (currentLink === $link[0] && items) { + currentRequest = checkFeed( + url, + function (items) { + if (requestId !== currentRequestId || currentLink !== $link[0]) + return; + + if (items && items.length) { cache[url] = items; renderFeedItems(items, siteName); - positionPreview(e); } else { - $previewEl.hide(); + $previewEl.html('<p>No feed items found.</p>'); } - }); - } else { - $previewEl.hide(); - } - }, 300); - }); - $link.on('mousemove', function (e) { + positionPreview(e); + }, + function () { + if (requestId !== currentRequestId || currentLink !== $link[0]) + return; + $previewEl.html('<p>Failed to load feed.</p>'); + positionPreview(e); + } + ); + }, 300); + } else if (e.type === 'mousemove') { if ($previewEl.is(':visible')) positionPreview(e); - }); - - $link.on('mouseleave', function () { + } else if (e.type === 'mouseleave') { clearTimeout(timeout); timeout = null; currentLink = null; + + if (currentRequest) { + currentRequest.abort(); + currentRequest = null; + } + $previewEl.hide(); - }); + } }); $(document).on('click', function (e) { @@ -189,6 +205,7 @@ }); } + if (document.readyState === 'complete' || document.readyState === 'interactive') { init(); } else { |