Autor Zpráva
Igor
Profil
Zdravím,
pomocí javascriptu počítám a nastavuji počet řádků pro textarea a zjistil jsem, že FF to nějak špatně počítá. Proto používám odlišný vzorec pro výpočet
var rows = ((Math.ceil(len/cols)==0)?1:Math.ceil(len/cols));
. Zjistil jsem že od verze FF 3.0 - 3.6.2 (moje současná verze) má mnoho chyb v tom jak zobrazuje věci na stránce a nevím jestli to bylo v novějším opraveno, takže bych to chtěl nějak rozlišit pomocí JS. Ale hlavní je zjistit jestli se jedná o FF nebo ne. Ví někdo jak na to?
Witiko
Profil
Igor:
Nechceš nám sem dát původní kód, který na nových verzích Firefoxu, jak říkáš, nedělá, co má, a popsat nám co dělat má místo toho, abys to řešil tím nejméně žádoucím a doporučovaným způsobem, jímž je detekce User Agenta?
Igor
Profil
Funkce potřebné
  var detectBrowser = function (type)
  {
    if (type=="FF"){
      if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
       var ffversion=new Number(RegExp.$1) // capture x.x portion and store as a number
       return ffversion;
      }
      else
       return false;
    }
  }
  var substr_count = function (string,substring)
  {
   var c = 0;
   for (var i=0;i<string.length;i++)
   { if(substring == string.substr(i,substring.length)) c++; }
   return c;
  }


Druhá část kódu
  if ($("textarea#"+id).get(0))
    {
    var element = $("textarea#"+id);
    element.val( result.result[id] );
    element.text( result.result[id] );

    /** VÝPOČET POČTU ŘÁDKŮ PRO TEXTAREA **/
    var val = element.val();
    var cols = element.attr("cols");
    var len = val.length;
    var breaks = substr_count(val,"\n");
    $len = len + (breaks*cols); // zalomení bere jako kdyby měly rozsah až ke kraji
    // FF 3.0 - 3.6.2 (zhruba) stále neopravené chyby, včetně počtu řádků v textarea
    
    var rows = (detectBrowser("FF")) ? 
               ((Math.ceil(len/cols)==0)?1:Math.ceil(len/cols)) :
               ((Math.floor(len/cols)==0)?1:Math.floor(len/cols));
    element.attr("rows", rows);                  
    }
  }


Řádek 15 až opravuje chybu. Ovšem vzhledem k tomu, že při testu v opeře a IE dostávám chybovou hlášku:

Event thread: click
Error:
name: ReferenceError
message: Statement on line 1: Undefined variable: JSON
Backtrace:
  Line 1 of function script 
    $.post("ax.php?action=get&prev=1", { rid: $("textarea#id").val(), selects: JSON.stringify(getSelected()) } , function(result) { loadFormData(result); }, "json");;return false;
  ...
stacktrace: n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'


Tak to nemohu otestovat v IE a OP. Přitom v FF to jede (odesílání objektu AJAXem) a žádný jiný problém jsem v JS nezaznamenal. Myslel jsem že JSON je součástí JQUERY.

Co se týče té chyby zmíněné v prvním příspěvku, tak jde o to, že IE a OP mají o jeden řádek více. Proto pro FF provádím ceil, místo floor a tím je chyba opravena.
Witiko
Profil
Igor:
Myslel jsem že JSON je součástí JQUERY
Ne, JSON objekt je součástí specifikace ECMA 5 (nadjazyk JavaScriptu), zatímco většina starších prohlížečů podporuje pouze specifikaci ECMA 3.1. Pro parsování napříč prohlížeči použij funkci jQuery.parseJSON. Ta v případě podpory JSON objektu použije ten, jinak prožene daný json vlastním algoritmem.

Ohledně počítání řádků v textarea - co to dělat nějak takto:
<textarea onkeyup="this.style.height = this.scrollHeight + 'px';" rows="1" style="overflow: hidden;"></textarea>

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