Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание дубликата элемента (https://javascript.ru/forum/misc/45522-sozdanie-dublikata-ehlementa.html)

Sivik 04.03.2014 10:35

Создание дубликата элемента
 
всем привет)

прошу помочь с таким вопросом:
как создать точную копию элемента, со всеми его атрибутами и пр.?

к примеру есть элемент

<input name="name" type="text" placeholder="" title="какой-то текст" id="id" required>


нужно создать точную копию элемента, но без прибегания каждый раз к createElement и его setAttribute, ибо слишком много кода.

заранее спасибо)

danik.js 04.03.2014 10:39

cloneNode()

Sivik 05.03.2014 10:29

о, спасибо большое)

и ещё один вопрос. как клонировать элемент, но указать, что один из атрибутов будет иметь иное значение?

danik.js 05.03.2014 10:43

Склонировать, и указать новое значение атрибута.

ruslan_mart 05.03.2014 10:44

Ну так просто укажите клонированному элементу своё значение атрибута.

var elem = document.getElementById('id'),
    newElem = elem.clone;

newElem.name = 'new-name';

ruslan_mart 05.03.2014 10:45

danik.js, блин, опередил. :)

Sivik 05.03.2014 11:16

спасибо вам, ребята) помогаете чайнику)

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

Aetae 05.03.2014 11:22

.cloneNode(true)
клонирует и детей.
А дальше - склонированая нода - точно такая же как и любая другая, и методы работы с ней те же.

Sivik 05.03.2014 11:32

не совсем понял(

к примеру, клонируется форма:

<form id="id1">
    <select name="name1">
        <option value="1">вариант 1</option>
        <option value="2">вариант 2</option>
        <option value="3">вариант 3</option>
    </select>
</form>


клонируется всё, это понятно. я знаю теперь, как задать другой айдишник клону формы. но возник вопрос: как достучаться, к примеру, до селекта и изменить нейм, или даже до опшина?

надеюсь, правильно объяснил

danik.js 05.03.2014 11:37

И на кой хер тогда делать клон если в итоге ты все переиначиваешь?
Просто создай форму, в ней селект и нафигачь опшнов.

рони 05.03.2014 11:43

Sivik,
:blink:
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<form id="id1">
    <select name="name1">
        <option value="1">вариант 1</option>
        <option value="2">вариант 2</option>
        <option value="3">вариант 3</option>
    </select>
</form>
<script>
   var clone = document.getElementById('id1').cloneNode(true),
   options= clone.getElementsByTagName('select')[0].options;
   options[0].text = "НЕ вариант";
   document.body.appendChild(clone)
</script>
</body>

</html>

Sivik 05.03.2014 11:45

danik.js, нет, не всё) дело в том, что атрибутов может быть намного больше, которые надо клонировать. а, например, name нужен другой.

к примеру для отправки данных по php. если у старого селекта и его клона будет одинаковый нейм, а человек выберет разные опшны, то очевидно, что опшн второго селекта будет игнорирован. отправится лишь значение опшна первого селекта.

Aetae 05.03.2014 11:49

var clone = form.cloneNode(true);
clone.firstElementChild.name = 'new-name';
//или
clone.getElementsByTagName('select')[0].name = 'new-name';
//и т.д.

danik.js 05.03.2014 11:52

Цитата:

Сообщение от Sivik
отправится лишь значение опшна первого селекта

Дык они же в разных формах - как ты их отправишь одновременно?
А если в одной, то почему бы не назвать name="name[]", и на сервак (по крайней мере в PHP и вроде бы в ASP) придет массив значений?

Sivik 05.03.2014 11:56

рони, Aetae,

да да) именно так)

Sivik 05.03.2014 11:58

Цитата:

Сообщение от danik.js (Сообщение 301175)
Дык они же в разных формах - как ты их отправишь одновременно?
А если в одной, то почему бы не назвать name="name[]", и на сервак (по крайней мере в PHP и вроде бы в ASP) придет массив значений?

до этого я, к сожалению, ещё не дошёл(

фактически, JS начал разбирать чуть больше месяца назад. до этого лишь знал операторы if, else. и всё.

danik.js 05.03.2014 12:25

Цитата:

Сообщение от Sivik
фактически, JS начал разбирать

А причем тут JS? Я про PHP говорю. На сервере че у тя?

Sivik 05.03.2014 12:36

Цитата:

Сообщение от danik.js (Сообщение 301183)
А причем тут JS? Я про PHP говорю. На сервере че у тя?


да я вообще чайник)) из php собирал только отправку формы на почтовый адрес. ну и внешний вид окна результата. типа "письмо отправлено".

так что я нулейший нуль и вопроса даже не понял))

хочу сначала довести знания в js до приемлемого уровня, а потом за php браться. а то чтоб не было каши в голове от всего сразу :)

danik.js 05.03.2014 12:46

Да блин. Просто вместо:
$name1 = $_POST['name1'];
$name2 = $_POST['name2'];

напиши:
list($name1, $name2) = $_POST['name'];

А в html вместо name="name1" name="name2" просто пиши name="name[]"

Sivik 05.03.2014 12:52

Цитата:

Сообщение от danik.js (Сообщение 301190)
Да блин. Просто вместо:
$name1 = $_POST['name1'];
$name2 = $_POST['name2'];

напиши:
list($name1, $name2) = $_POST['name'];

А в html вместо name="name1" name="name2" просто пиши name="name[]"


оу, спасибо) сейчас же опробую)

Sivik 06.03.2014 10:33

что-то никак не догоню.

вот пример кода:

<?php

$result = mail (
	"adress@email.ru", "Заголовок письма", 
	"Имя: $_POST[name] \n
	Фамилия: $_POST[lastName] \n
	Пол: \n $_POST[gender], $_POST[age] лет \n
	E-mail: $_POST[email]"
);

if ($result) {
	echo '<h3 align="center">Успешно.</h3>';
}
else {
	echo "<p>Ошибка.</p>";
}

?>


клонируется строка
Пол: \n $_POST[gender], $_POST[age] лет \n


не пойму, как туда прописать list с переменными. пробовал уже весь list со всем содержимым заключить в одну переменную, а её прописать в тело письма, но безуспешно.

danik.js 06.03.2014 11:40

Дык и я не пойму. У тя че - можно указать два-три (и более) возраста? Ведь $_POST['gender'] будет массивом.

Sivik 06.03.2014 12:43

danik.js,

да, селектов может быть несколько. число зависит от числа созданных клонов.

вот как выглядит в html:

<form action="form.php" method="post" id="form">
    <input name="name" type="text" required>
    <input name="lastName" type="text" required>

    <a href="javascript:cloneBlockPlus()"> + </a> <!-- кнопка клонирования блока с id="plus" -->

    <div id="plus">
        <select name="gender" required>
            <option selected >Пол:</option>
            <option value="муж.">Муж.</option>
            <option value="жен.">Жен.</option>
        </select>
        <input name="age" type="text" required>
    </div>

    <input name="email" type="text" required>
    <input name="button" type="submit" value="Отправить">
</form>

danik.js 06.03.2014 13:51

А где квадратные скобочки на конец? Должно быть name="gender[]" .
В PHP тебе нужно использовать функцию implode($_POST['gender'], ',') - чтоб соединить "полы" в строку через запятую. Не помню как использовать строковую интерполяцию в таких случаях. Так что лучше вынеси в переменную:
$genders = implode($_POST['gender'], ',');

mail(... "Пол: $genders ...");

Для уверенности сделай
echo '<pre>';
print_r($_POST);

Это выведет в читаемом виде содержимое POST'а.

Sivik 06.03.2014 13:54

danik.js,

спасибо огромное! в который раз подсказываешь)


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