Autor Zpráva
tester
Profil *
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
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 *
Tak už jsem doma. collection už je přefiltrovaný a já ho filtroval dvakrát. Takže
collection.css(task.css[k]);
dává co potřebuju. Konečně hotovo.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: