Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50

Создание элементов DOM js

03.08.2016, 12:31. Показов 3349. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть вот такой php и скрипт в нем:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$dblocation = "localhost"; 
$dbname = "wpdevice";
$dbuser = "root";         
$dbpasswd = "";          
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) 
{
  echo("<P>В настоящий момент сервер базы данных не доступен, поэтому 
           корректное отображение страницы невозможно.</P>");
  exit();
}
    mysql_select_db("wpdevice",$dbcnx);
    $strSQL = "SELECT * FROM `wp_config`";
$rs = mysql_query($strSQL);
while($row = mysql_fetch_array($rs)) {
$id = $row['ID'];
$class = $row['Class'];
$top = $row['Top'];
$left = $row['Left'];
 ?>
 
<script type="text/javascript">
      [JS]var idd = '<?php echo $id; ?>';
    var clas = '<?php echo $class ?>';
    var Top = '<?php echo $top ?>';
    var left = '<?php echo $left ?>'; 
    alert(clas);
    var postq = document.getElementById("all1");
    var div = postq.createElement('div');
    div.id = idd;
    div.className = clas+'1';
    div.style.Top = Top+'px';
    div.style.Left = left+'px';
    postq.appendChild(div);[/JS]
    </script>    
 
<?php
mysql_close();
}
    ?>
И есть вот такая ошибка: Uncaught TypeError: Cannot read property 'createElement' of null (на строку var div = postq.createElement('div'). Если писать document.createElement('div'); и document.appendChild(div);, то все работает, но элемент создается после футера на белом фоне. Подскажите, как это исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2016, 12:31
Ответы с готовыми решениями:

Динамическое создание элементов DOM
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt; &lt;html...

Создание событий на ячейку таблицы через DOM
var tr = document.createElement('tr'); var td = document.createElement('td'); var text = document.createTextNode('Удалить данного...

HTML DOM как с использованием Javascript создать узлы DOM
Доброго времени суток. хочу через Javascript по событию onclick добавить в html документ что то вроде: &lt;div&gt;hello world&lt;/div&gt;...

19
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.08.2016, 13:04
Цитата Сообщение от Каспер Кроне Посмотреть сообщение
Если писать document.createElement('div'); и document.appendChild(div);, то все работает
кого обманываете -- нас или самого себя?
это не может "работать"
потому что метод appendChild () нельзя применить к объекту document -- он применим только к html-элементам

если нужно поместить создаваемый контейнер перед каким-то html-элементом (например, перед вашим "футером"), то вместо appendChild () используйте insertBefore ()
0
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
03.08.2016, 13:20  [ТС]
kalabuni, прошу прощения, document.body.appendChild(div).
Через insertBefore() тоже не работает:
JavaScript
1
2
3
4
5
6
7
8
   var postq = document.getElementById("all1");
 var parentDiv = postq.parentNode; //здесь та же ошибка
    var div = document.createElement('div');
    div.id = idd;
    div.className = clas+'1';
    div.style.Top = Top+'px';
    div.style.Left = left+'px';
    parentDiv.insertBefore(div,postq);
Работает только вот так:
JavaScript
1
2
3
4
5
6
7
8
var postq = document.getElementById("all1");
    var parentDiv = document.parentNode;
    var div = document.createElement('div');
    div.id = idd;
    div.className = clas+'1';
    div.style.Top = Top+'px';
    div.style.Left = left+'px';
    document.body.insertBefore(div,postq);
но параметры Top и Left не передаются.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.08.2016, 14:04
Цитата Сообщение от Каспер Кроне Посмотреть сообщение
Top и Left не передаются.
потому что правильно они называются top и left ( все буквы в нижнем регистре)
JavaScript
1
2
div.style.top = ...;
    div.style.left = ...;

кроме того, чтобы left и top сработали, необходимо создаваемому контейнеру задать позиционирование, отличное от дефолтного static (а именно -- или relative, или absolute, или fixed), вот так:
JavaScript
1
div.style.position = 'relative';
1
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
03.08.2016, 16:20
insertAdjacentHTML() разбирает указанный текст как HTML или XML и вставляет полученные узлы (nodes) в DOM дерево в указанную позицию.
Данная функция не переписывает имеющиеся элементы, работает быстрее, чем манипуляции с innerHTML.
HTML5
1
2
3
4
5
<div id="test">
  <p>
    You Text
  </p>
</div>
JavaScript
1
2
3
4
test.insertAdjacentHTML('beforebegin', '<div>Перед test</div>');
test.insertAdjacentHTML('afterbegin', '<div style="position: relative; top: 20px; left: 100px">Внутри test, перед первым дочерним элементом</div>');
test.insertAdjacentHTML('beforeend', '<div>Внутри test, после последнего дочернего элемента</div>');
test.insertAdjacentHTML('afterend', '<div>После test</div>');
Песочница
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.08.2016, 17:44
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
работает быстрее, чем манипуляции с innerHTML.
обосновать можете?
не в первый раз встречаю подобные утверждения (что какой-то из способов работает быстрее других), но всякий раз -- без какого-либо доказательства
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
03.08.2016, 18:15
Цитата Сообщение от kalabuni Посмотреть сообщение
обосновать можете?
Документация
Пример песочницы
комментируйте последнюю строку
быстрее происходит из за того что Dom не обновляется полностью, обработчики событий сохраняются
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
03.08.2016, 18:41
Fedor Vlasenko, Джон Резиг (который сотворил Jquery) как-то уже давно написал про то, что innerHTML обрабатывается много быстрее, чем любой из Dom-методов
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
03.08.2016, 19:31
Цитата Сообщение от kalabuni Посмотреть сообщение
что innerHTML обрабатывается много быстрее
там нет ни слова о innerHTML
статья вообще о document.createDocumentFragment()
0
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 10:46  [ТС]
Fedor Vlasenko, спасибо большое, так замечательно работает, но пока что не понимаю, как мне сделать так, чтобы в значении id было значение переменной:
JavaScript
1
2
3
4
5
6
var idd = '<?php echo $id; ?>';
    var clas = '<?php echo $class ?>';
    var Top = '<?php echo $top ?>';
    var left = '<?php echo $left ?>'; 
    var postq = document.getElementById("art-main");
    postq.insertAdjacentHTML('afterbegin','<div id="idd"></div>');
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
04.08.2016, 11:13
JavaScript
1
var html = '<div id="'+perm+'"></div>'; // где perm - переменная
1
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 11:23  [ТС]
С добавлением переменной разобралась, но теперь в другом проблема(которая и раньше была). Добавить новый элемент надо не в art-main, а в article id="post-11"
HTML5
1
2
3
4
5
6
7
<div id="art-main">
      <div class="art-sheet clearfix">
            <div class="art-layout-wrapper">
                <div class="art-content-layout">
                    <div class="art-content-layout-row">
                        <div class="art-layout-cell art-content">
                              <article id="post-11" class="art-post art-article  post-11 page type-page status-publish hentry" style="">
Добавлено через 8 минут
Fedor Vlasenko, пробовала так, но ошибка.
JavaScript
1
2
var postq = document.getElementById("post-11");
    postq.insertAdjacentHTML('beforebegin',ne);
(index):140 Uncaught TypeError: Cannot read property 'insertAdjacentHTML' of null
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
04.08.2016, 11:32
Цитата Сообщение от Каспер Кроне Посмотреть сообщение
Cannot read property
говорит о том, что postq === null
JavaScript
1
var postq = document.getElementById("post-11");
такое поведение может быть когда вы обращаетесь к незагруженному элементу html с ид post-11
элемент еще не загрузился, данные вставляются позже динамически ( к примеру аякс)
действия вы должны производить после того как ваш элемент будет вставлен в Dom
(window.onload, DOMContentLoaded calback в аякс)
0
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 11:46  [ТС]
Fedor Vlasenko, извините, что туплю, но не так давно начала в этом хоть немного разбираться.
Если сделать так, то работает, но вместо пяти элементов, которые вставлялись в art-main вставляется один, тот, который последний на очереди.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
      window.onload = function() {
      var idd = '<?php echo $id; ?>';
    var clas = '<?php echo $class ?>';
    var Top = '<?php echo $top ?>';
    var left = '<?php echo $left ?>'; 
    var ne = '<div id="'+idd+'" class="'+clas+'" top="'+Top+'" left='+left+'"></div>';
    var postq = document.getElementById("post-11");
    postq.insertAdjacentHTML('beforebegin',ne);
      }
    </script>
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
04.08.2016, 11:56
не совсем понял о каких 5 элементах идет речь
стили так как вы написали не задаются
HTML5
1
<div style="top:0;left: 20px"></div>
1
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 12:07  [ТС]
Fedor Vlasenko, Когда я отрываю страницу, к ней подгружается файл php, который есть выше. Он берет определенные значения из базы данных, и передает их в скрипт, который, в свою очередь, создает элементы с полученными параметрами и вставляет их на страницу. Все это происходит в цикле while. В базе есть пять наборов значений для пяти элементов. Так вот теперь на странице появляется только последний элемент. Я понимаю, что это связано с циклом, но как исправить - пока что не знаю.
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
04.08.2016, 12:24
Цитата Сообщение от Каспер Кроне Посмотреть сообщение
Все это происходит в цикле while
не зачем в цикле вывод делать
вы можете делать в цикле конкатенацию контента и после цикла вывести все за один раз
PHP
1
2
3
4
5
$html = '';
while(true){
    $html .= 'New txt';
}
echo $html;
если генерировать с js нужно повторяющиеся(сходные строки) то можно прилепить и микрошаблонизатор
к примеру
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//author [email]VlasenkoFedor@mail.ru[/email]
String.prototype.render = function(obj) {
  return this.replace(/\{([\w\.]*)\}/g, function(str, key) {
    var value, i, keys = key.split(".");
    while (i = keys.shift()) {
      if (value = obj[i]) {
        if (typeof value === "object")
          obj = value;
        else
          break;
      }
    }
    return typeof value !== "undefined" && value !== null ? value : '';
  });
};
 
var html = '<div id="{div_id}"><span>{text}</span></div>',
  data = {
    div_id: 'idtest',
    text: 'Custom text'
  };
newdata = {
  div_id: 'newtest',
  text: 'New text'
}
document.body.insertAdjacentHTML('afterbegin', html.render(data));
document.body.insertAdjacentHTML('beforeend', html.render(newdata));
Как это работает гляньте в песочнице
0
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 12:25  [ТС]
Fedor Vlasenko, может так и лучше, но в данный момент это несколько дольше и сложнее. Получилось решить проблему вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php get_header(); ?>
 
            <?php get_sidebar('top'); ?>
            <?php
            
            if (have_posts()) {
                /* Start the Loop */
                while (have_posts()) {
                    the_post();
                    get_template_part('content', 'page');
                }
            } else {
                theme_404_content();
            }
    if (is_page('11')) { //вот это раньше было перед if (have_posts())
             include('otvet.php'); 
            };
            ?>
            <?php get_sidebar('bottom'); ?>
<?php get_footer(); ?>
Но теперь не срабатывают заданные мной стили. Точнее, в style все прописывается, но расположены они все на одном месте.
0
04.08.2016, 12:40

Не по теме:

WordPress - страшное существо
уж лучше Joomla - там хоть научится можно и програмированию и подчеркнуть основы

0
 Аватар для Каспер Кроне
12 / 5 / 5
Регистрация: 15.01.2016
Сообщений: 50
04.08.2016, 13:48  [ТС]
Style совсем из головы вылетел, теперь все работает и все как надо. Всем спасибо!
Fedor Vlasenko, спасибо за совет, знаю, скоро и ее освою.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2016, 13:48
Помогаю со студенческими работами здесь

Создание DOM
Есть идея: Добавить на страницу кнопочку, написать для нее код, который бы добавлял на страницу другие элементы. Все хорошо:...

Создание вложенных DOM элементов
Здравствуйте! Нужно вывести на экран список контактов, их несколько десятков. Блок, в котором они будут выводиться, уже задан в html, все...

Написать скрипт, рекурсивно обходящий дерево DOM страницы dom.html, начиная от корня DOM
Написать скрипт на языке JavaScript, рекурсивно обходящий дерево DOM страницы dom.html, начиная от корня DOM (объект document). ...

Создание тегов в Dom дереве
Находясь где то в одном из дочерних узлов дом дерева хочу создать свой тег со значением. Оказывается, что теги надо создавать сначала в...

Фильтр dom элементов
Добрый день, есть такой вопрос, как отфильтровать элемент dom на JavaScript? Например: думал проще прибегнуть к Jquery $(...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru