Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

зависимые списки -как сделать быстрее? (Maus, оценка: -1)
Goto page 1, 2  Next
Author Message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 12:15 pm (написано за 7 минут 56 секунд)
   Post subject: зависимые списки -как сделать быстрее?
Reply with quote

Темы про зависимые списки здесь посмотрел.
Доп. данные:
Весь существенный JS генерится через PHP в момент отдачи страницы, никакого ajax.
Списки serv1 и serv2 - это подмножества некоторого другого списка, поэтому частично пересекаются. Исходный список имеет ~80 элементов.
Вопросы
1) можно ли этот код сделать быстрее?
2) имеет ли смысл делать быстрее?
3) можно ли сделать через генерацию не <option> - элементов, а всего списка целиком? То есть будет не последовательная чистка списка slave, а какой-нибудь replaceChild? И будет ли это лучше и быстрее?

вот код:
Code (html): скопировать код в буфер обмена
< (december.com/html/4/element/.html)?xml version="1.0" encoding="cp1251" ?> (december.com/html/4/element/.html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html (december.com/html/4/element/html.html) xmlns="http://www.w3.org/1999/xhtml"> (december.com/html/4/element/.html)
<head> (december.com/html/4/element/head.html)
<meta (december.com/html/4/element/meta.html) http-equiv="Content-Type" content="text/html; charset=windows-1251" /> (december.com/html/4/element/.html)
<title> (december.com/html/4/element/title.html)Yo!</title>
</head>
<body> (december.com/html/4/element/body.html)
<form (december.com/html/4/element/form.html) action="" name="form_top"> (december.com/html/4/element/.html)
<select (december.com/html/4/element/select.html) name="server" onchange="slavesel(this.value, this.form)"> (december.com/html/4/element/.html)
<option (december.com/html/4/element/option.html) value="serv1"> (december.com/html/4/element/.html)First</option>
<option (december.com/html/4/element/option.html) value="serv2" style="background-color: lime;"> (december.com/html/4/element/.html)Second</option>
</select>
<select (december.com/html/4/element/select.html) name="slave"> (december.com/html/4/element/.html)
<option (december.com/html/4/element/option.html) value="0"> (december.com/html/4/element/.html)Value1</option>
<option (december.com/html/4/element/option.html) value="4"> (december.com/html/4/element/.html)Value4</option>
</select>
</form>
<script (december.com/html/4/element/script.html) type="text/javascript"> (december.com/html/4/element/.html)
servers = {
        serv1: new Array(),
        serv2:  new Array()
};
servers.serv1 = [
new Option("Value1", 0, true, true),
new Option("Value4", 4, false, false)
];
servers.serv2 = [
new Option("Value4", 4, true, true),
new Option("ValueN", 4002, false, false),
new Option("Value_NN", 4004, false, false)
];

slavesel = function(serv, f)
{
        for (var i=(f.slave.options.length-1); i>=0; i--)
                f.slave.options[i] = null;
        var curlist = servers[serv];
        for (var i=0; i<curlist.length; i++)
        f.slave.options[i] = curlist[i];
}
</script>
</body></html>
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Mon Oct 02, 2006 12:40 pm (спустя 25 минут; написано за 2 минуты 16 секунд)
   Post subject:
Reply with quote

Maus
Истинно так - имеет смысл генерить N селектов с одинаковыми именами (и разными пунктами) и менять их по replaceChild.
Быстрее и кошернее 8*)

Значительно снижаются расходы на переключение списков, немного вырастает расход памяти.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 3:07 pm (спустя 2 часа 26 минут; написано за 34 секунды)
   Post subject:
Reply with quote

WingedFox
Спасибо!

Вопрос решен, но появилась куча новых.

Last edited by Maus on Mon Oct 02, 2006 4:55 pm; edited 1 time in total
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 3:51 pm (спустя 43 минуты; написано за 2 минуты 46 секунд)
   Post subject:
Reply with quote

Как вы быстро закрываете (1 вопрос - 1 ответ?) ;-)

- new Option() будет более надёжным вариантом с точки зрения кроссбраузерности и поддержки старых IE;
- createElement() возможно (каждый брауз. надо проверять) будет быстрее, если речь пойдёт о большем количестве options;
- в текущем коде можно бы сразу засунуть иницализаторы массива в свойства объекта servers, чтобы не создавать массивы дважды;
- плюс к этому, можно было бы разом удалить элементы селекта, присвоив свойству селекта length ноль;
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 5:06 pm (спустя 1 час 15 минут; написано за 3 минуты 39 секунд)
   Post subject:
Reply with quote

Zeroglif
Уболтали (:
Zeroglif wrote:
в текущем коде можно бы сразу засунуть иницализаторы массива в свойства объекта servers
как это понять?

и второе: при переписывании получилась вот такая гнусная конструкция:
Code (JavaScript): скопировать код в буфер обмена
servers = {
    serv1: null,
    serv2:  null
};
servers.serv1 = document.createElement("select");
servers.serv1.name = "slave";
servers.serv1.multiple = false;
servers.serv1.options[0] = new Option("Value1", 0, true, true);
servers.serv1.options[1] = new Option("Value4", 4, false, false);

servers.serv2 = document.createElement("select");
servers.serv2.name = "slave";
servers.serv2.multiple = false;
servers.serv2.options[0] = new Option("Value4", 4, true, true);
servers.serv2.options[1] = new Option("ValueN", 4002, false, false);
servers.serv2.options[2] = new Option("Value_NN", 4004, false, false);

slavesel = function(serv, f)
{
        try{
        f.replaceChild(servers[serv], f.slave);
    } catch(e){};
}
блок try/catch появился после опечатки . А в остальном - нельзя ли обойтись без этих скучных индексов: servers.serv2.options[0] и остальные? На servers.serv2.options[] ругается.
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 6:10 pm (спустя 1 час 4 минуты; написано за 2 минуты 14 секунд)
   Post subject:
Reply with quote

а циклы для чего?
Code (JavaScript): скопировать код в буфер обмена
var my_options = {
        value1: 'text1',
...
        valueN: 'textN',
};

for (value in my_options) {
        my_select.options[my_select.options.length] = new Options(my_options.value, value);
}
это только пример
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 6:13 pm (спустя 2 минуты)
   Post subject:
Reply with quote

Maus
В данном конкретном случае можно так:
Code (JavaScript): скопировать код в буфер обмена
var slavesel = (function() {
  var values = [4, 4002, 4004],
  texts = ["Value4", "ValueN", "Value_NN"],
  sel = document.createElement('select');
  for(var i = 0, l = values.length; i < l; i++) {
    var o = document.createElement('option');
    o.value = values[i];
    o.text = texts[i];
    sel.add(o, o.length);
  }
  return(function(f) {
    var s = arguments.callee.sel || sel;
    arguments.callee.sel = f.replaceChild(s, f.elements[1]);
  })
})()
/*Вызов:*/
onchange="slavesel(this.form)"
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 7:22 pm (спустя 1 час 9 минут; написано за 7 минут 21 секунду)
   Post subject:
Reply with quote

AKS
Уточнение раз: на реальной форме элементов больше, и с порядком я пока не определился (-;
Уточнение два: начальное содержимое slave-списка зависит от урла.
Уточнение три: вариантов slave-списка может быть больше двух

Получилось вот так:
Code (JavaScript): скопировать код в буфер обмена
var slavesel = (function() {
    var selects =
    {
        servOne:
        {
            v: document.createElement('select'),
            values: [0, 4],
            texts: ["Value_0", "Value4"]
        },
        servAnother:
        {
            v: document.createElement('select'),
            values: [4, 4002, 4004],
            texts: ["Value4", "ValueN", "Value_NN"]
        }
    };
   
    for (key in selects)
    {
        var s = selects[key];
        s.v.name="slave";
        s.v.multiple = false;
        for (var i=0, l = s.values.length; i < l; i++ )
        {
            var o = document.createElement('option');
            o.value = s.values[i];
            o.text = s.texts[i];
            s.v.add(o, o.length);
        }
        selects[key] = s;
    }
    return(function(f)
        {
            var s = arguments.callee.selects || selects;
            var name  = f.server.value;
           
            f.replaceChild(s[name].v, f.slave);
        }
    )
})();
HTML изменился незначительно: вызов - по-Вашему, одним аргументом
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 7:25 pm (спустя 2 минуты; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

AKS
кстати, а почему
Code (JavaScript): скопировать код в буфер обмена
createElement('option')
, а не
Code (JavaScript): скопировать код в буфер обмена
new Option(texts[i], values[i], false, false)
?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 7:38 pm (спустя 13 минут; написано за 3 минуты 4 секунды)
   Post subject:
Reply with quote

Maus
Да, если будет больше двух списков, то придется создавать каждый и потом выбирать (в точности, как у Вас уже сделано). Вот эта строка уже будет не нужна - var s = arguments.callee.selects || selects (это каждый реплейс сохранял предыдущий список, удобно, когда их только два).
А насчет "почему так, а не по-другому", то это уж как хочется, я не знаю, как лучше. Вот Zeroglif считает, что new Option надежней, и нет оснований ему не доверять...
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 8:14 pm (спустя 35 минут; написано за 45 секунд)
   Post subject:
Reply with quote

AKS
Не получилось - мерзкий IE ругается на type mismatch в f.replaceChild(s[name].v, f.slave) при втором вызове функции
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 8:36 pm (спустя 21 минуту; написано за 1 минуту 46 секунд)
   Post subject:
Reply with quote

Maus
Я не стал разбираться, почему ошибка (спать пора), но свой вариант быстренько переделал, чтобы была возможность добавлять, если нужно еще данные в массивы для селектов:
Code (JavaScript): скопировать код в буфер обмена
var slavesel = (function() {
  var texts = [["Value_0", "Value4"],["Value4", "ValueN", "Value_NN"]],
  values = [[0, 4], [4, 4002, 4004]],
  selects = [document.createElement('select'), document.createElement('select')];
  for(var i = 0, l = texts[0].length, o; i < l; i++) {
    (o = document.createElement('option')).value = values[0][i];
    selects[0].add((o.text = texts[0][i], o), o.length);
  }
  for(var i = 0, l = texts[1].length, o; i < l; i++) {
    (o = document.createElement('option')).value = values[1][i];
    selects[1].add((o.text = texts[1][i], o), o.length);
  }
  return(function(index, f) {
    f.replaceChild(selects[index], f.elements[1]);
  })
})()
/*
onchange="slavesel(this.selectedIndex, this.form)"
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 02, 2006 8:58 pm (спустя 22 минуты; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

AKS wrote:
elements[1]
вот в этом и дело. В IE такой способ работает по-любому. А в моём варианте после f.replaceChild(s[name].v, f.slave) f.slave становится undefined
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Oct 02, 2006 11:45 pm (спустя 2 часа 47 минут; написано за 11 секунд)
   Post subject:
Reply with quote

Maus wrote:
вот в этом и дело. В IE такой способ работает по-любому. А в моём варианте после f.replaceChild(s[name].v, f.slave) f.slave становится undefined
Это обычное поведение IE, он не видит name после createElement():

msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/name_2.asp
Quote:
The NAME attribute cannot be set at run time on elements dynamically created with the createElement method. To create an element with a name attribute, include the attribute and value when using the createElement method.
Тут надо или проверять на IE и делать document.createElement("<SELECT NAME='slave'></SELECT>");, или извращаться с какой-нибудь проверкой на наличие name, или вообще обходиться без этого.
Quote:
Zeroglif считает, что new Option надежней
Гадом буду ;-) проще, надёжнее, и даже может быстрее местами. Проверим?
Code (JavaScript): скопировать код в буфер обмена
<html>
    <head>
    <title>Test</title>
    </head>
    <body>
        <form>
            <select>
                <option value="1">Value1</option>
            </select>
            <select>
                <option value="1">Value1</option>
            </select>
            <select>
                <option value="1">Value1</option>
            </select>                               
        </form>
        <script type="text/javascript">
        (function () {
            var t = new Date(), s = document.getElementsByTagName('select')[0], i;
            s.length = 0;
            for (i = 1; i < 501; i++) {
                s.options[s.length] = new Option(i, i, false, false);
            }
            alert((new Date() - t) + ' --> new Option()');
        })();             
        (function () {
            var t = new Date(), s = document.getElementsByTagName('select')[1], i, o;
            s.length = 0;
            for (i = 1; i < 501; i++) {
                o = document.createElement('option');
                o.value = i;
                o.text = i;
                s.add(o, o.length);
            }
            alert((new Date() - t) + ' --> createElement() + add()');
        })();       
        (function () {
            var t = new Date(), s = document.getElementsByTagName('select')[2], i, o;
            s.length = 0;
            for (i = 1; i < 501; i++) {
                o = document.createElement('option');
                o.value = i;
                o.appendChild(document.createTextNode(i));
                s.appendChild(o);
            }
            alert((new Date() - t) + ' --> createElement() + createTextNode() + appendChild()');
        })();       
        </script>
    </body>
</html>
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Oct 03, 2006 7:22 am (спустя 7 часов 37 минут; написано за 3 минуты 53 секунды)
   Post subject:
Reply with quote

Zeroglif
Quote:
Гадом буду ;-)...
Не-а, не получится! ;-) Из теста видно, что в общем и целом быстрее делать через new Option, особенно в IE заметна разница (172, 203, 281). Кстати, Opera 9-ка быстрее всех в разы и ей как-будто без разницы, как создавать опции (31, 31(16), 16(31)). Только что обновленная FF пока за Opera не может угнаться (78, 94, 94), а те FF, что постарше - еще чуть помедленней.
Maus
Немножко подправил (утро вечера мудреней), чтобы удобней было - в массивы надо добавлять дополнительные массивы, а остальное все само по себе будет создано, причем через new Option в соответствии с результатами теста (и в select['server'] добавлять опции):
Code (JavaScript): скопировать код в буфер обмена
var slavesel = (function() {
  var texts = [["Value_0", "Value4"], ["Value4", "ValueN", "Value_NN"],["Value3"]],
  values = [[0, 4], [4, 4002, 4004], [3]],
  selects = [];
  for(var i = 0, l = texts.length; i < l; i++) {
    selects[i] = document.createElement('select');
    for(var k = 0, d = texts[i].length; k < d; k++) {
      selects[i].options[k] = new Option(texts[i][k], values[i][k], false, false);
    }
  }
  return(function(index, f) {
    f.replaceChild(selects[index], f.elements[1]);
  })
})()
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 03, 2006 11:15 am (спустя 3 часа 52 минуты; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Это обычное поведение IE
Жалкий, ничтожный браузер. Оставлю себе в коде напоминалку и буду юзать elmenets
AKS
Угу, спасибо. Надеюсь, в JS нет ограничения на длину строки?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Oct 03, 2006 11:22 am (спустя 7 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

И всё-таки, зачем бегать по списку, если можно хранить несколько готовых к употреблению селектов, с бесплатной фичей запоминания выбранных пунктов?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Oct 03, 2006 11:44 am (спустя 21 минуту; написано за 27 секунд)
   Post subject:
Reply with quote

А с .name прекрасно справляется
Code (JavaScript): скопировать код в буфер обмена
var a = document.createElement('input');
try{a.outerHTML = a.outerHTML.replace(/^(<\w+)/,"$1 name=\"b\"")} catch(e) {a.name="b"}
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 03, 2006 12:24 pm (спустя 39 минут; написано за 1 секунду)
   Post subject:
Reply with quote

WingedFox wrote:
И всё-таки, зачем бегать по списку, если можно хранить несколько готовых к употреблению селектов
не понял
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Oct 03, 2006 1:00 pm (спустя 35 минут; написано за 5 минут 16 секунд)
   Post subject:
Reply with quote

На старте сделать
Code (any language): скопировать код в буфер обмена
примерно так 8*)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Oct 03, 2006 1:16 pm (спустя 16 минут; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

Maus wrote:
Надеюсь, в JS нет ограничения на длину строки?
Я этого не знаю, к сожалению. Ограничение, конечно же, должно быть (а как без ограничений?), но, видимо, выражается оно в чем-то, находящемся за гранью разумного.
Здесь на форуме в теме Транслит (forum.dklab.ru/js/other/Translit.html) в тесте WingedFox используется строка длинной в 10000 символов, и очень быстро обрабатывается...
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 03, 2006 2:05 pm (спустя 48 минут; написано за 55 секунд)
   Post subject:
Reply with quote

AKS
а в приведённом Вами варианты списки создаются с нуля при каждом вызове? (см пост от WingedFox) . Мне показалось ,что это может быть какой-нибудь конструктор.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Tue Oct 03, 2006 2:11 pm (спустя 5 минут; написано за 45 секунд)
   Post subject:
Reply with quote

Посмотрел внимательнее - так и сделано.
Но в этой мешанине кода с первого (и даже со второго) взгляда не разобраться...
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Oct 03, 2006 2:21 pm (спустя 9 минут; написано за 3 минуты 2 секунды)
   Post subject:
Reply with quote

Maus wrote:
а в приведённом Вами варианты списки создаются с нуля при каждом вызове?
Нет, списки не создаются при каждом вызове. Списки будут созданы один раз, также как у WingedFox, просто к ним нет доступа в глобальной области видимости (только внутренняя функция, на которую ссылается идентификатор slavesel, может ими манипулировать).
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 03, 2006 2:26 pm (спустя 5 минут; написано за 41 секунду)
   Post subject:
Reply with quote

WingedFox, AKS
Значит, всё прекрасно! Тему можно закрывать

Вопрос решен, тему можно закрыть.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 12:12 am (спустя 9 часов 46 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

Не дадим закрыть тему. ;-)

Ещё один вариант для потомков. Slave-cписки создаются не разом при загрузке, а только нужный при выборе пункта в Mаster-списке. Вновь созданный slave-список перемещается в кэш, дабы нам заново его потом не строить. C именем 'slave' проблем нет.
Code (JavaScript): скопировать код в буфер обмена
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
        <title>Yo!</title>
    </head>
    <body>
        <form action="" name="form_top">
            <select name="server" onchange="toggle(this,'slave')">
                <option value="1">First</option>
                <option value="2">Second</option>
                <option value="3">Third</option>
            </select>
            <select name="slave">
                <option value="1">Slave1Value1</option>
                <option value="2">Slave1Value2</option>
            </select>
        </form>
        <script type="text/javascript">
        var toggle =
            function () {
                var C = {},
                    S = {
                    1 : [['Slave1Value1', '1'], ['Slave1Value2', '2']],
                    2 : [['Slave2Value1', '1'], ['Slave2Value2', '2']],
                    3 : [['Slave3Value1', '1'], ['Slave3Value2', '2']]
                };                               
                function M(v) {
                    var s = document.createElement('select'), i, l;
                    for (i = 0, l = S[v].length; i < l; i++) {
                        s.options[i] = new Option(S[v][i][0], S[v][i][1], false, false);
                    }
                    return (C[v] = s);
                };                           
                return function (t, n) {
                        var s = C[t.value] || M(t.value);
                        t.form.replaceChild(s, t.form[n]);
                        t.form[s.name = n] = s;
                    };
            }();
        </script>
    </body>
</html>
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 7:23 am (спустя 7 часов 10 минут; написано за 6 минут 19 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Slave-cписки создаются не разом при загрузке, а только нужный при выборе пункта...
Есть смысл делать именно так - ведь все-то списки могут даже и не понадобится. И время вроде позволяет (самый медленный результат - 500 пунктов за 281мс, причем если создавать поля со значениями и с текстом время уйдет ну почти столько же)...
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Oct 04, 2006 11:34 am (спустя 4 часа 11 минут; написано за 3 минуты 54 секунды)
   Post subject:
Reply with quote

Quote:
много хорошо - тоже плохо
Но последний вариант от Zeroglif безусловно лучший. Поддерживаются нечисловые ключи (значения мастер-списка), произвольный целевой список, и работает быстро (я когда внедрил, сначал подумал ,что где-то опечатался - список даже не моргнул).

Теперь-то уж можно закрыть или жажда перфекционизма ещё одолевает??
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 5:08 pm (спустя 5 часов 34 минуты; написано за 6 минут 8 секунд)
   Post subject:
Reply with quote

Maus wrote:
Теперь-то уж можно закрыть...
Вот вчера бы закрыли, не было бы лучшего варианта. Может и не нужно закрывать? Мало ли, может еще что-нибудь обсудить захочется. Тема-то с самого начала просила: "Не закрывайте меня, я Вам пригожусь!" - так оно и вышло... ;)
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Oct 04, 2006 6:12 pm (спустя 1 час 3 минуты; написано за 2 минуты 1 секунду)
   Post subject:
Reply with quote

AKS wrote:
может еще что-нибудь обсудить захочется
что-нибудь лучше обсуждать в отдельной теме. Тут вроде ничего не осталось:
1) реализовали вариант с конструктором
2) добавили "инициализацию по запросу"
3) победили IE
4) рассмотрели частный случай с двумя списками.
Я что-то пропустил?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 8:00 pm (спустя 1 час 47 минут; написано за 2 минуты 40 секунд)
   Post subject:
Reply with quote

Maus wrote:
Я что-то пропустил?
Нет, нет, ни в коем случае! Я ведь с просьбой обратился...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 10:24 pm (спустя 2 часа 24 минуты; написано за 11 секунд)
   Post subject:
Reply with quote

Эта небольшая ветка - характерный пример работы коллективного разума. Быстренько выяснили, что быстрее, решили сделать replaceChild (WingedFox), сварганили замыкание (AKS), определились с форматом записи данных, поставили IE на место и т.д. и т.п. Обожаю форумы. Лучшее достижение сетевого человечества.

А самое смешное, что через месяц другой сюда заглянет какой-нибудь Вася Пупкин и нас сделает, научит ядерному яваскрипту... ;-)
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Sun Oct 15, 2006 4:45 pm (спустя 10 дней 18 часов 21 минуту; написано за 4 секунды)
   Post subject:
Reply with quote

Здравствуйте всем. Вопрос, наверное к профи.
Подскажите, кто глубоко знает javascript, как сделать ДВА РАВНОПРАВНЫХ ЗАВИСИМЫХ селекта.
Т.е. в одном селект выбираешь город, во втором отображаются все города, куда есть рейсы из первого города.
И наоборот.
Тут связь типа многие ко многим.

Очень-очень нужно!!!
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Oct 15, 2006 7:54 pm (спустя 3 часа 9 минут; написано за 36 секунд)
   Post subject:
Reply with quote

А последний примерчик не получится приспособить?
Back to top
View user's profile Send private message Send e-mail
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Mon Oct 16, 2006 12:19 pm (спустя 16 часов 24 минуты; написано за 1 минуту 59 секунд)
   Post subject:
Reply with quote

Anonymous wrote:
Здравствуйте всем. Вопрос, наверное к профи.
Подскажите, кто глубоко знает javascript, как сделать ДВА РАВНОПРАВНЫХ ЗАВИСИМЫХ селекта.
Т.е. в одном селект выбираешь город, во втором отображаются все города, куда есть рейсы из первого города.
И наоборот.
Тут связь типа многие ко многим.

Очень-очень нужно!!!
думаю, что тут не многие ко многим...
тут скорее так:

A->B
C<-D

где A, D - списки всех городов
B, C - ЗАВИСИМЫЕ списки, при выборке в которых изменения в A, D происходить НЕ ДОЛЖНО, во избежание бесконечного цикла.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Oct 16, 2006 12:51 pm (спустя 31 минуту; написано за 3 минуты 21 секунду)
   Post subject:
Reply with quote

Никита Косолaпов
если учесть, что "туда" и "обратно" совпадают, то имхо для данных сгодилась бы структура вроде такой:
Code (JavaScript): скопировать код в буфер обмена
var towns = {
    1: {
        name: "Магадан",
        to: new Array()
    },
    2: {
        name: "Петербург",
        to: new Array()
    },
   
    3: {
        name: "Москва",
        to: new Array()
    }
}
функция принимает в качестве параметров форму и вызвавший список. Плюс надо предусмотреть возможность сброса фильтра (возврата к полному списку)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 3:40 pm (спустя 1 месяц 18 дней 2 часа 49 минут; написано за 3 минуты 57 секунд)
   Post subject:
Reply with quote

Maus
Сегодня наткнулся на кое-что (у Eric Lippert'а (blogs.msdn.com/ericlippert/archive/2003/11/05/53336.aspx)), являющееся ответом на ваш вопрос:
Quote:
Надеюсь, в JS нет ограничения на длину строки?
Он пишет, что "длина строки ограничена лишь памятью ОС", называя длину строки "фактически бесконечной".

P.S. Пытаюсь найти ответы на все вопросы, пусть и с опозданием. :)
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 4:56 pm (спустя 1 час 16 минут; написано за 27 секунд)
   Post subject:
Reply with quote

Quote:
"фактически бесконечной"
groups.google.com/group/comp.lang.javascript/browse_frm/thread/b173828d5ee84809/fe17a0a7367225a0
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 5:52 pm (спустя 55 минут; написано за 2 минуты 16 секунд)
   Post subject:
Reply with quote

Zeroglif
;) Короче говоря, никто ничего точно не знает - все "пробуют" строку на ощупь, а там уж у кого что получится...
Ну а Эрику-то можно верить? Ведь пишет же, что "для всех практических целей...".
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Dec 03, 2006 6:39 pm (спустя 47 минут)
   Post subject:
Reply with quote

Quote:
Короче говоря, никто ничего точно не знает
Точно.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML