Autor | Zpráva | ||
---|---|---|---|
tester Profil * |
#1 · Zasláno: 19. 8. 2016, 18:23:47
var task = {search: [], css: [] }; // search je pole řetězců selektorů, css je pole řetězců stylů var iframes = $("iframe[class~='wysiwyg']"); if (iframes) $.each(iframes.prevObject, function( k, iframe ) { add_styles(task, iframe); }); easy_add_styles = function(task, iframe = null){ if ( iframe.body ) { var contents = $(iframe.body).contents() for ( var k in task.search ) { console.clear(); console.log(contents.find(task.search[k])); contents.find(task.search[k]).css(task.css[k]); $.each(contents.find(task.search[k]), function( k, element ) { $(element).css(task.css[k]); }); } } } Script běží v rámci rozšíření Firefoxu, injectuje se do stránky, má najít iframe, obsah body pak předává JQuery. Zkouším to dvěma způsoby ale ani jeden nezmění styly. Je možné že by ty elementy iframe byly jen pro čtení a nešlo styly přidat? |
||
_es Profil |
Jedna vec je objekt iframu ako člen DOM celej stránky a iná vec je dokument do neho vložený - ten má vlastný DOM s vlastnými objektami - tam musíš zmeniť štýly. K objektom
window všetkých iframe sa dostaneš napríklad cez window.frames. Alebo, objekt iframe má vlastnosti contentWindow a contentDocument .
|
||
tester Profil * |
poznámka: zkoušel jsem ve vývojářských nástrojích změnit nastavení třídy uvnitř toho iframu tím že jsem do třídy přidal styl background-color: black a toto funguje.
window.frames.frameElement je null contentWindow není definován (FF) Styl barvy pozadí těla stránky je definován v souboru content.css Takže je otázka, jestli to nepřebíjí ten vložený styl. I když zase v hlavním dokumentu to nedělá takže by nemělo. Chyba by mohla být v tom že do Jquery předávám jen iframe.body místo celý iframe a tak se styl těla nenastaví. Opravuji: var contents = $(iframe).children(); for ( var k in task.search ) { console.clear(); var collection = contents.find(task.search[k]); console.log(collection); A další problém vidím v tom že se mi ve výpisu nezobrazuje tag body ani po této úpravě |
||
_es Profil |
#4 · Zasláno: 20. 8. 2016, 12:13:54
tester:
„window.frames.frameElement je null“ Klikol si vôbec na tie odkazy v [#2]? window.frames je kolekcia a prejdeš ju jednoducho celú pomocou cyklu for ako v tej ukážke v dokumentácii Mozilly.
|
||
tester Profil * |
Nějak mě nenapadlo na ty odkazy kliknout. Ale to je jedno, protože jsem přišel na to co jsem dělal za blbost. Celou dobu jsem se domníval že ta hlavní funkce byla zavolána se správným argumentem. Nepochopil jsem to co vrací Jquery. Ve výsledku těch vyhledávacích funkcí mělo být např.
0 objekt 1 objekt prevObject length: 2 To co jsem zadával do hlavní funkce bylo prevObject a to je chyba. prevObject je hlavní htmldocument ... celou dobu jsem to měl před sebou to html ... 5 na konci říkalo že jde o hlavná dokument a parentNode = null .... takže nešlo o iframe. Takže jsem to opravil. Pak jsem zjistil že var collection už dokážu nastavit na to skutečné html uvnitř iframu. collection.css("background-color", ""); collection.css("background-color", "black"); Umím už pomocí css změnit background color. Takže ty tvoje odkazy nepotřebuju. Ale nejde mi následující příkaz: collection.find(task.search[k]).css(task.css[k]); task.search[1] v druhém cyklu je "body, h1, h2, h3, h4, h5, div, p, ul, li, table, tr, td" bez uvozovek. task.css[k] jsou ty styly. Takže collection.find("body, h1, h2, h3, h4, h5, div, p, ul, li, table, tr, td").css( { background-color: "black", color: "#f1e4b0", font-family: "Arial Black", line-height: "35px", font-weight: "bold", font-size: "20px", padding-left: "0px", padding-right:"0px", } ); (ty styly jsem jen zkopíroval css a dopsal uvozovky, tak snad tam nemám chybu. Tohle css mi vždycky jelo, ale find jsem ještě nepoužíval tak nevím co dělám špatně) Takže collection[0] je <body.cke_editable.cke_editable_themed cke_contents_ltr cke_show_borders> v druhém cyklu. Tak screenshot jsem sice poslal ale protože Toolbox Debugger obsahuje chybu tak tam není vidět správný kód: var contents = $(iframe.contentDocument).children(); for ( var k in task.search ) { console.clear(); var collection = contents.find(task.search[k]); console.log(collection); console.log(task.css[k]); /* TEST */ collection.css("background-color", ""); collection.find(task.search[k]).css(task.css[k]); } ps: v k´ódu co jsem poslal předtím je chyba v těch stylech, na konci je třeba smazat jednu čárku. řádek 10. |
||
tester Profil * |
#6 · Zasláno: 20. 8. 2016, 14:37:59
Tak už jsem doma. collection už je přefiltrovaný a já ho filtroval dvakrát. Takže
collection.css(task.css[k]); |
||
Časová prodleva: 8 let
|
0