Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Подскажите как заставить искать getElementById в любом регистре ? (https://javascript.ru/forum/events/21682-podskazhite-kak-zastavit-iskat-getelementbyid-v-lyubom-registre.html)

pods 20.09.2011 11:09

Подскажите как заставить искать getElementById в любом регистре ?
 
а то изменят одну буквы на большую и не чего не работает.

Kolyaj 20.09.2011 11:15

А зачем менять буквы? Большая и маленькая -- разные буквы, не надо их менять.

pods 20.09.2011 12:46

это не моё условие

Триви 20.09.2011 13:09

Бред какой то, но если очень надо, то можно так )))

<script type="text/javascript">
window.onload = function() {
  var allTags = document.body.getElementsByTagName('*');
  for (var i=0; i<allTags.length; i++)  {
    alert(allTags[i].id.toLowerCase());
  }
}
</script>

<body>
  <div id='idlowercase'></div>
  <span id='IDUPPERCASE'></span>
  <p id='idMixedCase'></p>
</body>

Gvozd 20.09.2011 13:14

Цитата:

Сообщение от pods
это не моё условие

Ну, так объясни им что они не правы.

melky 20.09.2011 13:52

Триви, WTF ?

раз хотят они через жопу, пусть так и будет....


// кешируем тяжелые операции. 
// loop вынесена и может быть заменена, например, jQuery.each
var all  = document.getElementsByTagName("*"), loop = Array.prototype.every;

function getElementByIdWithoutCase( id ) {

        var element, idReg = new RegExp( id, "i" );
        
        // обходим все элементы и сравниваем их ИД без учета регистра.
        loop.call( all, function(el){
                
                 // если есть ID и он соотв. указанному без учёта регистра 
                 // то устанавливаем элемент и прекращаем цикл (return false)
                 return !(el.id && idReg.test( el.id) && (element=el));    
                
        });
        
        return element;
}

пример :
<body>
  <div id='idlowercase'></div>
  <span id='IDUPPERCASE'></span>
  <p id='idMixedCase'></p>
</body>

<script type="text/javascript">

var all  = document.getElementsByTagName("*"), loop = Array.prototype.every;

function getElementByIdWithoutCase( id ) {

        var element, idReg = new RegExp( id, "i" );
        
        loop.call( all, function(el){
                

                 return !(el.id && idReg.test( el.id) && (element=el));    
                
        });
        
        return element;
}


// func end. it's test.
var res = [];
[ 'idlowercase', 'IDUPPERCASE', 'idMixedCase' ].forEach(function(a,b){res.push((b=getElementByIdWithoutCase(a)).tagName+"#"+b.id)})
alert( res.join('\n') )
</script>


Цитата:

Сообщение от Gvozd (Сообщение 127282)
Ну, так объясни им что они не правы.

помните тему про рабов-программистов, которые начальству возразить не могут ? :)

Триви 20.09.2011 14:29

Цитата:

Сообщение от melky (Сообщение 127292)
Триви, WTF ?

Ну я так как Вы исчо не умею :)
Просто в качестве идеи предложил перевести все айди в нижний регистр :D

nikita.mmf 20.09.2011 15:21

melky,
позволил себе добавить несколько оптимизаций к вашему коду
// кешируем тяжелые операции. 
// loop вынесена и может быть заменена, например, jQuery.each
var all  = document.querySelectorAll ? document.querySelectorAll("[id]") : document.getElementsByTagName("*"), 
	loop = Array.prototype.every;

function getElementByIdWithoutCase( id ) {
	var element = document.getElementById(id), idReg = new RegExp( id, "i" );
	// обходим все элементы и сравниваем их ИД без учета регистра.
	!element && loop.call( all, function(el){
		 // если есть ID и он соотв. указанному без учёта регистра 
		 // то устанавливаем элемент и прекращаем цикл (return false)
		 return !(el.id && idReg.test( el.id) && (element=el));    
	});
	return element;
}

melky 20.09.2011 17:06

я тоже изменю его :)


// коллекцию не придумал,как заменить.
var all=document.querySelectorAll?document.querySelectorAll("[id]"):document.getElementsByTagName("*");

function getElementByIdWithoutCase( id ) {

        if( document.getElementById(id) ) return document.getElementById(id);

        var idReg = new RegExp( id, "i" ), i=0;
     
        /*
         пока не пройдем все элементы
         или не найдём интересующий
        */
        while( all[i] && !idReg.test( all[i].id) ) i+=1;

        // т.к. цикл истанавливается на первом совпадении,
        // то тут будет интересующий нас элемент
        return all[i];
}


таким образом можно уменьшить количество кода и уйти от использования функции loop.

ЗЫ использовал присваивание заместо пост-инкремента, потому что присваивание быстрее на муравьиную долю. мелочь, а приятно :)
<body>
  <div id='idlowercase'></div>
  <span id='IDUPPERCASE'></span>
  <p id='idMixedCase'></p>
</body>

<script type="text/javascript">

var all=document.querySelectorAll?document.querySelectorAll("[id]"):document.getElementsByTagName("*");

function getElementByIdWithoutCase( id ) {
 
        if( document.getElementById(id) ) return document.getElementById(id);

        var idReg = new RegExp( id, "i" ),i=0;
    
        while( all[i] && !idReg.test( all[i].id) ) i+=1;

        return all[i];
}



// func end. it's test.
var res = [],b;

res.push((b=getElementByIdWithoutCase('idlowercase')).tagName+"#"+b.id)
res.push((b=getElementByIdWithoutCase('IDUPPERCASE')).tagName+"#"+b.id)
res.push((b=getElementByIdWithoutCase('idMixedCase')).tagName+"#"+b.id)

alert( res.join('\n') )
</script>

nikita.mmf 20.09.2011 17:19

melky,
у меня было одно лишнее действее для ортимизации
var element = document.getElementById(id)

если есть элемент вернем его, и не будем бегать по циклу)


Часовой пояс GMT +3, время: 16:42.