Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: передача аттрибута 'name' в функцию js
 
 автор: dimon   (23.08.2007 в 13:43)   письмо автору
 
 

два примера:

<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-ом, при этом не создавая под каждое поле отдельную функцию.
Спасибо!

   
 
 автор: sim5   (23.08.2007 в 14:32)   письмо автору
 
   для: dimon   (23.08.2007 в 13:43)
 

Для чего у вас в опшен включен тег якоря?

   
 
 автор: dimon   (23.08.2007 в 15:03)   письмо автору
 
   для: sim5   (23.08.2007 в 14:32)
 

сорри, не совсем понял вопрос. У меня вроде нет option-ов. Если вы имеете ввиду квадратные скобки около options, так это для дальнейшей обработки переменной в РНР. Поясните, в любом случае, вопрос. Спасибо!

   
 
 автор: coloboc66   (23.08.2007 в 15:07)   письмо автору
 
   для: dimon   (23.08.2007 в 15:03)
 

name="options[ ]" - так писать нельзя.

   
 
 автор: dimon   (23.08.2007 в 15:38)   письмо автору
 
   для: coloboc66   (23.08.2007 в 15:07)
 

ну, не знаю. Я уже один скрипт написал с такими штуками, и они мне помогли при обработке РНР массивов. Там ведь, при добавлении элемента, с помощью вышеупомянутой функции, присваивается такое же имя, а при обработке формы скриптом, я к обращался к соответствующим полям как $options[0/1/2 и т.д. (смотря сколько элементов было)].

   
 
 автор: sim5   (23.08.2007 в 15:09)   письмо автору
 
   для: 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) - если вам толкьо имя нужно.

   
 
 автор: dimon   (23.08.2007 в 15:34)   письмо автору
 
   для: sim5   (23.08.2007 в 15:09)
 

я, на самом деле, еще не на 100% понимаю что именно все эти "странные слова" делают ))) (у меня вообще проблема со словом this, все еще толком не могу понять как оно работает и что оно делает), но this.name не работает. На данном этапе я понимаю так: слово this в HTML коде говорит данной функции, чтоб она обращалась именно к этому элементу, в данном случае, это якорь <a>, а функция, в свою очередь, делающая еще несколько попутных операций и назначая переменные, выходит из данного элемента (parentNode) и вставили перед ним (insertBefore) элемент 'br' и переменную t, создающую элемент input с соответствующими атрибутами. Вот как я это понимаю, но аргументировать нужно это все или нет, я не могу))). Простите, за все это объяснение, но в живую мне советоваться АБСОЛЮТНО не с кем, а учить программирование самому, страшно тяжело!

   
 
 автор: sim5   (23.08.2007 в 15:53)   письмо автору
 
   для: dimon   (23.08.2007 в 15:34)
 

this - в переводе с английского означает ЭТО. То есть, если вы пишите this.name, то в функцию по указанному событию будет передано имя элемента (в буквальном смысле можно перевести как "это имя"), в вашем случает options[].
Если написать просто this, то вы можете в функции узнать это имя. Например в функции аргуметом указано - elm, тогда для получении имени элемента нужно будет написать
elm.name.
Вообще же мне так кажется, что вы не то делаете. Если элементы это массив, то имя у всех уже определено. Если вам нужно добавлять элементы, то наверное это надо делать отдельной кнопкой "Добавить". Хотя я быть может и не понимаю вашей задачи.

   
 
 автор: dimon   (23.08.2007 в 16:21)   письмо автору
 
   для: 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. ))) Думаю, многие профи испытывали такое, когда только начинали, и потому они и стали профи, потому что не сдавались ))) Оптимистично!

   
 
 автор: sim5   (23.08.2007 в 16:31)   письмо автору
 
   для: dimon   (23.08.2007 в 16:21)
 

А я вам что по вашему написал? Каждый INPUT имеет событие по которому в функцию передается его имя - вы же этого хотели (хотя лучше передавать просто объект)? Только нужно собитие не по клику - иначе при первом же клике будет вызов функции, а например по двойному клику:

ondblclick="functionName(this)"

Фнкция нужна всего одна - вызовы просто с каждого элемента. А уж в функции решайте, что вы хотите от этого объекта: имя, значение или др..
А вот несколько десятков значений - не представляю, для чего бы они потребовались...

   
 
 автор: dimon   (23.08.2007 в 16:43)   письмо автору
 
   для: 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)) должа работаться, но это не правда, хотя я и не знаю почему...

   
 
 автор: sim5   (23.08.2007 в 17:01)   письмо автору
 
   для: dimon   (23.08.2007 в 16:43)
 

Найдите здесь на форуме был пример динамического создания полей типа file, возможно он вам подойдет. Вы опять пишите какую-то ахинею:

getInputName('error')"

Вы передаете имя (причем не существующее) в функцию, а в ней по этому имени обращаетесь к ID:

document.getElementById(id)

Ищите действующий пример, так лучше для вас будет.

   
 
 автор: dimon   (23.08.2007 в 17:07)   письмо автору
 
   для: 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;
}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования