"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Replace HTML using JavaScript

daisho 08.11.2018 - 13:53 3371 17
Posts

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Ich bin gerade dabei mir gerade ein kleines (TamperMonkey-)Script zu basteln um ein paar Elemente bestimmter Websites zu ändern. Style-Sheets zu ändern ist recht leicht, ich habe aber nur sehr wenig JavaScript Erfahrung.

Derzeit versuche ich gerade ein DIV Element zu ändern, leider haben die alle keine ID (es sind quasi lauter verschachtelte DIV tags ineinander die verschiedene Klassen besitzen).

Das was ich versuche zu ändern sieht so aus:

Code:
<div class="slds-grid slds-gutters_small mdp cols-2 forcePageBlockSectionRow" data-aura-rendered-by="871:0" data-aura-class="forcePageBlockSectionRow">

Davon möchte ich einfach den ersten Block "slds-grid" entfernen. Die DIV tags unterscheiden sich auf dieser Ebene quasi nur durch die Nummer bei data-aura-rendered-by="xxx:0" (die anderen möchte ich nämlich unangetastet lassen).
<div class="slds-grid slds-gutters_small mdp cols-2 forcePageBlockSectionRow" data-aura-rendered-by="871:0" data-aura-class="forcePageBlockSectionRow">

Also das Resultat sollte so aussehen:
Code:
<div class="slds-gutters_small mdp cols-2 forcePageBlockSectionRow" data-aura-rendered-by="871:0" data-aura-class="forcePageBlockSectionRow">


Es ist vermutlich deppen-einfach, nur wie gesagt so gut wie keine Programmiererfahrung.

Mein aktuelles Script sieht in etwa so aus (funktioniert natürlich nicht):

Code:
(function() { 

'use strict';
   document.body.innerHTML = document.body.innerHTML.replace("slds-grid slds-gutters_small mdp cols-2 forcePageBlockSectionRow\" data-aura-rendered-by=\"872",
                                                             "slds-gutters_small mdp cols-2 forcePageBlockSectionRow\" data-aura-rendered-by=\"872");
})();
Bearbeitet von daisho am 09.11.2018, 10:00

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2330
ev. so:
Code:
var elems = document.querySelectorAll(".signature"); 
[].forEach.call(elems, function(element) { 
  element.classList.remove("sfb"); 
});
(ein beispiel mit oc.at divs/klassen)

berndy2001

Komasäufer
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 1947
Bin auch ein n00b, aber meine Idee dazu:
Sind die klassen auf den verschiedenen div´s einmalig? Wenn ja, jquery einbinden und mit $( "div.slds-gutters_small" ) ansprechen, .removeClass() zum entfernen.

ill

...
Avatar
Registered: Nov 2003
Location: Salzburg
Posts: 2053
Ich würds auch so wie meepmeep machen.
Je nach verwendetem Browser kann man die Syntax noch ein bisschen einfacher machen, aber ein Iterieren über eine NodeList, die du dir über eine gemeinsame Klasse holst, ist sicher die am einfachsten zu verstehende Lösung.

Code:
let elems = document.querySelectorAll('.slds-grid');
elems.forEach( (elem) => { elem.classList.remove("slds-grid") });

^ Sollte zumindest in neuen Chromium Browsern funktionieren und ist jetzt mmn auch nicht total furchtbar ;)

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Das Script macht zumindest bei mir (Chrome v70) nichts sichtbares.
So wie es für mich aussieht würde es die Klasse aber auch überall entfernen? Das wäre auch nicht das was ich wollen würde.


Bei mir im Browser sieht es so aus (es ist leider eine interne Website, deswegen kann ich nicht einfach eine URL posten und es hätte auch keiner Zugang).
div_234201.png

Das "Description" Feld wollte ich prinzipiell einfach breiter machen und das geht indem man von dem einen DIV Tag die slds-grid Klasse wegnimmt (die restlichen Felder darüber und darunter sollten das behalten), die prinzipiell lt. CSS einfach display:flex drauf klatscht.
Code:
.slds-grid{
    display:flex
}



/Edit: Ist nur ein persönliches Anliegen (OCD schlägt zu), dachte nur ich poste es da es für einen versierten User ev. ein Einzeiler ist :p Soll nicht in zuviel Arbeit ausarten.
Bearbeitet von daisho am 08.11.2018, 14:35

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2330
Du kannst ja auch erst das parent suchen (zb slds-form) und auf das dann querySelectorAll. Dann wirds nicht überall entfernt sondern nur unterhalb von slds-form.

Bin grad in der ubahn, sonst würd ichs schöner posten :D

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Ich check deine Frage irgendwie ned :D. Du hast eine Anzahl an HTML-Elementen mit einer CSS-Klasse "slds-grid" und du möchtest eben diese Klasse von jedem Element entfernen. Dann ist das Snippet von ill das richtige. Aber du sagst du willst es nicht auf der gesamten Seite entfernen?

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Ich will nur genau von dem einen DIV Tag (identifizierbar durch data-aura-rendered-by="872:0") die slds-grid Klasse wegnehmen, alle anderen können (oder sollen) so bleiben wie sie sind.

Ich versuche es gerade mit:
Code:
var descr = document.$('div[data-aura-rendered-by="872:0"]');
descr.classList.remove("slds-grid");
Das macht aber auch nichts.

Das Script von ill macht leider auch gar nichts, obwohl ich vom Text her vermuten würde das es überall auf der Seite alle slds-grid Klassen wegnehmen sollte.

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2330
Dann suchs mit doc.findElementByAttribute("data-aura-rendered-by", "872:0"); und lösch die klasse raus

Snoop

Here to stay
Registered: Jun 2002
Location: Gablitz
Posts: 1075
verwendest du ein javascript framework welches das dom nach dem laden verändert?
falls ja, pack deine manipulationen in eine function und ruf sie als callback auf

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25375
Code: JAVASCRIPT
$('div[data-aura-rendered-by="872:0"]').removeClass('slds-grid');
Wenn jQuery-Code überhaupt möglich ist. Es könnte auch sein, dass du $() mit dem allgemein kompatibleren jQuery() ersetzen musst.

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Pfui, ihr mit eurem jQuery immer :p.

Code: JAVASCRIPT
document.querySelectorAll('[data-aura-rendered-by="987:0"] .slds-grid').forEach(element => {
  element.classList.remove('slds-grid');
});

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Zitat aus einem Post von -=Willi=-
Pfui, ihr mit eurem jQuery immer :p.

Code: JAVASCRIPT
document.querySelectorAll('[data-aura-rendered-by="987:0"] .slds-grid').forEach(element => {
  element.classList.remove('slds-grid');
});

Die Methode habe ich auch gerade auf stackoverflow gefunden :p

Hier mal mein komplettes Script
Code: JAVASCRIPT
// ==UserScript==
// @name         Title
// @namespace    [url]http://tampermonkey.net/[/url]
// @version      0.1
// @description  Description!
// @author       Author
// @match        [url]https://myurl/[/url]
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  document.querySelectorAll('[data-aura-rendered-by="871:0"] .slds-grid').forEach(element => {
  element.classList.remove('slds-grid'); });

  document.querySelectorAll('[data-aura-rendered-by="872:0"] .slds-grid').forEach(element => {
  element.classList.remove('slds-grid'); });

})();
Leider macht das ebenso nichts auf der Seite (keine Veränderung und lt. Dev Tools sind die Klassen immer noch vorhanden :(

Snoop

Here to stay
Registered: Jun 2002
Location: Gablitz
Posts: 1075
Zitat aus einem Post von Snoop
verwendest du ein javascript framework welches das dom nach dem laden verändert?

edit: du kannst jeden der Vorschläge hier knicken, wenn sie zum falschen Zeitpunkt triggern ;)
Bearbeitet von Snoop am 08.11.2018, 16:02

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19585
Zitat aus einem Post von Snoop
verwendest du ein javascript framework welches das dom nach dem laden verändert?
falls ja, pack deine manipulationen in eine function und ruf sie als callback auf
Keine Ahnung (die Seite lädt einige verschiedene .js, unter anderem von SalesForce) und keine Ahnung how to. Wie gesagt, ich habe nicht wirklich Erfahrung mit dem Programmieren, dachte mir nur es geht ev. recht schnell. Ich verbrenne da eh schon viel zu viel Zeit für so eine winzige Änderung :p
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz