UserJS - początki, Jak załadować kod/jak zmienić coś na stronie

w dziale Aplikacje dla Opery
TheSnake92 napisał(a):

Witam, zaczynam zabawe z UserJS i mam pewien problem. Chciałbym wykonać prostą czynność jaką jest podmiana ciągu znaków, np. napis "Forum" zamienić na "Board". Jak moge to zrobić? (wiem, że trzeba użyc funkcji "replace", ale nie wiem jak to wykonać w UJS). Jeżeli ktoś wie proszę o odpowiedź bądź nakierowanie.

Pozdrawiam.

PLUser napisał(a):

Tworzysz plik jakbyś pisał JS dla swojej strony, tyle że musisz poczekać na załadowanie strony, więc w tym pliku dajesz np. coś takiego:

document.addEventListener("DOMContentLoaded", JW___moj_start, false);

function JW___moj_start()
{
robie_co_chce_ze_strona();
}

TheSnake92 napisał(a):

Ok, to już wiem o co z tym chodzi, ale mam problem z tym zamienianiem tekstu. Mam kod źródłowy i np. jest w nim "<b>Forum</b>" i chciałbym to zamienić na "<i>Board</i>", aby użyc metody "replace" musze mieć tekst, na któym chcę tego użyc. Jak moge zrobić, aby "pobrało" kod i nadpisało go z zmienioną wartością? (Tak jak bym wszedł w źródło, zmienił kod i dał "Zastosuj zmiany").

nowotny napisał(a):

1. Wybierz element, w którym znajduje się dany tekst (np. za pomocą którejś z metod typu getElement*)
2. Pobierz kod HTML tego elementu za pomocą właściwości innerHTML
4. Zamień tekst na inny za pomocą metody replace
5. Przypisz nowy kod HTML temu elementowi za pomocą właściwości innerHTML

TheSnake92 napisał(a):

Ok za pomocą "getElementById" potrafie zamienić, ale cały czas mam problem z "getElementsByTagName". Mam plik HTML

<div id="d"><p>Treść</p>
<p id="lol">Bardziej <a href="http://www.google.pl" target="_blank">skomplikowane</a></p>
</div>

i UJS
// ==UserScript==
// @name          test
// @description   test
// @include       http://localhost/*
// @copyright     TheSnake
// ==/UserScript==
document.addEventListener(
	'load',
	function (e) {
		var d = document.getElementsByTagName('p');
		h = d.innerHTML;
		alert(h);
	},
	false
);

Używając "getElementById" zwracało poprawną treść, a "ByTagName" zwraca "undefined". Gdzie robie błąd?

Barthezdeleted napisał(a):

Originally posted by TheSnake92:

a "ByTagName" zwraca "undefined". Gdzie robie błąd?


getElementByTagName zwraca tablicę z wszystkimi tagami w dokumencie/oknie. Należy potem wybrać który konkretnie element (tag) nam chodzi.

O ile oczywiście dobrze pamiętam wink

PLUser napisał(a):

Originally posted by Barthez:

Originally posted by TheSnake92:

a "ByTagName" zwraca "undefined". Gdzie robie błąd?


getElementByTagName zwraca tablicę z wszystkimi tagami w dokumencie/oknie. Należy potem wybrać który konkretnie element (tag) nam chodzi.

O ile oczywiście dobrze pamiętam wink



Bardzo dobrze pamiętasz smile
Czyli linijka powinna brzmieć tak:
h = d[0].innerHTML;

Barthezdeleted napisał(a):

Może warto użyć DOMContentLoaded zamiast load ? Bo teraz skrypt będzie chyba czekał aż dociągnie się każdy obrazek na stronie, a to przecież nie potrzebne smile

TheSnake92 napisał(a):

Ok, przy waszej pomocy napisałem prosty UserJS, który naprawia animacje marquee (bo nie działało mi z wszystkimi atrybutami):

// ==UserScript==
// @name          Pozdrowienia phpBB by Przemo na Operze
// @description   Naprawia pasek "Pozdrowienia" w przeglądarce Opera
// @include       Adres strony przkładowego forum z Pozdrowieniami
// @copyright     TheSnake
// ==/UserScript==
document.addEventListener(
	'DOMContentLoaded',
	function (e) {
		var martag = document.getElementsByTagName('marquee');
		martag[0].removeAttribute('scrollamount');
		martag[0].removeAttribute('scrolldelay');
		martag[0].removeAttribute('truespeed');
		kod = martag[0].innerHTML;
		martag[0].innerHTML = kod;
		
		var b = document.getElementsByTagName('b');
		var kod2 = b[5].innerHTML;
		kod2 = kod2.replace('Pozdrowienia', '<u>Pozdrowienia - Naprawione by TheSnake</u>');
		b[5].innerHTML = kod2;
	},
	false
);


Taki kodzik dla użytkowników "mojego" forum. Błąd występował w funkcji "marquee" gdzie istniały atrybuty scrollamount, scrolldelay i truespeed'. Po usunięciu ich wsyzstko ładnie działa smile. Dziękuje i pozdrawiam.

TheSnake92 napisał(a):

Właśnie to zauważyłem, dzięki Barthez.
Jeszcze jedno, można zrobić tak, aby skrypt wykonał się po jakimś czasie od rozpoczęcia ładowania strony? Np. wchodzę na stronę i po 2 sekundach (nawet jeżeli się strona nie załadowała) skrypt się wykonuje? Chcę zrobić skrypt, który usunie jedną tabelkę (table) i trochę nie fajnie wygląda jak strona się ładuje normalnie, a dopiero potem tabelka znika.

Pozdrawiam.

nowotny napisał(a):

Originally posted by TheSnake92:

i trochę nie fajnie wygląda jak strona się ładuje normalnie, a dopiero potem tabelka znika.


Funkcja setTimeout... Ale zastosowanie tej funkcji przecież jeszcze bardziej uwypukli ten problem... :/

daroc napisał(a):

To może przy pomocy setInterval sprawdzaj co 10 milisekund, czy obiekt znajdujący się bezpośrednio pod tabelką istnieje. Jeśli tak, to tabelka zapewne też istnieje i można na niej operować. Ale wtedy możliwe że i tak tabelka pojawi się na jakiś ułamek sekundy.