Modyfikacja markup'u w <iframe>

Modyfikacja markup'u w <iframe>
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Witam. Mam problem z eval() które operuje na takim kodzie w iframe zad5pl_html

Kopiuj
<br><button>Pobranie</button><button>Zapisz</button><button>Kasowanie</button>
<br><DIV>dddd</DIV>  

Kod skryptu to:

Kopiuj
let u=0;
function pobierz(){ let i = prompt("Jaka nazwa?");return i;};
function wyswietl(nowa){ document.querySelectorAll("DIV")[0].innerHTML=nowa;};
function wyczysc(){document.querySelectorAll("DIV")[0].innerHTML="";};

document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");
document.querySelectorAll("BUTTON")[1].setAttribute("onClick","wyswietl(u);");
document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");

pierwsza funkcja pobiera zmienna prawidłowo.
trzecia funkcja kasuje pole div prawidłowo.
druga funkcja nie robi nic - jeśli dodam alert() wyświetla komunikat.

Ogarnia ktoś?

edytowany 3x, ostatnio: Riddle
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
1
infinityhost napisał(a):

Ogarnia ktoś?

Ja nie ogarniam i nie chce mi się ogarnąć tego kodu, bo tego tak dzisiaj nikt nie pisze (kod w stringach, bez przesady...). No może 20 lat temu się tak pisało. Jeśli to część jakiegoś zadania / rzeczy, którą chcesz robisz od zera w 2022 (a nie kawałek legacy kodu sprzed 20 lat znalezionego na starej dyskietce), to napisz to najpierw jakoś po ludzku.

zamiast bawić się w ustawianie atrybutu onClick na stringa...

Kopiuj
document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");
// ...

to zrób normalnie po ludzku addEventListener i przypisz funkcję do eventu:

Kopiuj
document.querySelectorAll("button")[0].addEventListener("click", () => {
   u=pobierz();
});
document.querySelectorAll("button")[1].addEventListener("click", () => {
   wyswietl(u);
});
document.querySelectorAll("button")[2].addEventListener("click", () => {
   wyczysc();
});

I potem można to analizować i się zastanawiać, co jest nie tak.

druga funkcja nie robi nic - jeśli dodam alert() wyświetla komunikat.

co wyświetla ten komunikat? Albo lepiej - zrób console.log i zobacz w konsoli developerskiej w przeglądarce, co ci wyświetla. Czy nowa jest dobrą wartością i czy łapie element el.

Kopiuj
 function wyswietl(nowa){ 
    console.log("nowa", nowa); 
    const el = document.querySelectorAll("DIV")[0];
    console.log("el", el);
    el.innerHTML=nowa;
 };

BTW
wrzuciłem ten kod, który masz w pierwszym poście do pliku HTML (otaczając JS w tag <script>)

Kopiuj
<button>Pobranie</button><button>Zapisz</button><button>Kasowanie</button>

<DIV>dddd</DIV>

<script>

	let u=0;
function pobierz(){ let i = prompt("Jaka nazwa?");return i;};
function wyswietl(nowa){ document.querySelectorAll("DIV")[0].innerHTML=nowa;};
function wyczysc(){document.querySelectorAll("DIV")[0].innerHTML="";};

document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");
document.querySelectorAll("BUTTON")[1].setAttribute("onClick","wyswietl(u);");
document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");

</script>

i to działa (w Chrome przynajmniej). Może więc problem leży gdzie indziej? Bo mimo, że napisane jest po "nienowoczesnemu", to jednak robi to, co ma robić.


edytowany 6x, ostatnio: LukeJL
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Myślałem, że piszę wyraźnie ale powtórzę

Kopiuj
document.querySelectorAll("BUTTON")[1].setAttribute("onClick","wyswietl(u);");  - NIE DZIAŁA.
document.querySelectorAll("BUTTON")[1].setAttribute("onClick","alert();wyswietl(u);"); - WYŚWIETLA KOMUNIKAT i dalej nie robi NIC.

Przecież to musi działać, bo funkcja wyczyść czyści pole DIV czyli ma do niego dostęp. A chodzi o to żeby wypełnić jego wnętrze tekstem. Jak dodam jeszcze jeden alert na końcu to wyświetli komunikat 2 razy a środkowej fukcji nie uruchomi i tak.

@LukeJL: ale co tu analizować? Przecież to jest parę linijek które muszą działać.
Jeszcze raz powtórzę. Uruchamiam w oknie iframe funkcję eval() której parametrem jest textarea.value z window.top.

edytowany 2x, ostatnio: Riddle
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
0

No właśnie tak jak napisałem (edytując swój poprzedni post), wrzuciłem ten kod, co masz i on działa. Czyli wydaje się, że sam kod nie jest przyczyną niedziałania.

infinityhost napisał(a):

Uruchamiam w oknie iframe funkcję eval() której parametrem jest textarea.value z window.top.

Jak to robisz? I po co w sumie odpalasz eval? Co cię skłoniło do tego?


edytowany 1x, ostatnio: Riddle
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Robię konsole do generowania strony HTML - skrypt w oknie głównym pobiera zawartość z 3 okien textarea (w jednym mam kod HTML, w drugim CSS i w trzecim kod skryptu) + pare funkcji operujących na wnętrzu docelowego iframe(żeby działały wewnątrz). I potem to wszystko zapisuje do iframe za pomocą srcdoc. I potem pod przyciskiem w window.top mam podpięte zdarzenie onClick które uruchamia funkcje (nie pamietam czy ten eval jest w tym iframe czy nie)(wcześniej dodaną do kodu w oknie głównym) z zawartościa textarea.value z okna głównego. Chyba normalne. Ty tego nie robiłeś?

Problem jest w tym , że to samo polecenie alert() wykonane w najbliższym otoczeniu funkcji wyswietl() działa a już ona sama nie. Jeszcze dziwniejsze jest że ta sama procedura przygotowana pod następnym przyciskiem czyści to pole DIV (ktore ma czyścic) czyli dostęp do niego ma.

http://infinityhost.cba.pl/

tam klikasz przycisk "funkcje" w oknie po lewej stronie i ładuje ci środowisko.

Skopiowałem Twój kod do okna HTML i jest ten sam wynik - alertuje, czyści div ale go nie nadpisuje jego zawartości. W edge to nie działa, w firefox też nie. W operze też nie.

Przez to z całą robotą stoję.

W sumie to kod generujący wygląda tak (tworzący okno iframe'a) ---

Kopiuj
<button class="work_area_select_button" onClick= "preview_frame.srcdoc='<html><head><style>'+view_style_editor.value+'</style></head>'+view_text_editor.value+'<script>'+view_script_editor.value+'tmp=document;function skryptuj(val){eval(val);};function wyswietl(nr){};wynik=function(src){window.top.main_run_show_output_help_frame.srcdoc=src;console.log=window.top.wynik;}</script></html>';"> wyświetl </button>
edytowany 11x, ostatnio: Riddle
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
1

Jeśli generujesz cały kod na zasadzie sklejania stringów (a nie na obiektach), to wszystko się tu może zadziać np.

Kopiuj
preview_frame.srcdoc='<html><head><style>'+view_style_editor.value+'</style>

tu wystarczy, że view_style_editor.value będzie zawierał jakieś głupoty i juz struktura HTMLa może być inna (lepsze podejście byłoby tworząc ten styl za pomocą document.createElement('style') czy używając CSSStyleSheet https://web.dev/constructable-stylesheets/ ). No chyba, że robisz jakąś walidację tych stringów wcześniej...

W tym kodzie/podejściu jest pełno tego typu rzeczy, które być może nie mają wpływu na działanie, ale jednak mogą mieć. Więc jeśli ci coś nie działa, a nie wiesz co, to chyba najlepszym podejściem będzie przepisanie tego w jakiś bardziej elegancki sposób. Może przy okazji znajdziesz rozwiązanie problemu, a jeśli nie znajdziesz, to przynajmniej wyeliminujesz prawdopodobne przyczyny.

Więc ja trochę załamuję ręce, bo nie dostrzegam, gdzie masz faktycznie błąd (więc pewnie nie pomogłem w rozwiązaniu kluczowego problemu), ale tu jest tyle do naprawy, że prościej byłoby to przepisać na nowo, ale już zachowując jakiś rygor w tym.


edytowany 3x, ostatnio: LukeJL
IN
No ja się nie dziwie, 10 linijek kodu nie robi tego co powinno. A tam są chyba same najbardziej podstawowe rzeczy.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
infinityhost napisał(a):

Witam. Mam problem z eval() które operuje na takim kodzie w iframe zad5pl_html
[...]
pierwsza funkcja pobiera zmienna prawidłowo.
trzecia funkcja kasuje pole div prawidłowo.
druga funkcja nie robi nic - jeśli dodam alert() wyświetla komunikat.

Ja to odpaliłem u siebie na Chrome i działa. Pierwszy przycisk normalnie pokazuje prompta z pytaniem o nazwę, jak kliknę "Zapisz" to się wsadza do <div>a, a jak kliknę "Kasuj" to się usuwa.

Chodzi Ci o to że na innych przeglądarkach nie działa?

PS: Sprawdziłem na Microsoft Edge, i też działa. Także moim zdaniem masz błąd gdzieś indziej.

edytowany 1x, ostatnio: Riddle
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@Riddle: @LukeJL Ale odpaliliście to w w iframe? W ogóle uruchomiliście to na tej stronie którą wskazałem? Tam wszystko działa poza tą jedną rzeczą. (zad5pl_html - jest bez znaczenia to pomocna informacja tylko do znalezienia wlasciwej zawartosci na stronie - zeby szybko na niej operowac.) Caly problem jest ze podobna funkcja czyszcząca działa bez problemu za to ta nadpisujaca juz nie. To sie chyba nie powinno dziac.

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
infinityhost napisał(a):

@Riddle: @LukeJL Ale odpaliliście to w w iframe? W ogóle uruchomiliście to na tej stronie którą wskazałem? Tam wszystko działa poza tą jedną rzeczą. (zad5pl_html - jest bez znaczenia to pomocna informacja tylko do znalezienia wlasciwej zawartosci na stronie - zeby szybko na niej operowac.) Caly problem jest ze podobna funkcja czyszcząca działa bez problemu za to ta nadpisujaca juz nie. To sie chyba nie powinno dziac.

No, to ja uruchomiłem na stronie i nie działa żaden z tych przycisków, dostaje:

Kopiuj
VM504:1 Uncaught SyntaxError: Unexpected token '<'
    at HTMLButtonElement.onclick ((index):57:70)

screenshot-20221130052903.png

dodatkowo, wrzuciłem sobie output Twojej strony do https://validator.w3.org/ i dostałem 281 błędów. Może któryś z tych błędów by Cię nakierował? Główny jaki się powtarza, to błąd ortograifczny, w CSS piszesz heigth zamiast height, masz też kilka zduplikowanych id, oraz elementy HTML umieszczone w niedozowolnych miejscach.

@infinityhost: A Twój problem jest taki, że próbujesz zrobić eval() na kodzie HTML, zamiast JS. eval() umie uruchomić tylko JS'a, a Ty robisz:

Kopiuj
eval(view_text_editor.value)

a w view_text_editor.value siedzi Twój HTML, więc nie zrobisz na nim eval().

edytowany 3x, ostatnio: Riddle
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@Riddle: ostatnia prośba spróbuj jeszcze:

  1. Uruchomić jeszcze raz przycisk "Funkcje" po lewej stronie - niech wyczysci srodowisko
  2. wyczyść textarea HTML i Skrypt
  3. wklej ten kod od @LukeJL
    Kopiuj
    <button>Pobranie</button><button>Zapisz</button><button>Kasowanie</button>
    
    <divx>dddd(usun x z divów bo nie wyswietla ich jak nie dodam x</divx>
    
    <script>
       let u=0;
       function pobierz(){ let i = prompt("Jaka nazwa?");return i;};
       function wyswietl(nowa){ document.querySelectorAll("DIV")[0].innerHTML=nowa;};
       function wyczysc(){document.querySelectorAll("DIV")[0].innerHTML="";};
    
       document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");
       document.querySelectorAll("BUTTON")[1].setAttribute("onClick","wyswietl(u);");
       document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");
    </script>
    
    do okna HTML i kliknij Podgląd.

Klikałeś "Podgląd" albo "Uruchom"?

Riddle napisał(a):

@infinityhost: A Twój problem jest taki, że próbujesz zrobić eval() na kodzie HTML, zamiast JS. eval() umie uruchomić tylko JS'a, a Ty robisz:

Kopiuj
eval(view_text_editor.value)

a w view_text_editor.value siedzi Twój HTML, więc nie zrobisz na nim eval().

Nieeee, nie uruchamiam eval(view_text_editor.value) tylko eval(view_script_editor.value) coś pomyliłes (chyba ze poczatkowe okno ma taki wpis -to sie czysci jeszcze wszystkiego nie poprawilem).

edytowany 5x, ostatnio: Riddle
Riddle
@infinityhost: Umieszczaj kod w znaczniki formatujące składnie ```js oraz ```html.
Riddle
Odn. usun x z divów bo nie wyswietla ich jak nie dodam x właśnie po to umieszczamy kod w znaczniki formatujące składnie, żeby się pokazały.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
infinityhost napisał(a):

Nieeee, nie uruchamiam eval(view_text_editor.value) tylko eval (view_script_editor.value) coś pomyliłes (chyba ze poczatkowe okno ma taki wpis -to sie czysci jeszcze wszystkiego nie poprawilem)

DOM Twojej strony:
screenshot-20221130053800.png

IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0
Riddle napisał(a):
infinityhost napisał(a):

Nieeee, nie uruchamiam eval(view_text_editor.value) tylko eval (view_script_editor.value) coś pomyliłes (chyba ze poczatkowe okno ma taki wpis -to sie czysci jeszcze wszystkiego nie poprawilem)

DOM Twojej strony:
screenshot-20221130053800.png

Nie , to są przyciski do operowania na środowisku, do dzialan na stronie uzywamy tych po prawej stronie. Te po lewej sluza do np. ustalania wyglądu wszystkich okien głownych w winodow.top - dzieki nim generuje cala strone i na niej operuje (przesuwam okna, ustalam style i potem kopiuje kod)

edytowany 1x, ostatnio: Riddle
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
infinityhost napisał(a):

Nie , to są przyciski do operowania na środowisku, do dzialan na stronie uzywamy tych po prawej stronie. Te po lewej sluza do np. ustalania wyglądu wszystkich okien głownych w winodow.top - dzieki nim generuje cala strone i na niej operuje (przesuwam okna, ustalam style i potem kopiuje kod)

No ale to nadal nie zmienia faktu, że te przyciski robią eval() na HTML'u co nie może działać.

IN
@Riddle: Nie przyciski tylko "jeden przycisk". (i on dalej jest zmieniany - zresztą już nie ma tego wpisu - ale działa nadal)
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Już wiem czemu to działa - bo potem w skrypcie daje main_run_script_button.setAttribute("onClick","eval(main_run_text_area.value)"); - i to jest ostateczne działanie.

Ale to nas nie zbliża ani o krok do rozwiązania problemu.

edytowany 3x, ostatnio: Riddle
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@LukeJL: zrobiłem jak chciałeś z w skrypcie dodałem createElement i też na nim nie operuje. Jak chce uzyskać dostęp np. do nazwy przycisku czyli innerText to również nie ma problemu.

ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
0

@infinityhost:

Jak się kręci w tej firmie szkoleniowej?
Uczysz że "syntax error" to się określa "nie działa" ?
Albo "nie działa bo wyskakuje jakiś alert" ?


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
IN
Czemu marnujesz mój czas?
ZD
Wyjście na np jakiś dobry kabaret nie jest marnowaniem czasu
IN
Jakiej "firmie szkoleniowej" o czym Ty bredzisz?
IN
Ja nie neguje Twojej potrzeby robienia pośmiewiska z siebie tylko - rób to na kim innym. Thx.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

"u=pobierz()" równoznaczne z "function { u=pobierz(); }" a to oznacza że to u jest zmienną lokalną i nie ma nic wspólnego z let u=0;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Wydaje mi się, że próbowałem z window.u zamiast let u; tak dałem windows.u i windows.top.u zamiast u i dalej nie działa. Ale chyba celujesz blisko. Ale to chyba dalej nie to.:(

_13th_Dragon
musisz to zrobić wewnątrz funkcji pobierz(). Aha i zmień let na var.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Nawet mi się nie chce przegryzać, weź zrób minimalny przykład i wklej kod strony tu.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Kod HTML ```
<button>Pobranie</button><button>Zapisz</button><button>Kasowanie</button>

<divx>Text</divx>

<script> let u;function pobierz(){ let i = prompt("Jaka nazwa?");return i;};function wyswietl(n){document.querySelectorAll("DIVX")[0].innerHTML=n;};function wyczysc(){document.querySelectorAll("DIVX")[0].innerHTML="";};document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");document.querySelectorAll("BUTTON")[1].setAttribute("onClick","alert();wyswietl(u);alert();"); </script>```

Jak dam w funkcji przypisanie do div wartości z prompt to działa ale ja chcę to zrobić w ten sposób który napisałem. Przecież nie będę robił miliona działań w jednej funkcji. Może problem jest że całość jest uruchamiana w eval()?

edytowany 4x, ostatnio: infinityhost
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

To mi powiedz czego nie zrozumiałeś w moim poprzednim poście?
https://www.ibspan.waw.pl/~alex/test.htm zrobiłem wg własnych instrukcji i działa.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Zrobiłeś to tak jak pisałem od początku wczytales kod strony do iframe'a za pomocą srcdoc i uruchomiles wewnętrzna funkcję która robi eval() z parametrem będącym textarea.value z window.top?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Miałeś zrobić minimalny przykład.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@_13th_Dragon: będę w domu to wstawię teraz jestem na smartfonie i nie dam rady. Wiem, że nie czytałeś wątku od początku ale na pierwszej stronie (o 21:28)wytłumaczyłem maksymalnie prosto co próbuje osiągnąć. Prosiłem Cię na samym początku żebyś się zapoznał z tematem. Niemal wszystkie fragmenty kodu już wstawiłem ale zrobię to jeszcze raz w całości.

IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@_13th_Dragon: Masz kompletny kod, bez znaku mniej nic się nie uruchomi a jak już to nie przedstawi mojego problemu.

Kopiuj

<html>
<body>
<textarea id="html_id"><button>Pobranie</button><button>Zapisz</button><button>Kasowanie</button>
<br><div>Text</div></textarea>
<textarea id="style_id"></textarea>
<textarea id="script_id">let u;function pobierz(){ let i = prompt("Jaka nazwa?");return i;};function wyswietl(n){document.querySelectorAll("DIV")[0].innerHTML=n;};function wyczysc(){document.querySelectorAll("DIV")[0].innerHTML="";};document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");document.querySelectorAll("BUTTON")[1].setAttribute("onClick","alert();wyswietl(u);alert();");</textarea>

<button onClick= "document.getElementById('iframe_id').srcdoc='<html><head><style>'+document.getElementById('style_id').value+'</style></head>'+document.getElementById('html_id').value+'<script>'+document.getElementById('script_id').value+'tmp=document;function skryptuj(val){eval(val);};function wyswietl(nr){};wynik=function(src){window.top.main_run_show_output_help_frame.srcdoc=src;console.log=window.top.wynik;}</script></html>';">Wpisz do iframe</button>

<iframe id="iframe_id"></iframe>
</body>
</html>```
Chociaż widzę teraz, że to eval to bardziej do konsoli mam ale tak czy inaczej drugi przycisk nie nadpisuje mi wartości w oknie.
edytowany 1x, ostatnio: infinityhost
IN
Te Twoje teorie ze zmiennymi lokalnymi chyba się średnio sprawdzają bo bez dawania tego w iframe kod działa bez zarzutu.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0
Kopiuj
<html>
	<head>
		<script>
			function copy_all()
			{
				//$("#iframe_id").contents().find("body").append("<div>ala ma kota</div>");
				const iframe=document.getElementById('iframe_id');
				const iframeDoc=iframe.contentWindow.document;
				iframeDoc.body.innerHTML=document.getElementById('html_id').value;
				
				const style=iframeDoc.createElement("style");
				style.innerHTML=document.getElementById('style_txt_id').value;
				iframeDoc.body.appendChild(style);
				
				const script=iframeDoc.createElement("script");
				script.innerHTML=document.getElementById('script_txt_id').value;
				iframeDoc.body.appendChild(script);

				//iframe.innerHTML="<body>ala ma kota<"+"/body>";
				//iframeDoc.innerHTML="ala ma kota";
			}
		</script>
	</head>
	<body>
		<textarea rows="8" cols="80" id="html_id">
<button>Pobranie</button>
<button>Zapisz</button>
<button>Kasowanie</button>
<br/>
<div>Source</div>
		</textarea>
		<br/>
		<textarea rows="8" cols="80" id="style_txt_id">
div { color:red; }
		</textarea>
		<br/>
		<textarea rows="8" cols="80" id="script_txt_id">
var u;
function pobierz() { return prompt("Jaka nazwa?"); }
function wyswietl(n) { document.querySelectorAll("DIV")[0].innerHTML=n; }
function wyczysc() { wyswietl(""); }
document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()");
document.querySelectorAll("BUTTON")[0].setAttribute("onClick","u=pobierz()");
document.querySelectorAll("BUTTON")[1].setAttribute("onClick","wyswietl(u);");
		</textarea>
		<br/>
		<input type="button" onclick="copy_all()" value="Wpisz do iframe" />
		<br/>
		<iframe id="iframe_id">
		</iframe>
	</body>
</html>

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Wielkie dzięki!
Trochę potestuje to Twoje rozwiązanie, bo chyba można na nim sporo i fajnie podziałać! xD

Dodałem konsolę za pomocą funkcji - dodałęm
Jakiś gościu dodał jeszcze od siebie tutaj Ci zacytuje bo może być przdatne

"But first of all you need to be sure, that your iframe has completely rendered. So you need to use a setTimeout in order to do that.
."
i
"and in your messed code above setDynamic must be called after your eval."
(bo tam w kodzie powinno być jeszcze funkcja skryptuj dodana do końca zawartosc skrypt_textarea.value która by robiła eval z wewnątrz ale to już banał nie warty wzmianki).

Działa dokładnie tak jak potrzebuję żeby działało!

edytowany 3x, ostatnio: infinityhost
_13th_Dragon
Nie trzeba żadnych setTimeout, bo script dodano jako ostatni, więc wszystko już zrenderowano.
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

Mimo wszystko jak daję w oknie z treścią html - iframeDoc.body.innerHTML wpis

<script>alert();</script>

to nie alertuje.
Żeby to działało poprawnie chyba trzeba dodać do wnętrza funkcji

let tmp=iframeDoc.documentElement.outerHTML;iframeDoc.write("");iframeDoc.write(tmp);

lub (co chyba lepiej działa bo przy document.write(); nadpisuje dwa razy)

let tmp=iframeDoc.documentElement.outerHTML;iframe.srcdoc="";iframe.srcdoc=tmp;

wtedy to ma ręce i nogi.

edytowany 4x, ostatnio: infinityhost
Zobacz pozostałe 2 komentarze
_13th_Dragon
Przecież masz przykład powyżej
IN
@_13th_Dragon: cośtam zaczyna działać ale dopiero jak podpiąłem funkcję pod przycisk i w jego obrębie operowałem. Ale jest do zrobienia.
_13th_Dragon
document.querySelectorAll("BUTTON")[2].setAttribute("onClick","wyczysc()"); zadziałał po dodaniu skryptu, więc tak samo zadziała alert(); o ile czegoś nie spieprzyłeś.
IN
Teraz myślę jak dodawać skrypty (albo robić eval()) z drugiego okna (czyli 4go textarea). Bo nie mogą być jednocześnie deklarowane zmienne takie same w 2 miejscach. A w planach jest jeszcze dodawanie skryptow w oknie HTML.
_13th_Dragon
Przecież już masz w przykładzie!
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
0

@_13th_Dragon:

Kopiuj
function write_all(src){

if(src==0){
preview_frame.contentDocument.write(view_text_editor.value);
preview_frame.contentWindow.document.body.innerHTML=view_text_editor.value;

let z=document.createElement("script");
z.innerHTML=view_script_editor.value;

preview_frame.contentWindow.document.head.appendChild(document.createElement("style"));
preview_frame.contentWindow.document.head.childNodes[0].innerHTML=view_style_editor.value;
preview_frame.contentWindow.document.head.appendChild(z);

}else{preview_frame.contentDocument.write(view_text_editor.value);
preview_frame.contentWindow.document.body.innerHTML=view_text_editor.value;

let z=document.createElement("script");
z.innerHTML=view_script_editor.value+view_console_editor.value;

preview_frame.contentWindow.document.head.appendChild(document.createElement("style"));
preview_frame.contentWindow.document.head.childNodes[0].innerHTML=view_style_editor.value;
preview_frame.contentWindow.document.body.appendChild(z);
};}

preview_frame - jest to zmienna wskazująca na ramkę główną.
view_text_editor - pole textarea zawierające kod html.
view_style_editor - pole textarea zawierające kod css.
view_script_editor - pole textarea zawierające kod javascript.
view_console_editor - pole textarea zawierające kod javascript(ma być uruchamiane po wczytaniu już strony).

src - to jest parametr funkcji określający czy źródło ma być pobrane(czy jest to pole view_script_editor.value czy pole view_console_editor.value).

kod do uruchomienia w polu skryptu to

Kopiuj
div=document.querySelectorAll("DIV")[3];ifr=document.createElement("IFRAME");
inp=document.createElement("INPUT");
but=document.createElement("BUTTON");
div.appendChild(ifr);div.appendChild(inp);div.appendChild(but);
but.innerText="koloruj";
function writes(tak){let z;if(tak=="tak"){z= "<style>html{background-color:white;color:red;font-size:20px;}</style>";}else{z="<style>html{background-color:black;color:white;font-size:20px;}</style>";};return z;};
function ask(){let tmp;if(prompt('kolorować?')=='tak'){tmp=writes('tak');}else{tmp=writes('nie');};
tmp+=inp.value;ifr.setAttribute('srcdoc',tmp);};but.setAttribute("onClick","ask()");

Jesli daję ten kod do pola "view_script_editor" to działa bez zarzutu. Jak daję do pola "view_console_editor" to nie działa. Jeśli zamiast tego kodu dam "alert()" to działa.

Jeśli pierwszy raz uruchamiam stronę i dam kod do "view_script_editor" to ładuje bezproblemowo (i znajduje funkcje ask() i writes() przypina ją do buttona) , jak pierwszy raz ją uruchomie i dodam do "view_console_editor" to tworzy elementy ale już nie obsługuje funkcji (writes() i ask() - buttonowi da się wtedy dodać zdarzenie alert() ale już nie ask()). Jak utworzę funkcję jako metode np. utworzonego przycisku i uruchomię ja za pomocą this to wtedy działa.

Jeszcze dodam fragment kodu z okna głównego

Kopiuj
<html>
<body>
<textarea id="html_id"><div id="pierwszy_div_id" class="pierwszy"></div><div id="drugi_div_id" class="drugi"></div><div id="trzeci_div_id" class="trzeci"></div><div id="czwarty_div_id" class="czwarty"></div></textarea>
<textarea id="css_id"> </textarea>
<textarea id="script_id"></textarea>
<textarea id="console_id"></textarea>
<button onClick="write_all(1)"> uruchom </button>
<button onClick="write_all(0)"> wyświetl </button><br>
<iframe id="preview_frame_id"></iframe>
<script>
view_text_editor=document.getElementById("html_id");
view_style_editor=document.getElementById("css_id");
view_script_editor=document.getElementById("script_id");
view_console_editor=document.getElementById("console_id");
preview_frame=document.getElementById("preview_frame_id");
</script>
</body>
</html>

To jest jedna z ostatnich wersji, coś tam działa , próbowałem różnych rzeczy, zawsze blokuje na użyciu wiekszej funkcji kiedy uruchamiam write_all(1);(czyli przycisk "uruchom")

Sam przykład właśnie sprawdzałem umieszczony na pulpicie działa , ale na stronie już tak jak napisałem.
(właściwie to nie powinno na parametrze 1 czyli uruchom ładować całej strony tylko dodawać skrypt utworzony z okna konsoli albo robić eval()na jej zawartości ale tak czy inaczej jest problem).

Jak dam zamiast tamtej funkcji ask() coś takiego:

Kopiuj
      but.ask=function(){let tmp;
          if(prompt('kolorować?')=='tak'){tmp=writes('tak');
      }else{
            tmp=writes('nie');};
      tmp+=inp.value;ifr.setAttribute('srcdoc',tmp);};

but.setAttribute("onClick","this.ask()");

działa prawidłowo.

Przy czym jeśli okno html, css i skryptu jest puste, to konsola się nie uruchamia.

edytowany 11x, ostatnio: infinityhost
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)