removing an element with a userscript - userscripts

First attempt at a userscript, and despite finding numerous examples on the internet of how to remove elements from a page, none of them work (and this looks like one of the most basic applications of a userscript, too).
Using violentmonkey-2.12.8 on this page:
https://www.zerohedge.com/economics/2020-greatest-hits-most-popular-articles-past-year-and-look-ahead
I want to remove the "exitModalOverlay" div (disabling it in the developer tools does exactly what I want), which blacks out the page (preventing me from reading it).
I will insert one of the more common techniques I have found (which doesn't work). I would appreciate any method which does. Thanks.
// ==UserScript==
// #namespace confused
// #name zehohedge_remove_subscription_popup
// #version 1
// #description removes the overlay div that asks to subscribe
// #match https://www.zerohedge.com/*
// #grant none
// #noframes
// ==/UserScript==
var todelete = document.getElementById('exitModalOverlay');
if (todelete) { todelete.parentNode.removeChild(todelete); }

Based on the post & comments, it seems the element is loaded/created after the DOM. In that case, you would need to run the script after page loading is complete.
Although when testing on the link provided with JavaScript enabled (https://www.zerohedge.com/economics/2020-greatest-hits-most-popular-articles-past-year-and-look-ahead), the element does not appear, here is an example of how you can remove the item.
It is possible there are other factors involved (e.g. browser, country, login, cookies etc).
ViolentMonkey by default runs on document-end which is after DOM loaded but before all external elements are loaded.
Setting the userscript to run at document-idle will run after everything is loaded.
// ==UserScript==
// #namespace confused
// #name zehohedge_remove_subscription_popup
// #version 1
// #description removes the overlay div that asks to subscribe
// #match https://www.zerohedge.com/*
// #grant none
// #noframes
// #run-at document-idle
// ==/UserScript==
// find element
const todelete = document.getElementById('exitModalOverlay');
// remove element if found
if (todelete) { todelete.remove(); }
Removing the element is not the only way to get rid of an element. You can also use CSS to achieve a similar outcome by setting its display to none. For example:
// ==UserScript==
// #namespace confused
// #name zehohedge_remove_subscription_popup
// #version 1
// #description removes the overlay div that asks to subscribe
// #match https://www.zerohedge.com/*
// #grant GM_addStyle
// #noframes
// ==/UserScript==
const css = `
#exitModalOverlay {
display: none;
}`;
GM_addStyle(css);
Using JavaScript to apply CSS to the element without GM_addStyle (although not as good as above)
// ==UserScript==
// #namespace confused
// #name zehohedge_remove_subscription_popup
// #version 1
// #description removes the overlay div that asks to subscribe
// #match https://www.zerohedge.com/*
// #grant none
// #noframes
// #run-at document-idle
// ==/UserScript==
// find element
const todelete = document.getElementById('exitModalOverlay');
// remove element if found
if (todelete) { todelete.style.display = 'none'; }
📌 It is worth noting that CSS applies all the time (unless over-written specifically), even if an element is created later, while JavaScript applies at the time it runs and will not apply to elements created later (without additional methods to cause it to run again).

Maybe so...
window.onload = function() {
var todelete = document.querySelector('#exitModalOverlay');
todelete.outerHTML = '';
}
or
window.onload = function() {
var todelete = document.querySelector('#exitModalOverlay');
todelete.remove();
}

Related

Replacing an extension-less image in gmail HTML view with tampermonkey

On HTML gmail view top left corner the new Gmail logo could be seen. I want to replace it with the old one ( https://i.imgur.com/kAQfeoj.png ) but I'm not sure how. I've tried a 9 year old stackoverflow thread but it didn't work since the gmail logo link isn't a link to the file with an extension.
found a way
// ==UserScript==
// #name Image Replacer
// #version 1.1
// #description Image Replacer
// #require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// #match https://www.pinterest.com/pin/*
// #grant none
// ==/UserScript==
/*globals $*/
var old_url = "https://ci6.googleusercontent.com/proxy/WQ_JO_iFWK3AKuIPeHz_fnMMOaGLG0HAsCJWOkWiRo9Oa_NHUeQYCdmJEfw8llIVJ8fMP1mriJ81iPzrebHtesFsF7VIDS0QKCFmqu_RMT_-ow=s0-d-e1-ft"
var new_url = "https://i.imgur.com/kAQfeoj.png"
$(document).ready(function(){
$("img[src='"+old_url+"']").attr("src", new_url);
});

Why does a tampermonkey script for https://news.google.com/* appear in the menu for https://www.nytimes.com/?

I have a tampermonkey script with this header:
// ==UserScript==
// #name Google News - Remove old articles
// #namespace http://tampermonkey.net/
// #version 0.2
// #description Remove articles that already appeared recently
// #author AC
// #require http://code.jquery.com/jquery-latest.js
// #match https://news.google.com/*
// #icon https://www.google.com/s2/favicons?domain=google.com
// #grant none
// ==/UserScript==
When I am on the page https://www.nytimes.com/ and I click on the tampermonkey icon in the Firefox toolbar, this script appears. Why?
Because the page contains an iframe, and that iframe links to news.google.com:
Userscripts run in iframes, and when they do, they get added to the Tampermonkey icon at the top.

How Do I Make A Tampermonkey Userscript Replace Words In Text Files?

6 years ago I asked a question about rewriting text files displayed in a browser using greasemonkey.
Can I Make Greasmonkey Scripts Run On Text Files?
I am now coming back to a similar problem and I tried to paste it in to Tampermonkey but it doesn't replace the text.
What am I doing wrong here?
// ==UserScript==
// #name Rewrite LLVM License
// #namespace http://tampermonkey.net/
// #version 0.1
// #match http://llvm.org/releases/2.8/*
// #include http://llvm.org/releases/2.8/LICENSE.TXT
// #require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// #grant none
// ==/UserScript==
(function() {
//Just to tell the linter that $ is defined in jquery
/* global $ */
//Browsers display text in a pre tag
var pageTextNd=$("body > pre");
//Replace the text LLVM
var newPageTxt=pageTextNd.text().replace("LLVM", "Ernst Blofeld");
//Rewrite the page
pageTextNd.text(newPageTxt);
})();
It looks like the page you're interested in redirects to:
https://releases.llvm.org/2.8/LICENSE.TXT
so that's what you need to set your #include or #match to.
You also want to replace all instances of LLVM, so use .replaceAll:
// ==UserScript==
// #name Rewrite LLVM License
// #include https://releases.llvm.org/2.8/LICENSE.TXT
// #require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// #grant none
// ==/UserScript==
(function() {
//Just to tell the linter that $ is defined in jquery
/* global $ */
//Browsers display text in a pre tag
var pageTextNd=$("body > pre");
//Replace the text LLVM
var newPageTxt=pageTextNd.text().replaceAll("LLVM", "Ernst Blofeld");
//Rewrite the page
pageTextNd.text(newPageTxt);
})();
If you don't want to rely on replaceAll, use a regular expression with .replace instead: /LLVM/g.
It seems quite strange to rely on jQuery for something this trivial though - you can very easily accomplish this without a library:
// ==UserScript==
// #name Rewrite LLVM License
// #include https://releases.llvm.org/2.8/LICENSE.TXT
// #grant none
// ==/UserScript==
const pre = document.querySelector('body > pre');
pre.textContent = pre.textContent.replaceAll('LLVM', "Ernst Blofeld");

How do I take text contained in web page and make it part of the page title?

I desperately need help with writing a Tampermonkey/Greasemonkey script that takes part of the information within the web page and makes it part of the page (and window) title.
A client's name is part of the target (internal) web page, and clearly labeled within the HTML:
<div id="patient-info" class="ehr-patients-info">
<div id="patient-identification">
<span title="" id="patient-name">
Johnnyfirst
Smithylast
</span>
</div>
...
I want to add the text "Johnnyfirst Smithylast" to the window title and tried:
var ptname = document.getElementById("patient-name") ;
document.title = document.title + " | Name: " + ptname ;
But that resulted in titles like: ...| Name: null.
The second problem is that the web site to which I am piggybacking this userscript doesn't load all at once. After the initial page load, there's heavy javascript functionality which loads various parts of the page and ends up displaying the client name as above.
When I try $(window).on('load', function() { ... }) or $(document).ready(), it seems to be acting on a preliminary version of the web page that doesn't have the information fully loaded yet.
Your target page is AJAX driven and Greasemonkey/Tampermonkey fires way before most AJAX page loads finish. So, you must use techniques like MutationObserver, waitForKeyElements, etc., to compensate.
For example, here's a complete Tampermonkey script that changes the title when it finds the patient-name node:
// ==UserScript==
// #name _Put the patient Name in the title
// #match *://YOUR_SERVER.COM/YOUR_PATH/*
// #noframes
// #require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// #require https://gist.github.com/raw/2625891/waitForKeyElements.js
// #grant GM_addStyle
// #grant GM.getValue
// ==/UserScript==
// #grant none
//- The #grant directives are needed to restore the proper sandbox.
/* global waitForKeyElements */
/* eslint-disable no-multi-spaces, curly */
'use strict';
waitForKeyElements ("#patient-name, .patient-name", scrapeTextToTitle);
function scrapeTextToTitle (jNode) {
var nameRaw = jNode.text ().trim ();
var nameSanitized = nameRaw.replace (/\s+/g, " ");
document.title += " | Name: " + nameSanitized;
}

Tampermonkey script not auto-updating

At the top of my script I have the following:
// ==UserScript==
// #name Test script
// #description testing auto-update
// #namespace http://tampermonkey.net/
// #author newbie
// #version 1.0.0
// #updateURL https://github.com/mygithubaccount/test/raw/master/test.user.js
// #downloadURL https://github.com/mygithubaccount/test/raw/master/test.user.js
// #match http://awebsite.com/*
// #run-at document-end
// #grant GM_getResourceText
// #grant GM_addStyle
// #grant GM_xmlhttpRequest
// #grant GM_getResourceURL
// #grant GM_xmlhttpRequest
// ==/UserScript==
Please note that these values are just for example.
When I make changes on the script and increase the version number on github and then push the changes to master it updates the raw script link, however I don't get auto-updates from Tampermonkey as in popups saying the script has an update. It will only update if I manually go to the link and reinstall the script to update it.
How can I make this auto-update with popups?
I am not an expert at userscripts, can only tell from my experience making TamperMonkey work:
In order for TamperMonkey to update, I had to copy&paste the URL into Update URL: on the script's Settings tab:
(Make sure ☒ Check for updates is turned on, obviously.)
Then if you manually Check for userscript updates on the TamperMonkey icon, you should see a proper popup.

Resources