Autor Zpráva
Witiko
Profil
Pro všechny ty, kteří nepoužívají frameworky je zde úžasná a zbrusu nová knihovna $exy Dolar. Kromě toho, že je zcela skvělá a úžasná a nemusíte se bát s ní vkročit do společnosti, je také praktická! Na rozdíl od frameworků typu jQuery, naše sexy knihovna zabírá pouhých 1,15 kB!

Co že tento skvost nabízí? Funkcionalitu getElementsByTagName, getElementsByName, getElementById a getElementsByClassName v jedné funkci. Jsem si jistý, že nás všechny z přemíry těch technických termínů rozbolely uši a tak se tedy vraťme k našemu sexy konceptu!

$() - Navrátí NodeList* veškerých elementů uvnitř rodičovského elementu
$("#id") - Navrátí element s daným ID
$("tagName" / ".className" / "@name") - Navrátí NodeList* veškerých elementů dle zadaného kritéria
$("tagName.className" / "tagName@name") - Navrátí Array* veškerých elementů dle zadaných kritérií

* Rozdíl mezi NodeListem a Array je následující: NodeList je živý výpis daných elementů v struktuře DOM, který reflektuje jeho aktuální stav, zatímco Array je statické a jedná se o zachycení stavu dokumentu v momentě zavolání funkce.

Druhý atribut je volitelný a je jím možné určit element uvnitř něhož bude hledání prováděno, defaultní hodnotou je document.

// $exy Dolar - Vít Novotný 2010
var $=(function(g){return function(e,f){var a=e?(/#|\.|@/.exec(e)||[])[0]:null,b=e?e.indexOf(a):-1,c,d;if(!e||!e.length)e="*";f=(typeof HTMLElement==="object"?f instanceof HTMLElement:typeof f==="object"&&f.nodeType===1&&typeof f.nodeName==="string")?f:document;switch(a){case".":if(b==0){return f.getElementsByClassName?f.getElementsByClassName(e.substr(1)):g(e.substr(1),false,f)}else{if(f.getElementsByClassName){c=[f.getElementsByClassName(e.substr(b+1)),[]];d=e.substr(0,b).toLowerCase();for(var i=0;i<c[0].length;i++){if(c[0][i].tagName.toLowerCase()==d)c[1].push(c[0][i])}return c[1]}else{return g(e.substr(b+1),e.substr(0,b),f)}}case"@":if(b==0){return f.getElementsByName(e.substr(1))}else{c=[f.getElementsByName(e.substr(b+1)),[]];d=e.substr(0,b).toLowerCase();for(var i=0;i<c[0].length;i++){if(c[0][i].tagName.toLowerCase()==d)c[1].push(c[0][i])}return c[1]}case"#":return f.getElementById(e.substr(b+1));default:return f.getElementsByTagName(e)}}})(function(a,b,c){var d=new RegExp("(^|\\s)"+a+"(\\s|$)"),b=b||"*",c=c||document,e=(b=="*"&&c.all)?c.all:c.getElementsByTagName(b),f=[],g,h=e.length;for(var i=0;i<h;i++){g=e[i];if(d.test(g.className)){f.push(g)}}return f});
_es
Profil
Veľmi to pripomína spam. Nadpis "$exy dolar", forma, štýl textu, …
Skoro ako reklama na "úžasný" redakčný systém e***x.
Len kvôli množstvu tvojich predchádzajúcich príspevkov je reakcia veľmi mierna.
TomasJ
Profil
_es:
Máš naprostou pravdu.

Witiko:
Místo každého 's' dát '$' je hnusota. Za každý tvůj dolar v textu bys zasloužil facku. (mimo $,které se vyskytují ve funkcích)
Je pěkné, že máš udělanou knihovnu k JS, ale kdo používá jQuery, zůstane u jQuery...
Witiko
Profil
_es:
Ok, ospravedlňujem sa. Dám ta $ pryč. Mala to být súčasť drobné revolty proti enormné obľúbenosťi znaku $ (sexy dolar) u js frameworkov, čo zavŕšuje knihovňa jQuery, ktorá využívá funkciu $() na všetko.

Rovnako tak mal štýl písania poukazovať na fakt, že často knižnice typu jQuery používajú ľudia, ktorí nemajú ani potuchy o základoch syntaxe JavaScriptu, ako sa je zo spústy topicov tu na fóre možné konieckoncov presvedčiť.

Nemalo ísť o spam ani o advertising, malo to advertising mierne parodovať. :)

TomasJ:
Za každý tvůj dolar v textu bys zasloužil facku.
Viz. to, co jsem psal _esovi, ale v češtině.

ale kdo používá jQuery, zůstane u jQuery
Pro všechny ty, --> kteří nepoužívají frameworky <-- je zde úžasná a zbrusu nová...
TomasJ
Profil
Witiko:
> Na rozdíl od frameworků typu jQuery, naše sexy knihovna zabírá pouhých 1,15 kB!
jQuery má větší využití než tvůj Sexy dolar a má více funkcí. Dá se použít na efekty k menu a podobné...
A navíc, jQuery je uložená i na webu ne? nemusím tudíž ukládat knihovnu na svůj web...
Witiko
Profil
TomasJ:
jQuery má větší využití než tvůj Sexy dolar a má více funkcí. Dá se použít na efekty k menu a podobné...
Vím, že má více funkcí, jsem si této skutečnosti plně vědom, ohledně využití však: co však když člověk o tyto funkce nestojí? Knihovně jQuery se její nafouknutost často vyčítá a také se z toho důvodu často nepoužívá na menší projekty. Ale každý ať si používá, co chce, jak jsem již psal _esovi, a ty jak vidno čteš jen co se ti zlíbí, je text prvního příspěvku úmyslně ironický a knihovna je určená pro lidi, kteří preferují nepoužívat frameworky a přesto si chtějí užít používání $exy znaku dolaru. Ti pak mohou tuto knihovnu využít. :)

A navíc, jQuery je uložená i na webu ne? nemusím tudíž ukládat knihovnu na svůj web...
A kdo říká, že mi jde o problémy s místem na webu? Tahat se to musí do prohlížeče, ať už je to kde je a spouštění tun balast-kódu a užírání RAM definicí hor nepoužitých privátních funkcí prohlížeči také nikdo neodpáře.
Witiko
Profil
Mánie Sexy dolaru nekončí. O 2kB větší, ovšem dech-beroucí funkcionalitou oplývající knihovna Sexy dolar+ již klepe na Vaše dveře. Pojďme se tedy společně podívat na to, co tento technologický výkvět nově dokáže:

$("#id > tagName > tagName.className > tagName@name")
Ano, je tomu tak. Konkurenčními frameworky inspirovaná syntax vám umožňuje shromažďovat elementy pomocí fronty - tak, jak jste si vždy přáli. Hledání se provádí vždy ve všech elementech výsledků předchozího hledání, což umožňuje pružné a dynamické shromažďování výsledků.

$("...", Array / NodeList / Element parentElement)
Ano, nemýlíte se. Nyní můžete prohledávat větší množství mateřských elementů najednou v jednom volání funkce. Vaše věčná přání byla vyslyšena!

Sexy Dolar+ (3,33 kB):
// $exy Dolar - Vít Novotný 2010
var $=(function(e,f){var t=RegExp,s=NodeList,r=Array,q="string",p="object",o=">",n=HTMLElement;return function z(b,c){if(typeof b==q&&b.indexOf(o)>-1){b=b.replace(/\s*>\s*/g,o);d=b.split(o);w=[];for(i=0;i<d.length;i++){if(!y){y=z(d[i],c);if(!(y instanceof s||y instanceof r)){y=y===null?w:[y]}}else{w.length=0;for(j=0;j<y.length;j++){w.push(z(d[i],y[j]))}y.length=0;for(j=0;j<w.length;j++){if(w[j]instanceof s||w[j]instanceof r){for(var k=0;k<w[j].length;k++){y.push(w[j][k])}}else if(w[j]!==null)y.push(w[j])}w.length=0}if(!y.length)return y;for(j=0;j<y.length;j++){if((r.indexOf?w.indexOf(y[j]):f(w,y[j]))==-1)w.push(y[j])}y=w.slice(0)}return w}else{var d=b?(/#|\.|@/.exec(b)||[])[0]:null,index=b?b.indexOf(d):-1,y,x,w=[],i,j;if(!b||!b.length)b="*";if(!c)c=document;else if(!(((c instanceof s||c instanceof r)&&c.length)||(typeof n===p?c instanceof n:typeof c===p&&((c.nodeType===1&&d!="#")||c.nodeType===9)&&typeof c.nodeName===q&&c.hasChildNodes())))return d=="#"?null:w;switch(d){case".":if(index==0){if((c instanceof s||c instanceof r)&&c.length){w=c[0].getElementsByClassName?c[0].getElementsByClassName(b.substr(1)):e(b.substr(1),false,c[0]);for(i=1;a<c.length;i++){y=c[i].getElementsByClassName?c[i].getElementsByClassName(b.substr(1)):e(b.substr(1),false,c[i]);for(j=0;j<y.length;j++){if((r.indexOf?w.indexOf(y[j]):f(w,y[j]))==-1)w.push(y[j])}}return w}else return c.getElementsByClassName?c.getElementsByClassName(b.substr(1)):e(b.substr(1),false,c)}else{x=new t(b.substr(0,index),"i");if((c instanceof s||c instanceof r)&&c.length){for(i=0;i<c.length;i++){y=c[i].getElementsByClassName?c[i].getElementsByClassName(b.substr(index+1)):e(b.substr(index+1),b.substr(0,index),c[i]);for(j=0;j<y.length;j++){if((!c[i].getElementsByClassName||x.test(y[i].tagName))&&(r.indexOf?w.indexOf(y[j]):f(w,y[j]))==-1)w.push(y[j])}}return w}else{if(c.getElementsByClassName){y=c.getElementsByClassName(b.substr(index+1));for(i=0;i<y.length;i++){if(x.test(y[i].tagName))w.push(y[i])}return w}else return e(b.substr(index+1),b.substr(0,index),c)}}case"@":if(index==0){if((c instanceof s||c instanceof r)&&c.length){for(i=0;i<c.length;i++){y=w.concat(c[i].getElementsByName(b.substr(1)));for(j=0;j<y.length;j++){if((r.indexOf?w.indexOf(y[j]):f(w,y[j]))==-1)w.push(y[j])}}return w}else return c.getElementsByName(b.substr(1))}else{x=new t(b.substr(0,index),"i");if((c instanceof s||c instanceof r)&&c.length){for(i=0;i<c.length;i++){y=c[i].getElementsByName(b.substr(index+1));for(j=0;j<y.length;j++){if(x.test(y[i].tagName))w.push(y[j])}}return w}else{y=c.getElementsByName(b.substr(index+1));for(var i=0;i<y[0].length;i++){if(x.test(y[i].tagName))w.push(y[i])}return w}}case"#":if((c instanceof s||c instanceof r)&&c.length){for(i=0;i<c.length;i++){w.push(c[i].getElementById(b.substr(index+1)))}return w}else return c.getElementById(b.substr(index+1));default:if((c instanceof s||c instanceof r)&&c.length){for(i=0;i<c.length;i++){y=c[i].getElementsByTagName(b);for(j=0;j<y.length;j++){if((r.indexOf?w.indexOf(y[j]):f(w,y[j]))==-1)w.push(y[j])}}return w}else return c.getElementsByTagName(b)}}}})(function(a,b,c){var d=new t("(^|\\s)"+a+"(\\s|$)"),b=b||"*",c=c||document,u=(b=="*"&&c.all)?c.all:c.getElementsByTagName(b),return u=[],v,length=u.length;for(var i=0;i<length;i++){v=u[i];if(d.test(v.className)){return u.push(v)}}return u},function(n,o){for(var j=n.length,i=0;i<j&&n[i]!==o;i++);return j<=i?-1:i});


Sexy Dolar (1,17 kB):
// $exy Dolar - Vít Novotný 2010
var $=(function(g){var z=RegExp,y=HTMLElement,x="object";return function(e,f){var a=e?(/#|\.|@/.exec(e)||[])[0]:null,b=e?e.indexOf(a):-1,c,d,i;if(!e||!e.length)e="*";if(!f)f=document;else if(!(typeof y===x?f instanceof y:typeof f===x&&(f.nodeType===1||f.nodeType===9)&&typeof f.nodeName==="string"))return a=="#"?null:[];switch(a){case".":if(b==0){return f.getElementsByClassName?f.getElementsByClassName(e.substr(1)):g(e.substr(1),false,f)}else{if(f.getElementsByClassName){c=[f.getElementsByClassName(e.substr(b+1)),[]];d=new z(e.substr(0,b),"i");for(i=0;i<c[0].length;i++){if(d.test(c[0][i].tagName))c[1].push(c[0][i])}return c[1]}else{return g(e.substr(b+1),e.substr(0,b),f)}}case"@":if(b==0){return f.getElementsByName(e.substr(1))}else{c=[f.getElementsByName(e.substr(b+1)),[]];d=new z(e.substr(0,b),"i");for(i=0;i<c[0].length;i++){if(d.test(c[0][i].tagName))c[1].push(c[0][i])}return c[1]}case"#":return f.getElementById(e.substr(b+1));default:return f.getElementsByTagName(e)}}})(function(a,b,c){var d=new z("(^|\\s)"+a+"(\\s|$)"),b=b||"*",c=c||document,e=(b=="*"&&c.all)?c.all:c.getElementsByTagName(b),f=[],g,h=e.length;for(var i=0;i<h;i++){g=e[i];if(d.test(g.className)){f.push(g)}}return f});
ninja
Profil
Witiko: Je nekdě k vidění neminifikovanná verze?
Witiko
Profil
Neminifikované verze:

Sexy Dolar+ (7,43 kB):
/*

  $exy Dolar Extended - Vít Novotný 2010
  
    Function $()
      1st argument: "tagName", "#id", ".className", "tagName.className", "@name", "tagName@name", "expression>expression"
      2nd argument: Array / NodeList / Element parentElement (optional)

*/

var $ = (function(getElementsByClassName, arrayIndexOf) {
  return function collect(query, element) {
    if(typeof query == "string" && query.indexOf(">") > -1) {
      query = query.replace(/\s*>\s*/g,">");
      func = query.split(">");
      result = [];
      for(i = 0; i < func.length; i++) {
        if(!tempArray) {
          tempArray = collect(func[i], element);
          if(!(tempArray instanceof NodeList || tempArray instanceof Array)) {
            tempArray = tempArray === null?result:[tempArray];
          }
        }
        else {
          result.length = 0;
          for(j = 0; j < tempArray.length; j++) {
            result.push(collect(func[i], tempArray[j]))
          }
          tempArray.length = 0;
          for(j = 0; j < result.length; j++) {
            if(result[j] instanceof NodeList || result[j] instanceof Array) {
              for(var k = 0; k < result[j].length; k++) {
                tempArray.push(result[j][k]);
              }
            } else if(result[j] !== null)
              tempArray.push(result[j]);
          }
          result.length = 0;
        }
        if(!tempArray.length) return tempArray;
        for(j = 0; j < tempArray.length; j++) {
          if((Array.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) == -1)
            result.push(tempArray[j]);
        }
        tempArray = result.slice(0);
      }
      return result;
    } else {
      var func = query?(/#|\.|@/.exec(query) || [])[0]:null,
          index = query?query.indexOf(func):-1,
          tempArray, tempString, result = [], i, j;
      if(!query || !query.length) query = "*";
      if(!element) element = document;
      else if(!(((element instanceof NodeList || element instanceof Array) && element.length) || (typeof HTMLElement === "object"?element instanceof HTMLElement:typeof element === "object" && ((element.nodeType === 1 && func != "#") || element.nodeType ===  9) && typeof element.nodeName === "string" && element.hasChildNodes())))
        return func=="#"?null:result;
      switch(func) {
        case ".": 
          if(index == 0) {
            if((element instanceof NodeList || element instanceof Array) && element.length) {
              result = element[0].getElementsByClassName?
                element[0].getElementsByClassName(query.substr(1)):
                getElementsByClassName(query.substr(1), false, element[0]);
              for(i = 1; a < element.length; i++) {
                tempArray = element[i].getElementsByClassName?
                  element[i].getElementsByClassName(query.substr(1)):
                  getElementsByClassName(query.substr(1), false, element[i]);
                for(j = 0; j < tempArray.length; j++) {
                  if((Array.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) == -1)
                    result.push(tempArray[j]);
                }
              }
              return result;
            } else return element.getElementsByClassName?
              element.getElementsByClassName(query.substr(1)):
              getElementsByClassName(query.substr(1), false, element);
          } else {
            tempString = new RegExp(query.substr(0,index), "i");
            if((element instanceof NodeList || element instanceof Array) && element.length) {
              for(i = 0; i < element.length; i++) {
                  tempArray = element[i].getElementsByClassName?
                    element[i].getElementsByClassName(query.substr(index + 1)):
                    getElementsByClassName(query.substr(index + 1), query.substr(0,index), element[i]);
                  for(j = 0; j < tempArray.length; j++) {
                    if((!element[i].getElementsByClassName || tempString.test(tempArray[i].tagName)) &&
                      (Array.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) == -1)
                      result.push(tempArray[j]);
                  }
              }
              return result;
            } else {
              if(element.getElementsByClassName) {
                tempArray = element.getElementsByClassName(query.substr(index + 1));
                for(i = 0; i < tempArray.length; i++) {
                  if(tempString.test(tempArray[i].tagName)) result.push(tempArray[i]);
                }
                return result;
              } else
                return getElementsByClassName(query.substr(index + 1), query.substr(0,index), element);
            }
          }
        case "@":
          if(index == 0) {
            if((element instanceof NodeList || element instanceof Array) && element.length) {
              for(i = 0; i < element.length; i++) {
                tempArray = result.concat(element[i].getElementsByName(query.substr(1)));
                for(j = 0; j < tempArray.length; j++) {
                  if((Array.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) == -1)
                    result.push(tempArray[j]);
                }
              }
              return result;
            } else
              return element.getElementsByName(query.substr(1));
          } else {
            tempString = new RegExp(query.substr(0,index), "i");
            if((element instanceof NodeList || element instanceof Array) && element.length) {
              for(i = 0; i < element.length; i++) {
                tempArray = element[i].getElementsByName(query.substr(index + 1));
                for(j = 0; j < tempArray.length; j++) {
                  if(tempString.test(tempArray[i].tagName)) result.push(tempArray[j]);
                }
              }
              return result;
            } else {
              tempArray = element.getElementsByName(query.substr(index + 1));
              for(var i = 0; i < tempArray[0].length; i++) {
                if(tempString.test(tempArray[i].tagName)) result.push(tempArray[i]);
              }
              return result;
            }
          }
        case "#":
          if((element instanceof NodeList || element instanceof Array) && element.length) {
            for(i = 0; i < element.length; i++) {
              result.push(element[i].getElementById(query.substr(index + 1)));
            }
            return result;
          } else
            return element.getElementById(query.substr(index + 1));
        default:
          if((element instanceof NodeList || element instanceof Array) && element.length) {
            for(i = 0; i < element.length; i++) {
              tempArray = element[i].getElementsByTagName(query);
              for(j = 0; j < tempArray.length; j++) {
                if((Array.indexOf?result.indexOf(tempArray[j]):arrayIndexOf(result, tempArray[j])) == -1)
                  result.push(tempArray[j]);
              }
            }
            return result;
          } else
            return element.getElementsByTagName(query);
      }
    }
  }
})(function(className, tag, elm) {
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)"),
	    tag = tag || "*",
	    elm = elm || document,
	    elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
	    returnElements = [],
	    current,
	    length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
}, function(n,o){
  for(var j=n.length,i=0;i<j&&n[i]!==o;i++);return j<=i?-1:i
});
Witiko
Profil
Sexy Dolar (2,36 kB):
/*

  $exy Dolar - Vít Novotný 2010
  
    Function $()
      1st argument: "tagName", "#id", ".className", "tagName.className", "@name", "tagName@name"  
      2nd argument: Element parentElement (optional)

*/

var $ = (function(getElementsByClassName) {
  return function(query, element) {
    var func = query?(/#|\.|@/.exec(query) || [])[0]:null,
        index = query?query.indexOf(func):-1,
        tempArray, tempString, i;
    if(!query || !query.length) query = "*";
    if(!element) element = document;
    else if(!(((element instanceof NodeList || element instanceof Array) && element.length) || (typeof HTMLElement === "object"?element instanceof HTMLElement:typeof element === "object" && ((element.nodeType === 1 && func != "#") || element.nodeType ===  9) && typeof element.nodeName === "string" && element.hasChildNodes())))
      return func=="#"?null:result;
    switch(func) {
      case ".": 
        if(index == 0) {
          return element.getElementsByClassName?
            element.getElementsByClassName(query.substr(1)):
            getElementsByClassName(query.substr(1), false, element);
        } else {
          if(element.getElementsByClassName) {
            tempArray = [element.getElementsByClassName(query.substr(index + 1)),[]];
            tempString = new RegExp(query.substr(0,index), "i");
            for(i = 0; i < tempArray[0].length; i++) {
              if(tempString.test(tempArray[0][i].tagName)) tempArray[1].push(tempArray[0][i]);
            }
            return tempArray[1];
          } else {
            return getElementsByClassName(query.substr(index + 1), query.substr(0,index), element);
          }
        }
      case "@":
        if(index == 0) {
          return element.getElementsByName(query.substr(1));
        } else {
          tempArray = [element.getElementsByName(query.substr(index + 1)),[]];
          tempString = new RegExp(query.substr(0,index), "i");
          for(i = 0; i < tempArray[0].length; i++) {
            if(tempString.test(tempArray[0][i].tagName)) tempArray[1].push(tempArray[0][i]);
          }
          return tempArray[1];
        }
      case "#":
        return element.getElementById(query.substr(index + 1));
      default:
        return element.getElementsByTagName(query);
    }
  }
})(function(className, tag, elm) {
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)"),
	    tag = tag || "*",
	    elm = elm || document,
	    elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
	    returnElements = [],
	    current,
	    length = elements.length;
	for(var i=0; i<length; i++){
		current = elements[i];
		if(testClass.test(current.className)){
			returnElements.push(current);
		}
	}
	return returnElements;
});


Upravujte dle libosti, potěšilo by mě, kdybyste zachovali hlavičku a o úpravy se tu na fóru podělili. Jak vidíte, předávám funkcím dvě privátní metody, které zajišťují fallback v případě nepodpory funkcí getElementsByClassName a Array.prototype.indexOf. Pokud znáte efektivnější / kratší verze těchto funkcí sdílející s těmi použitými interface, pak se je nebojte nahradit a případně se tu opět podělit, abych je mohl zařadit do release verze. :)

Stejně tak ocením návrhy k rozšíření / změně syntaxe vyhledávacího řetězce, interface a způsobu použití funkce.

Plánovaná funkčnost další verze knihovny:
Operátor vícenásobného výběru: $("tagName, #id, .className");

Operátor fronty bude defaultně podřazený operátoru vícenásobného výběru, proto dojde v tomto výrazu:
$("tagName, #id, .className > tagName.className");
nejprve k vyhodnocení první trojice selektorů. Pro změnu tohoto chování bude možné vyhledávací řetězec rozdělit do bloků pomocí jednoduchých závorek:
$("tagName, #id, (.className > tagName.className)");

Stejně tak bych rád do knihovny zapojil vyhledávání pomocí regulárních výrazů:
Buďto pomocí RegExp objektu:
$(/regulární výraz pro nalezení hledaného tagu/i);
$("název hledaného atributu" / /regulární výraz pro nalezení hledaného atributu/, /hodnota atributu/); (bude nutné zavést přetěžování funkce)

Nebo pomocí vyhledávacího řetězce:
$("/t(r|d)/, #/element_\\d/i, ./tri*da/i");
Použitá syntax je shodná se syntaxí regulárních výrazů v javascriptu. U hledaní pomocí jména tagu bude atribut ignoreCase aplikován automaticky

Další novinkou by bylo customizované vyhledávání podle atributů:
Buďto pomocí JSON objektu pro kombinovaná hledání:
$({
  atribut1: "hodnota1",
  atribut2: /hodnota2/i,
  ...
}, document.head);

Či pomocí již výše uvedeného způsobu s regulárními výrazy pro jednoduchá hledání:
$("název hledaného atributu" / /regulární výraz pro nalezení hledaného atributu/, /hodnota atributu/, document.head); (bude nutné zavést přetěžování funkce)

Nebo pomocí vyhledávacího řetězce, který by v rámci atributů rozlišoval i logické podmínky a vyhledávání názvu atributu pomocí regulárních výrazů:
$("head > {"název hledaného atributu" / /regulární výraz pro nalezení hledaného atributu/: /hodnota atributu/}");
$("head > {(atribut1: "hodnota1" && atribut2: /hodnota2/i) || /atribut3/: /hodnota3/ ...}");

Finální přídavek by měla být podpora uvozovek pro vyhledávání podle řetězců, které obsahují znaky, jež by mohly parser vyhledávacího řetězce zmást:
$("@'v,e,l,i,c,e' > #\"{podivný}>/název/>(elementu)\"");

V případě, že by řetězec obsahoval další uvozovky, bylo by samozřejmě nutné je escapovat nadvakrát, tedy takto: \\\".

Znaky, které parser zmatou, jsou veškeré operátory mezi výrazy ( , > ) a zápisy uzavírající do sebe části řetězce ( / / ( ) { } ).
Znaky, které parser nezmatou, v případě, že nevyhledáváme podle jména tagu, jsou #@. - $("#@."); vyhledá zcela korektně element s id "@.". V případě, že bychom vyhledávali podle jména tagu, bude parser i v tomto případě zmaten a $("jménoT@gu"); bude hledat tag jménem jménoT s atributem name o hodnotě gu.
Toto všechno jsou případy, kdy je nutné použít uvozovek. Samozřejmě se jedná o znaky, které správně vychovaný kodér do jmen ani základních atributů tagů nepřiřazuje.

Úmyslně si nechávám rezervované hranaté závorky pro případné další přídavky do syntaxe. Samozřejmě zachovám a budu updatovat i předchozí verze knihovny, abych udržel podporu pro ty, kdo tuto funkcionalitu nepotřebují a omezil tak nabobtnalost na minimum.

Stejně tak je mým cílem zpětná kompatibilita - vyhledávací řetězec pro nejmenší verzi Sexy dolaru by měl navrátit shodné výsledky v rozšířených verzích knihovny. Problémem je samozřejmě rozšiřování počtu rezervovaných znaků pro syntax - z toho důvodu přidám rozšíření syntaxe o uvozovky i do menších verzí knihovny, aby bylo možné případy, kdy by různé verze knihovny navracely různé výsledky, obejít.

Tyto návrhy změn a dodatků nejsou v souladu s všeobecně používanou syntaxí selectoru u frameworků a proto můžou být předmětem změny.
pcmanik
Profil
Ako vydis sam, aj tak sa ti to rozsrata, nikdy nebudes mat take zezemie ako ma jquery, a vele chyb v tom nevychytas, a ten kod je oproti jquery az na smiech pozri ako oni pisu tu kniznicu....

Stejně tak je mým cílem zpětná kompatibilita - vyhledávací řetězec pro nejmenší verzi Sexy dolaru by měl navrátit shodné výsledky v rozšířených verzích knihovny. Problémem je samozřejmě rozšiřování počtu rezervovaných znaků pro syntax - z toho důvodu přidám rozšíření syntaxe o uvozovky i do menších verzí knihovny, aby bylo možné případy, kdy by různé verze knihovny navracely různé výsledky, obejít.

Toto je blbost, ty musis spravit funkcny objekt, ktory bude fungovat a ludia ti ho odtestuju, az vo finale si to mozes dovolit pouzit, a nebudes pozerat na problemy so spetnou kompaktibilitou, preto najprv nieco poriadne sprav az potom publikuj, ako by to vyzeralo keby vyvojari javascriptu pridavali raz za tyzden jednu funkciu? jednoducho treba dat vsetko naraz
František Hliva
Profil
pcmanik:
buď rád že svoj kód zverejnil, keď chceš tak ho použi keď nechceš tak nemudruj. tvoj príspevok túto diskusiu ničím neobohatil. kód jQuery je taktiež hnus bez koncepcie, ale porovnávať jednu funkciu s celým Frameworkom môže len blázon.
_es
Profil
František Hliva:
kód jQuery je taktiež hnus bez koncepcie, ale porovnávať jednu funkciu s celým Frameworkom môže len blázon.
Ale jQuery je tiež z hľadiska syntaxe JavaScriptu len jedna globálna funkcia/objekt.

tvoj (pcmanik) príspevok túto diskusiu ničím neobohatil
Ja si to nemyslím. Witiko je určite schopný takúto korektnú kritiku pozitívne prijať.

Witiko:
Ak by si mal napodobniť všetku funkčnosť jQuery, tak aby asi vznikol mnohonásobne väčší a mnohonásobne problematickejší kód ako má jQuery.
Witiko
Profil
_es:
Ak by si mal napodobniť všetku funkčnosť jQuery, tak aby asi vznikol mnohonásobne väčší a mnohonásobne problematickejší kód ako má jQuery.
Mojím cieľom je lightweight funkcie na vyhľadávanie elementov. jQuery je framework, framework s množstvom nadbytočných (privátných) funkcií a kódu naviac, ide o úplný opak toho, o čo ide mňa. Jediné, čo máme spoločné je časť základné syntaxe na vyhľadávanie elementov (pretože syntax je to, čo sa Johnovi Resigovi na jQuery naozaj celkom podarilo) a sexy znak dolára. :)

Avšak tvrdenie, že keby som reimplementoval jQuery, tak by bol výsledok horší, než ako vyzerá súčasný kód jQuery, si beriem osobne - v kóde jQuery sú často naozajstná zverstvá. Ale to tu nechcem rozoberať, pretože to je hrubý off-topic. :D

pcmanik:
nikdy nebudes mat take zezemie ako ma jquery, a vele chyb v tom nevychytas, a ten kod je oproti jquery az na smiech pozri ako oni pisu tu kniznicu
Viz. to, čo som povedal _es. Srovnáváš nesúmeřiteľné, nesnažím sa konkurovať jQuery, opäť zas a znova odkazujem na prvú vetu v úvodnom príspevku:“Pro všechny ty, kteří -->ne<--používají frameworky je zde...“

Ide mi číre o funkciu na vyhľadávanie elementov, nič viac, nič menej. Má ísť o lightweight knižnicu pre ľudí, ktorí preferujú písať kód v javascriptu bez použitia frameworkov a napriek tomu je láka sexi znak dolára používaný frameworky. :)

ako by to vyzeralo keby vyvojari javascriptu pridavali raz za tyzden jednu funkciu? jednoducho treba dat vsetko naraz
Chcem, aby užívatelia mali právo voľby. To znamená, že si sami vyberú, ako moc odľahčenou verziu potrebujú. Uznávam, že sa pravdepodobne nejedná o štandardný postup, ale ty k mojej funkcii stále z nepochopiteľného dôvodu pristupuješ ako k frameworku. Nie je ním, je to jedna funkcia, ktorej kód sa stále vyvíja a ktorej interface a formát vyhľadávacieho reťazca stále obohacujem, pretože nemám to šťastie, že by som bol osvietený av jednom okamihu mal jasno o všetké syntaxi, ktorú chcem implementovať.

"Stejně tak je mým cílem zpětná kompatibilita" - „Toto je blbost, ty musis spravit funkcny objekt, ktory bude fungovat
On tiež funguje, nové prídavky do syntaxe sú dodatočné a fakticky sa už nevzťahujú k pôvodnej verzii knižnice, ale k novej. Pôvodných 1,15 kB veľká knižnica mala byť a svojím spôsobom aj je finálnou verziou, jej drobnosť a malá veľkosť je prednosťou, nie nedorobkom. Tieto nové verzie pridávajúce silnejší syntax a väčšie možnosti ale aj väčšiu veľkosť je možné brať ako samostatné knižnice (nie ako novšie verzie) zdieľajúce s pôvodnou knižnicou interface - spätná kompatibilita je preto dôležitá. Je jasné, že pakliže niekto spíše kód s použitím novej syntaxe a následne prejde na odľahčenejší verziu knižnice, fungovať mu to nebude. Opačne by však malo.

Asi máš problém s tým, že metóda je tzv. work in progress, pretože sa domnievaš, že takto "rozpracovanou" funkciu nemôžu ľudia používať. Záruka spätnej kompatibility toto však vyvracia a okrem toho ako som už povedal, jednotlivé tu vypustené verzie sú konečnými verziami svojho odvetvia, nejedná sa o novšiu a novšiu verziu tej istej knižnice - z týchto verzií si človek vyberie podľa toho, ako pokročilú funkcionalitu vyžaduje, nie že vezme automaticky tú najväčšiu - taký človek by mohol rovno siahnuť po jQuery, ak je mu jedno koľko nepoužitého kódu ťahá do prehliadača. Pakliže niekto použije knižnicu Sexy Dolár a za určitú dobu uvidí, že by mohol využiť niektoré z vlastností Sexy Dolár++ a prejde na ňu, kód napísaný pre pôvodný knižnicu bude s rozšírenou verziou stale fungovať.

Teraz je tu samozrejme otázka, prečo by to niekto robil, keď je tu jQuery, ktoré už má API hotové. Preto opäť zdôrazňujem, že toto je knižnica pre ľudí nepoužívajúce framework, ktorí takto majú globálnu premennú $ voľnú a ktorí aj základnú najmenšiu verziu Sexy Dolár prijmú ako vítanú náhradu za neustále písanie getElementsByXyz .

Dúfam, že som týmto spresnil zámer a smer, ktorým hodlám túto drobnú knižnicu vyvíjať. Má byť tým, čo jQuery nie je a nikdy nemôže byť - drobnú standalone knižnicou sa silnou syntaxou na vyhľadávanie elementov v DOM štruktúre a sexy dolárom, preto nemá cenu porovnávať neporovnateľné. :)
pcmanik
Profil
Asi som sa zle vyjadril, ja samozrejme nic neporovnavam, je mi jasne ze ty tam efekty ani nic podobne nebudes davat, len chcem podotknut ze jquery dava troska iny pristup prave k tym selektorom. A naviac trocha si pozri ich kod v casti selektorov, je pisany na trocha inej urovni, tym chcem povedat ze tam maju popisane chyby, co a ako funguje atd.

Samozrejme nechcem tu robit ziadny flame, tvoj napad sa mi paci preco nie, ale dnes uz moc nevyuzijes tak jednoduchu funkcionalitu ako je len vyberanie par dat. V dnesnych aplikaciach uz urcite k tym selektorom potrebujes aj ajax ved by si s tym snad len nechcel validovat formulare a podobné drobnosti. Je mi jasne o co v tvojej myslienke ide, lenze stavias uz zaklady frameworku.


Taktiez sa snazis spravit funkciu vyhladavania.
Preto mi neda odkazat na tento obrazok.



Myslim ze oni na nieco dosli preco to tak zrychlili, nechcem mat nic proti tvojim programatorskym schopnostiam, nikdy by som nic podobne neurobil, ale myslim si ze by si nedokazal ten kod tak optymalizovat aby nastalo take zrychlenie.


Avšak tvrdenie, že keby som reimplementoval jQuery, tak by bol výsledok horší, než ako vyzerá súčasný kód jQuery, si beriem osobne - v kóde jQuery sú často naozajstná zverstvá. Ale to tu nechcem rozoberať, pretože to je hrubý off-topic. :D

Dovolim si nesuhlasit, oni vedia preco je to tam a naviac vacsina tych zverstiev je tam len kvoli IE 6. A takisto vacsina zverstiev ako to nazyvas len dopomaha funkcionalite prehliadaca, resp opravuje to co prehliadac nevie urobit.

Nic, proti tebe nemam, len sa ti snazim jednoducho naznacit, ze je to celkom zbytocne co robis, nakolko to uz dost inych frameworkov urobilo za teba, ty si len vypichol jednu ich funkcionalitu. To je nieco take ako keby tu teraz niekto spravil podobnu funkciu len na ajax.
_es
Profil
Witiko:
Avšak tvrdenie, že keby som reimplementoval jQuery, tak by bol výsledok horší, než ako vyzerá súčasný kód jQuery, si beriem osobne
Ale to tvoje „mini jQuery“ už je horšie, napriek tak krátkemu kódu.
jQuery používa, ak sa dá, metódu queryselectorAll, no ty nič také nerobíš.
Witiko
Profil
pcmanik:
ty si len vypichol jednu ich funkcionalitu
Dá sa to tak povedať, tvorím standalone funkciu, ktorá implementuje funkciu css selektorov, ktorú väčšina javscriptových frameworkov používa, s miernymi inováciami.

Myslim ze oni na nieco dosli preco to tak zrychlili, nechcem mat nic proti tvojim programatorskym schopnostiam, nikdy by som nic podobne neurobil, ale myslim si ze by si nedokazal ten kod tak optymalizovat aby nastalo take zrychlenie.
Markreting pre ľudí, ktorí nepoznajú fakty. Vidíš za jQuery nejaké kúzlo. Fakt je, že jQuery elementy vyhľadáva, ale zároveň aj zabalí do svojho vlastného objektu, ktorý slúži k reprezentácii kolekcie elementov so všetkými metódami, ktoré tento vnútorný objekt dedí. Ak niečo, tak jQuery je vďaka svojmu dizajnu, kde je OOP layer neoddeliteľný od podložného API a syntax, ktorá spôsobuje, že na jednom riadku dochádza k vytvoreniu a zahodenie niekoľkých inštancií monolitického jQuery objektu, neznesiteľne pomalé. Takže toto "úžasné zvýšenie rýchlosti", ktoré vidíme na grafe je iba pomalé približovanie sa tomu, ako rýchlo by to bolo možné bez všetkého toho bloatu okolo. Ale nemusíš na to brať moje slovo, sú tu na to špecializované testy (SlickSpeed Selectors test). Preto až implementujem podporu kompletné syntaxe pre selektor, tak uvidíme, kto je rýchlejší. :)

_es:
jQuery používa, ak sa dá, metódu queryselectorAll, no ty nič také nerobíš.
Pretože až doteraz nie som skalopevne rozhodnutý, ak budem používať zhodnú syntax s touto funkciou. Skôr nie. Pre najodľahčenejší verzie knižnice by pravdepodobne išlo podporu dodať a časť zápisov by s najvyššou pravdepodobnosťou išlo do tvaru používaného touto funkciou preložiť, pretože interná funkcie zabezpečuje poväčšinou lepšiu výkonnosť.
_es
Profil
Witiko:
časť zápisov by s najvyššou pravdepodobnosťou išlo do tvaru používaného touto funkciou preložiť
Teda nejaký spomaľovací medzičlánok voči priamemu použitiu metódy queryselectorAll?
Použitie metódy queryselectorAll je určite mnohonásobne rýchlejšie, než použitie funkcie v JS, ktorá jej funkčnosť napodobňuje.
Witiko
Profil
_es:
Súhlasím, že nemá cenu meniť formát reťazca, ak by funkcionalita zostávala rovnaká. Už len preto sa chcem jeho syntaxe držať, uvidíme, či sa prejaví dostatočne pružný pre to, čo s funkciou zamýšľam.
ah01
Profil
Witiko:
Na Sexy dolaru se mi nelíbí, že návratová hodnota závisí na obsahu prvního textového parametru. Můžu dostat Element, NodeList nebo Array, což jsou dost rozdílné věci.

Řekněme, že k nějakému elementu přistupuji přes ID a později se rozhodnu využít className a vím, že tento element budu mít právě jeden*. Nestačí změnit „#“ za „.“, ale musím šáhnout i do kódu, protože nyní nedostanu Element ale NodeList.

U zmiňovaného jQuery, tento problém není, protože to vždy vrací jQuery objekt. To je obrovská výhoda!


*) Pokud namítnete proč použít className, když vím, že element bude právě jeden? On nemusí být právě jeden na celé stránce, ale jen uvnitř jiného elementu – použiji druhý parametr Sexy dolaru.
pcmanik
Profil
Ozaj, teraz ma napadlo vsetky podmienky kde sa vykonava len jeden prikaz orez o tie hranate zatvorky, ved ti ide predovsetkym o velkost kodu.
Chamurappi
Profil
Osobně moc nerozumím té posedlosti s vyhledáváním elementů podle roztodivných parametrů, takže mi vzájemné trumfování se v rychlostech a velikostech připadá jako samoúčelný sport. V praxi jsem nikdy nepotřeboval vyhledávat elementy podle třídy a pokud náhodou potřebuji projít či profiltrovat všechny (přímé či nepřímé) potomky, stačí na to pořád jen jeden obyčejný cyklus. Pracovat s celou kolekcí/polem elementů také potřebuji jen výjimečně, většinou se můžu pohodlně „opřít o strom“ — pracovat se společným rodičem.


Reaguji na Witika:
Při procházení „živých“ kolekcí (tedy NodeListů DOMu) cyklem můžeš využít toho, že jejich členové nikdy neobsahují nepravdivou hodnotu, místo toho, abys v podmínce cyklu při každém průchodu zjišťoval, zda jsi nepřekročil length (což není statická vlastnost — kvůli ní se stav kolekce přepočítává, poněvadž je živá).
_es
Profil
Chamurappi:
Reaguji na Witika:
Při procházení „živých“ kolekcí (tedy NodeListů DOMu) cyklem můžeš využít toho, že jejich členové nikdy neobsahují nepravdivou hodnotu, místo toho, abys v podmínce cyklu při každém průchodu zjišťoval, zda jsi nepřekročil length (což není statická vlastnost — kvůli ní se stav kolekce přepočítává, poněvadž je živá).

Stav kolekcie by sa mal prerátavať pri každom prístupe ku kolekcii, teda aj prí získaní člena kolekcie z jeho poradia. Zatiaľ čo metóda queryselectorAll vracia „neživú“ statickú kolekciu, kde to neustále prerátavanie nenastáva.
Chamurappi
Profil
Reaguji na _es:
teda aj prí získaní člena kolekcie z jeho poradia
Ano. Jelikož toho člena stejně získat potřebuje, aby s ním něco prováděl, tak si ho může rovnou vepsat do proměnné v té podmínkové části cyklu a ušetřit čas na zjišťování délky.

Zatiaľ čo metóda queryselectorAll vracia ‚neživú‘ statickú kolekciu
I ta je souvislá, takže nehrozí problémy, pokud na ni použije stejný postup.
Witiko
Profil
ah01:
U zmiňovaného jQuery, tento problém není, protože to vždy vrací jQuery objekt. To je obrovská výhoda!
Nejsem si jistý, jestli to, co popisuješ, je problém. jQuery objekt například postrádá živost NodeListu a navrácený objekt je vždy ve stylu pole. To podle mého výhoda není.

Nevýhoda by byla, kdyby má funkce navracela v rozdílných prohlížečích jiný druh dat při stejném požadavku, to se neděje, jelikož funkce má za úkol přístup k DOMu abstraktizovat. Na rozdíl od například právě jQuery, jenž používá tzv. Native-First Dual Approach - tedy používá nativní metodu document.querySelectorAll - což je černá skříňka, která může v rozdílných prohlížečích navracet zcela rozdílné výsledky - a vlastní vyhledávací engine používá jen v případě nepodpory. Z hlediska rychlosti výhoda, z hlediska abstrakce naprostá katastrofa.

A opět, srovnáváš nesrovnatelné - s vytvořením vlastního objektu bych tomuto objektu musel logicky přiřadit funkce a byl by tu framework.

pcmanik, Chamurappi:
Dobré postřehy, díky.

_es:
Zatiaľ čo metóda queryselectorAll vracia ‚neživú‘ statickú kolekciu, kde to neustále prerátavanie nenastáva.
Což je její druhá nevýhoda, protože navrací pole i u vyhledávání, kdy by mohlo dojít k navrácení NodeListu.
Witiko
Profil
Přidávám drobný update knihovny Sexy Dolar reagující na chování Internet Exploreru k objektu NodeList, kdy testování pomocí operátoru instanceof bylo nahrazeno ducktypingovým testováním. IE8 i IE9 nám totiž bezostyšně a bez zardění tvrdí, že document.getElementsByTagName("*") instanceof NodeList === false. Spolu s tím jsem pozměnil i způsob procházení NodeListů z (i = 0; i < nodeList.length; i++) na (i = 0; nodeList[ i ] !== undefined; i++).

$exy Dolar:
// $exy Dolar - Vít Novotný 2010 - 2011
var $=(function(d){return function(a,b){var m=document,x=undefined,w="object",c=a?(/#|\.|@/.exec(a)||[])[0]:null,index=a?a.indexOf(c):-1,z,y,i;if(!a||!a.length)a="*";if(!b)b=m;else if(!(b.length||(typeof HTMLElement===w?b instanceof HTMLElement:typeof b===w&&((b.nodeType===1)||b.nodeType===9)&&typeof b.nodeName==="string"&&b.hasChildNodes())))return c==="#"?null:[];switch(c){case".":if(index===0){return b.getElementsByClassName?b.getElementsByClassName(a.substr(1)):d(a.substr(1),false,b)}else{if(b.getElementsByClassName){z=[b.getElementsByClassName(a.substr(index+1)),[]];y=new RegExp(a.substr(0,index),"i");for(i=0;z[0][i]!==x;i++){if(y.test(z[0][i].tagName))z[1].push(z[0][i])}return z[1]}else{return d(a.substr(index+1),a.substr(0,index),b)}}case"@":if(index===0){return b.getElementsByName(a.substr(1))}else{z=[b.getElementsByName(a.substr(index+1)),[]];y=new RegExp(a.substr(0,index),"i");for(i=0;z[0][i]!==x;i++){if(y.test(z[0][i].tagName))z[1].push(z[0][i])}return z[1]}case"#":return (b.getElementById?b:m).getElementById(a.substr(index+1));default:return b.getElementsByTagName(a)}}})(function(a,b,c){var d=new RegExp("(^|\\s)"+a+"(\\s|$)"),b=b||"*",c=c||document,w=(b==="*"&&c.all)?c.all:c.getElementsByTagName(b),z=[],y,x=w.length;for(var i=0;i<x;i++){y=w[i];if(d.test(y.className)){z.push(y)}}return z});


$exy Dolar+:
// $exy Dolar - Vít Novotný 2010 - 2011
var $=(function(e,f){var m=document,u=undefined,s="object",t="string",q=Array;return function v(b,c){if(typeof b===t&&b.indexOf(">")>-1){b=b.replace(/\s*>\s*/g,">");d=b.split(">");w=[];for(i=0;i<d.length;i++){if(!z){z=v(d[i],c);if(z.length!==u){z=z===null?w:[z]}}else{w.length=0;for(j=0;j<z.length;j++){w.push(v(d[i],z[j]))}z.length=0;for(j=0;j<w.length;j++){if(w[j].length!==u){for(var k=0;k<w[j].length;k++){z.push(w[j][k])}}else if(w[j]!==null)z.push(w[j])}w.length=0}if(!z.length)return z;for(j=0;j<z.length;j++){if((q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}z=w.slice(0)}return w}else{var d=b?(/#|\.|@/.exec(b)||[])[0]:null,r=b?b.indexOf(d):-1,z,y,w=[],i,j;if(!b||!b.length)b="*";if(!c)c=m;else if(!(c.length||(typeof window.HTMLElement===s?c instanceof HTMLElement:typeof c===s&&(c.nodeType===1||c.nodeType===9)&&typeof c.nodeName===t&&c.hasChildNodes())))return d==="#"?null:w;switch(d){case".":if(r===0){if(c.length){w=c[0].getElementsByClassName?c[0].getElementsByClassName(b.substr(1)):e(b.substr(1),false,c[0]);for(i=1;a<c.length;i++){z=c[i].getElementsByClassName?c[i].getElementsByClassName(b.substr(1)):e(b.substr(1),false,c[i]);for(j=0;z[j]!==u;j++){if((q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}}return w}else return c.getElementsByClassName?c.getElementsByClassName(b.substr(1)):e(b.substr(1),false,c)}else{y=new RegExp(b.substr(0,r),"i");if(c.length){for(i=0;i<c.length;i++){z=c[i].getElementsByClassName?c[i].getElementsByClassName(b.substr(r+1)):e(b.substr(r+1),b.substr(0,r),c[i]);for(j=0;z[j]!==u;j++){if((!c[i].getElementsByClassName||y.test(z[i].tagName))&&(q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}}return w}else{if(c.getElementsByClassName){z=c.getElementsByClassName(b.substr(r+1));for(i=0;z[i]!==u;i++){if(y.test(z[i].tagName))w.push(z[i])}return w}else return e(b.substr(r+1),b.substr(0,r),c)}}case"@":if(r===0){if(c.length){for(i=0;i<c.length;i++){z=w.concat(c[i].getElementsByName(b.substr(1)));for(j=0;z[j]!==u;j++){if((q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}}return w}else return c.getElementsByName(b.substr(1))}else{y=new RegExp(b.substr(0,r),"i");if(c.length){for(i=0;i<c.length;i++){z=c[i].getElementsByName(b.substr(r+1));for(j=0;z[j]!==u;j++){if(y.test(z[i].tagName))w.push(z[j])}}return w}else{z=c.getElementsByName(b.substr(r+1));for(var i=0;z[i]!==u;i++){if(y.test(z[i].tagName))w.push(z[i])}return w}}case"#":if(c.length){for(i=0;i<c.length;i++){z=w.concat((c[i].getElementById?c[i]:m).getElementById(b.substr(r+1)));for(j=0;z[j]!==u;j++){if((q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}}return w}else return (c.getElementById?c:m).getElementById(b.substr(r+1));default:if(c.length){for(i=0;i<c.length;i++){z=c[i].getElementsByTagName(b);for(j=0;z[j]!==u;j++){if((q.indexOf?w.indexOf(z[j]):f(w,z[j]))===-1)w.push(z[j])}}return w}else return c.getElementsByTagName(b)}}}})(function(a,b,c){var d=new RegExp("(^|\\s)"+a+"(\\s|$)"),b=b||"*",c=c||document,z=(b==="*"&&c.all)?c.all:c.getElementsByTagName(b),y=[],x,u=z.length;for(var i=0;i<u;i++){x=z[i];if(d.test(x.className)){y.push(x)}}return y},function(n,o){for(var j=n.length,i=0;i<j&&n[i]!==o;i++);return j<=i?-1:i});
Yur4Y_
Profil *
Witiko:
IE8 i IE9 nám totiž bezostyšně a bez zardění tvrdí, že document.getElementsByTagName("*") instanceof NodeList === false.
Ale vracia true pre instanceof HTMLCollection, využiť toto by možno bolo jednoduchšie.
Witiko
Profil
Yur4Y:
Jelikož jde o testování, jedná-li se o pole nebo NodeList, které není prázdné, tak mi přesto přijde podmínka if(pole.length) přehlednější a co do práce s nestandardními globálními objekty, jež reprezentují interface tříd DOMu, i bezpečnější než if((pole instanceof HTMLCollection === true || pole instanceof Array === true) && pole.length !== 0) se stejným efektem, vzhledem k tomu, že nic než objekt navráceno být stejnak nemůže. :-)

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