środa, 23 stycznia 2013

odpowiednik htmlspecialchars w js

Odpowiednik funkcji htmlspecialchars znanej z PHP.
var htmlspecialchars = function(html){
  return [
    [/&/g, '&'],
    [/</g, '&lt;'],
    [/>/g, '&gt;'],
    [/"/g, '&quot;'],
    [/'/g, '&#39;']
  ].reduce(function(h, r){
    return h.replace(r[0], r[1]);
  }, html);
};
Funkcja przydatna np. do umieszczania kodu na tym blogu. Przykład użycia:
prompt('skopiuj kod HTML', htmlspecialchars(prompt('podaj kod HTML')));

poniedziałek, 21 stycznia 2013

Binary - operacje na bitach

Funkcja upraszczająca operacje na bitach w JavaScript.
var Binary = function(val){
  val = val || 0;

  return {
    value: function(v){
      if( typeof v === 'undefined' )
        return val;
      val = v;
    },
    bit: function(n, v){
      if( typeof v === 'undefined' )
        return val & (1<<n) ? 1 : 0;
      if( v ){
        val |= 1<<n;
      }else{
        val &= ~(1<<n);
      }
    },
    toString: function(){
      return val.toString(2);
    }
  };
};
Warto pamiętać, że operacje bitowe w JavaScript są powolne, ponieważ JavaScript przechowuje wszystkie liczby (Number) jako double. W związku z tym każda operacja bitowa (przesunięcie bitowe, suma bitowa czy iloczyn bitowy) wymusza konwersję double na int.
// utworz nowa wartosc 5
var b = new Binary(5);
// odczytaj drugi bit
console.log(b.bit(2));
// ustaw pierwszy bit na 1
b.bit(1, true);
// odczytaj wartosc liczbowa
console.log(b.value());

sobota, 5 stycznia 2013

getForm oraz getFormInputs

Dwie przydatne funkcje przy sprawdzaniu pól formularza na stronie. Pierwsza funkcja getForm wyszukuje formularz zawierający podany jako argument element.
var getForm = function(htmlObj){
  return htmlObj.form || (function callee(o){
    return o.tagName === 'FORM' ? o : o.parentNode && callee(o.parentNode);
  })(htmlObj);
};
Kolejna funkcja getFormInputs znajduje wszystkie pola wysyłane do serwera. Zwraca obiekt z kluczami zawierającymi name pola oraz im odpowiadającymi wartościami zawierającymi value pola.
var getFormInputs = function(form){
  var res = {};
  [].concat(
    [].slice.call(document.getElementsByTagName('textarea')),
    [].slice.call(document.getElementsByTagName('input'))
  ).map(function(obj){
    if( typeof obj.name !== 'undefined' ){
      res[obj.name] = obj.value;
    }
  });
  return res;
};