Вход

Просмотр полной версии : Подскажите как заставить искать getElementById в любом регистре ?


pods
20.09.2011, 11:09
а то изменят одну буквы на большую и не чего не работает.

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
это не моё условие
Ну, так объясни им что они не правы.

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=getElementByIdW ithoutCase(a)).tagName+"#"+b.id)})
alert( res.join('\n') )
</script>


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

Триви
20.09.2011, 14:29
Триви, 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.querySelect orAll("[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.querySelect orAll("[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)
если есть элемент вернем его, и не будем бегать по циклу)

melky
20.09.2011, 17:24
точно, про это ещё забыл.

сейчас поправлю то, что сверху

Триви
20.09.2011, 18:13
А регексп чо реально быстрее, чем встроенный toLowerCase ? :blink:

melky
20.09.2011, 22:25
сначалa сравнивать в lowercase, а потом в uppercase?

with-love-from-siberia
20.09.2011, 23:27
nikita.mmf,
melky,

А почему бы не хранить данные в самой функции?


function getElementById_(id)
{
var el = document.getElementById(id);

if ( el ) {
return el;
}

var all = arguments.callee.all = arguments.callee.all || document.getElementsByTagName("*");

var lowId = String(id).toLowerCase();
var i = 0;
while ( all[i] && all[i].toLowerCase() != lowId ) {
i++;
}
return all[i] || null;
};

Триви
21.09.2011, 00:10
А регексп чо реально быстрее, чем встроенный toLowerCase ? :blink:

сначалa сравнивать в lowercase, а потом в uppercase?



var lowId = String(id).toLowerCase();
var i = 0;
while ( all[i] && all[i].toLowerCase() != lowId ) {
i++;
}


типо того..
если уж инкремента бояться, то имеет смысл сделать тесты производительности :D

пи.си.1:
кстати, ребята, научите как мерить скорость выполнения javascript?
хочу прямо со старта стать параноиком! :D

пи.си.2:
Хоспидя, какая же чушь.. регистронезависимый id это ж просто й@бу даться! :D

with-love-from-siberia
21.09.2011, 02:13
как мерить скорость выполнения javascript?
Никак. Вы можете оценить только среднее время исполнения всего скрипта или его части. Как обычно - запоминаете текущее время перед заданным фрагментом и после. Разница этих двух величин и будет искомым временем. Так как на эту величину влияют разные внешние факторы, например, загруженность процессора, то делают несколько замеров и усредняют.


var t1 = (new Date()).getTime();
// что-то большое и громоздкое, например цикл
var t2 = (new Date()).getTime();
alert(t2 - t1);

var t1 = (new Date()).getTime();
for (var i = 0; i < n; i++) {
// что-то небольшое и быстрое
}
var t2 = (new Date()).getTime();
alert((t2 - t1) / n);


А вообще-то вопрос не по теме.

Триви
21.09.2011, 12:37
А, ясно.. как и везде.. я грешным делом подумал, может чего нового придумали))

пи.си. сорри за оффтоп :thanks:

yu_v_b
03.03.2012, 05:01
В общем так...
ищи в скрипте буковку g, ну например: ....-document.body.innerHTML.replace(eval("/"+textToFind+"/g") и при этом, естественно имеется строчки = var obj = window.document.getElementById(inputId);
= var textToFind;.... ,естественно с твоими поправками. Если обнаружил g, то рядом с ней поставь i . И твой скрипт будет искать любое соответствие независимо от регистра. Удачи.