|
|
|
| два примера:
<input type="text" name="options[]" size="10"><a href="#" onclick="return more_options(this)">+</a>
|
function more_mods(obj) {
var t = document.createElement('input');
t.type = 'text';
t.name = 'options[]';
t.style.marginTop = "5px";
obj.parentNode.insertBefore(document.createElement('br'), obj);
obj.parentNode.insertBefore(t, obj);
return false;
}
|
Думаю все знающие JS больше меня поняли что именно эти два кода делают: Они дополняют друг друга. При нажатии на якорь "+", перед этим якорем вставляется поле "input" с идентичными параметрами, как и первое поля. Цель: если нужно, то создаются несколько полей данных, если нет - соответственно, не создается ничего.
Сейчас я решил усложнить себе задачу (я только начал учить JS, и верхний код я откуда-то скатал, и немного переделал под свои нужды): таких полей, оказывается, мне может понадобиться больше чем одна, и даже больше чем 10-20 штук. Мне кажется совсем не интересно под каждое такое поле создавать отдельную функцию, а, скорее всего, проще просто передать атрибут name в функицю. Тут я игрался с parentNode.firstChild, предварительно заключив первый кусок кода в div: что-то получалось, но потом все оборвалось, и через 4 часа мучений я ничего так и не добился.
Итак задача такая, что нужно чтобы функция определяла name рядом стоящего input и значение переносила в функцию. Таким образом при нажатии на + я получаю поле [input] с нужным мне name-ом, при этом не создавая под каждое поле отдельную функцию.
Спасибо! | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 13:43)
| | Для чего у вас в опшен включен тег якоря? | |
|
|
|
|
|
|
|
для: sim5
(23.08.2007 в 14:32)
| | сорри, не совсем понял вопрос. У меня вроде нет option-ов. Если вы имеете ввиду квадратные скобки около options, так это для дальнейшей обработки переменной в РНР. Поясните, в любом случае, вопрос. Спасибо! | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 15:03)
| | name="options[ ]" - так писать нельзя. | |
|
|
|
|
|
|
|
для: coloboc66
(23.08.2007 в 15:07)
| | ну, не знаю. Я уже один скрипт написал с такими штуками, и они мне помогли при обработке РНР массивов. Там ведь, при добавлении элемента, с помощью вышеупомянутой функции, присваивается такое же имя, а при обработке формы скриптом, я к обращался к соответствующим полям как $options[0/1/2 и т.д. (смотря сколько элементов было)]. | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 15:03)
| | Да, спутал немного, я вот об этом:
<input type="text" name="options[]" size="10"><a href="#" onclick="return more_options(this)">+</a>
|
У вас якорь служит для чего? Только для того чтобы обратиться к скрипту? Зачем тогда он вообще нужен? Что он передает в функцию? Если вы хотите передать в функцию имя INPUT, то почему не пишите проще:
<input type="text" name="options[]" size="10" onclick="return more_options(this)">
можно сразу - return more_options(this.name) - если вам толкьо имя нужно.
|
| |
|
|
|
|
|
|
|
для: sim5
(23.08.2007 в 15:09)
| | я, на самом деле, еще не на 100% понимаю что именно все эти "странные слова" делают ))) (у меня вообще проблема со словом this, все еще толком не могу понять как оно работает и что оно делает), но this.name не работает. На данном этапе я понимаю так: слово this в HTML коде говорит данной функции, чтоб она обращалась именно к этому элементу, в данном случае, это якорь <a>, а функция, в свою очередь, делающая еще несколько попутных операций и назначая переменные, выходит из данного элемента (parentNode) и вставили перед ним (insertBefore) элемент 'br' и переменную t, создающую элемент input с соответствующими атрибутами. Вот как я это понимаю, но аргументировать нужно это все или нет, я не могу))). Простите, за все это объяснение, но в живую мне советоваться АБСОЛЮТНО не с кем, а учить программирование самому, страшно тяжело! | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 15:34)
| | this - в переводе с английского означает ЭТО. То есть, если вы пишите this.name, то в функцию по указанному событию будет передано имя элемента (в буквальном смысле можно перевести как "это имя"), в вашем случает options[].
Если написать просто this, то вы можете в функции узнать это имя. Например в функции аргуметом указано - elm, тогда для получении имени элемента нужно будет написать
elm.name.
Вообще же мне так кажется, что вы не то делаете. Если элементы это массив, то имя у всех уже определено. Если вам нужно добавлять элементы, то наверное это надо делать отдельной кнопкой "Добавить". Хотя я быть может и не понимаю вашей задачи. | |
|
|
|
|
|
|
|
для: sim5
(23.08.2007 в 15:53)
| | Спасибо за разъяснения - пригодятся ))
Насчёт задачи:
Представьте себе не один элемент <input>, а несколько десятков. Это означает, что у каждого из них будет отдельное, уникальное имя переменной. В моей форме иногда случается так, что к одной переменной нужно прибавить еще несколько значений. Для этого я и использую ссылочку, где прописывается функция, добавляющая идентичный элемент. Понимаю, что можно сделать и кнопку, но ведь разницы-то никакой: что так, что так будет onClick="функция". Или нет? Так вот, сейчас у меня в присоединенном файлике functions.js прописано примерно 12 функций, каждая из которых отличается друг от друга лишь t.name, и иногда там мелькает t.size и t.value. Это, кстати еще один пунктик, который я б хотел сделать: чтоб функция просматривала нужный мне тег input и, попросту говоря, клонировала его.
И еще я понимаю, что, в принципе, можно это все обойти, заменив <input type="text"> на <textarea>, потом, при обработке, подсчитывать, использовать explode (в РНР), или split (в JS), но мне уже интересно, как выполнить то, что я задумал на javascript. ))) Думаю, многие профи испытывали такое, когда только начинали, и потому они и стали профи, потому что не сдавались ))) Оптимистично! | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 16:21)
| | А я вам что по вашему написал? Каждый INPUT имеет событие по которому в функцию передается его имя - вы же этого хотели (хотя лучше передавать просто объект)? Только нужно собитие не по клику - иначе при первом же клике будет вызов функции, а например по двойному клику:
ondblclick="functionName(this)"
Фнкция нужна всего одна - вызовы просто с каждого элемента. А уж в функции решайте, что вы хотите от этого объекта: имя, значение или др..
А вот несколько десятков значений - не представляю, для чего бы они потребовались... | |
|
|
|
|
|
|
|
для: sim5
(23.08.2007 в 15:53)
| | а можно примерчик? )))
я с чистой теорией не очень дружу, мне надо все по полкам разбирать ))
вот, кстати, что я тут соорудил:
<td id="error" align="middle"><input type="text" name="named_error" size="10">
<a href="#" style="text-decoration:none;" onClick="return getInputName('error')">+</a>
</td>
|
function createInput(obj, inputName) {
var t = document.createElement('input');
t.type = 'text';
t.name = inputName;
t.style.marginTop = "5px";
obj.parentNode.insertBefore(document.createElement('br'), obj);
obj.parentNode.insertBefore(t, obj);
return false;
}
function getInputName (id) {
var x = document.getElementById(id);
var y = x.getElementsByTagName("input");
createInput(this, y[0].name);
|
Я, по своей наивности, думал что последняя строчка в функции (createInput (this, y[0].name)) должа работаться, но это не правда, хотя я и не знаю почему... | |
|
|
|
|
|
|
|
для: dimon
(23.08.2007 в 16:43)
| | Найдите здесь на форуме был пример динамического создания полей типа file, возможно он вам подойдет. Вы опять пишите какую-то ахинею:
getInputName('error')"
Вы передаете имя (причем не существующее) в функцию, а в ней по этому имени обращаетесь к ID:
document.getElementById(id)
Ищите действующий пример, так лучше для вас будет. | |
|
|
|
|
|
|
|
для: sim5
(23.08.2007 в 17:01)
| | Спасибо за терпение )) с новичками тяжело, понимаю... но у меня вроде получилось, разобрался ))
насчет несуществующего имени - согласен, ошибся там чуток ))
если вдруг кому-нибудь такое надо-будет, то вот какая функция решает проблему:
function more_options(obj) {
var objName = obj.parentNode.getElementsByTagName('input');
var t = document.createElement('input');
t.type = 'text';
t.name = objName[0].name;
t.style.marginTop = "5px";
obj.parentNode.insertBefore(document.createElement('br'), obj);
obj.parentNode.insertBefore(t, obj);
return false;
}
|
| |
|
|
|
|