Autor Zpráva
tester
Profil *
Proč je vždy výsledek sheets[i].hasOwnProperty('cssRules') false?
Jak pomocí JS otestovat jestli cssRules existuje v objektu document.stylesheets[2]?



cssList = function(node) {
    var sheets = document.styleSheets, o = {};
    var sheet;
    for (var i in sheets) {
      if ( sheets[i].hasOwnProperty('cssRules') )
        sheet = sheets[i].cssRules;
      else
      if ( sheets[i].hasOwnProperty('rules') )
        sheet = sheets[i].rules;
      else
        continue;

      var rules = sheets[i].rules || sheets[i].cssRules;
      for (var r in rules) {
          if (node.is(rules[r].selectorText)) 
            {
              o = $.extend(o, make_it_easy.easy.css2json(rules[r].style), css2json(node.attr('style')));
            }
        }  

    }
    return o;
}
Chamurappi
Profil
Reaguji na testera:
Proč je vždy výsledek sheets[i].hasOwnProperty('cssRules') false?
Protože takovou vlastní vlastnost nemá. Má ji CSSStyleSheet.prototype, od kterého sheets[i] dědí.

Jak pomocí JS otestovat jestli cssRules existuje v objektu document.stylesheets[2]?
if(document.stylesheets[2].cssRules) … nevím, co v tom hledáš za vědu. Nebo jde použít operátor in, pokud bys potřeboval rozlišit existující vlastnost naplněnou nepravdivou hodnotou (což v tomto případě nepotřebuješ.

Jaký smysl u tebe vlastně mají řádky 5 až 11? Vždyť to máš vyřešené na řádku 13 – do rules přiřazuješ buď jedno, nebo druhé… a pokud ani jedno neexistuje, tak je tam undefined a stačí ti testovat if(rules).

Proč používáš cyklus for-in na pole/kolekci? Na to není stavěný (byť ti to většinou asi bude fungovat).
tester
Profil *
To ale nefunguje. Firefox 48 mi v Debuggeru Toolboxu hlásí exception: security error.


Za řádek 13 se nedostanu kvůli security error
tester
Profil *
Vyřešeno.

  var sheets = document.styleSheets, o = {};
  var rules;
  for (var i in sheets) {
    // Firefox - Security fix:
    try { rules = sheets[i].cssRules; } catch(err) {}

  if(rules)
      ...
Radek9
Profil
tester:
To bude zřejmě kvůli tomu, že jsou určité stylopisy z jiné domény. Podobně jako k oknům (framům) z jiných domén k nim nemáš přístup, proto ten error.
_es
Profil
Radek9 [#5]:
Alebo bude problém v tom, že tester napriek radám stále tvrdohlavo používa cyklus for-in na kolekciu a je v tom cykle aj niečo iné než člen kolekcie.
Radek9
Profil
_es:
Tím to nebude. Ten objekt navíc obsahuje jen length a item. Ale ani jedno z toho není null nebo undefined, takže to nezpůsobí chybu. Problém je opravdu v těch jiných doménách (bez cross-origin). To přesně vyvolá security error.

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:

0