fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: download links cannot be refreshed through js - #5105

Closed
ghost wants to merge 3 commits into
mainfrom
unknown repository
Closed

fix: download links cannot be refreshed through js#5105
ghost wants to merge 3 commits into
mainfrom
unknown repository

Conversation

@ghost

@ghostghost commented Mar 12, 2023

Copy link
Copy Markdown

【Problem】

#5102.

【Reason】

As far as I see, when using 'querySelectorAll', it will first search for the whole page and return you the result directly, sometimes the link name of the element is changed but NOT saved in the storage of querySelector DOM itself.

So A better solution is to search for the element after the DOM frame is loaded without loading the DOM contents...ect.

For more:

  1. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script#defer
  2. https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors

1678603843932

MaledongGit added 2 commits March 12, 2023 14:37
Problem:
Reason: As far as I see, when using 'querySelectorAll' will store the
whole page and return you the result directly, so the page should be
fully-loaded. Sometimes there's problems when using
"<Script...beforeInactive>" and I change it to "defer async" so as to
speed up the loading of js files as well as to make sure the whole page
is loaded, we can change the link instead of partially loading.
@ghost

Copy link
Copy Markdown
Author

PS:Another way is to change the querySelector to getElementById(), which will find the real element again and again, no matter whether the page is stored or not (Live in searching). But now it seems to change the loading way of js gets me also fine.

Comment threadpages/_document.tsx
<Main />
<NextScript />
<Script strategy="beforeInteractive" src="/static/js/legacyMain.js" />
<script src="/static/js/legacyMain.js" defer async />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why removing the Script tag from nextjs? Which kind o tests you made that resulted in this conclusion?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the customized event handlers' problem for listening after all the other js files of next.js are loaded successfully for querySelectoAll()……I also wonder if it's a better solution?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really, it's more like the following:

  1. The next/link component takes an href argument, which is pretty much what our JavaScript legacy script does, replace the URL
  2. But the thing is that next/link also sets up "click" events and other kinds of events. These events are managed by a React component, meaning if there's a re-render or whatever the internal logic is, it will ignore our "href" attribute.
  3. Not to mention, "click" event has precedence over "href". So basically, us replacing the "href" probably has no effect at that point in time. Note that I am just making a wild guess here.

But the actual solution is for now to not use next/link, we probably also should not use it for external links, as it was primarily made for internal links.

@ovflowd

Copy link
Copy Markdown
Member

With all due respect, I don't think your PR is fixing anything.

@ovflowd

ovflowd commented Mar 12, 2023

Copy link
Copy Markdown
Member

@MaledongGit, my concerns here are the following:

  • You seem to be doing many unrelated changes without explaining why.
  • The description of the PR has nothing to do with the changes nor explains why these changes
  • You should know that changing the script to async defer doesn't solve any issue; you're deferring the script's load to be the last JavaScript module to be loaded. This can cause many complications, as we're invoking the script "start" function on the Component mount of' Theme'. By deferring its load, the script may not be available when React attempts to call its start method. The next/script with beforeInitiative type ensures this is the first script to load immediately after Next.js's Framework is loaded (before the Application gets loaded).
  • The bug mentioned in Nodejs download page is acting weird #5102 has nothing to do with the changes of this PR; please read fix: windows download incorrectly selects 32bit on 64bit machine #5025 for context.
  • The screenshot attached to Nodejs download page is acting weird #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Please, keep these points in consideration. I'm inclined to close this PR, as it doesn't solve any issues, but I want to hear you out, with your points, on why you changed the props of an unrelated component and the label-for part of the Component.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

why you changed the props of an unrelated component and the label-for part of the Component.

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

@ghost

ghost commented Mar 13, 2023

Copy link
Copy Markdown
Author

The screenshot attached to #5102 has an "error" on the console. That is not an error. next/link tries to prefetch routes, but we should not use next/link for external routes.

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "<Link>", however some of them work properly with console errors, should I change them or just fix this?

@ghost

Copy link
Copy Markdown
Author

In the end, I found it seems we're now having another fix for bugs like this, so I'd close mine.
Thanks!

@ghostghost closed this Mar 13, 2023
@ghost
ghost deleted the fixJsLoad branch March 13, 2023 01:17
@ovflowd

Copy link
Copy Markdown
Member

Do you mean "labels["download-for"] ? Ah yes, this is a typo error and it should be this instead of "labels["download"] in i18n. I'm now inverstigating in it and found the problem, just fix it together.

Yeah, I wonder why you made the change? 🤔

@ovflowd

Copy link
Copy Markdown
Member

Ah yes, I also found it later, can I help to change them?

I found there're many external routes in "", however some of them work properly with console errors, should I change them or just fix this?

Sure, but I made a PR already hours hours ago hehe

This pull request was closed.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ovflowd