Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как можно удалить динамически созданный элемент (https://javascript.ru/forum/dom-window/10430-kak-mozhno-udalit-dinamicheski-sozdannyjj-ehlement.html)

Арсений 04.07.2010 17:26

Как можно удалить динамически созданный элемент
 
я создаю элемент вот таким способом
document.getElementById( 'img' ).onclick = function (e) {
e = e || window.event
var div = document.createElement( "div" );
div.id = "el";
div.setAttribute("style","position:absolute; width:4px; height:4px; background-color:blue; top:"+e.pageY+"px; left:"+e.pageX+"px;");
div.setAttribute("onmouseup", "release()");
div.setAttribute("onmousedown", "capture(event)");
div.setAttribute("oncontextmenu", "return menu(1, event);");
document.body.appendChild( div );
}

А затем если нажать правой кнопкой по нему мы попадем в меню.
Вот отрывок кода этого меню
var menu = document.getElementById("contextMenuId");
    var html = "";
    switch (type) {
        case (1) :
            html = "Меню";
            html += "<br />Название";
            html += "<br />Описание";
            html += "<br /><a onclick='el_delete()' href='#'>Удалить</a>";
			html += "<br /><a onclick='menuclose()' href='#'>Закрыть</a>";
        break;


Но скажем если я создал где-то 10-20 таких элементов и нажму на любом из них то каким образом мне можно его удалить?
Подскажите хотя бы теорией, а то я даже не представляю себе это.

Арсений 05.07.2010 14:06

ммм ни кто не знает или всем лень подсказать?:)

haha 05.07.2010 19:43

Ссылку на создаваемый див сохранять отдельно в глобальном скопище, а потом спокойно удалять div.parentNode.removeChild(div). как-то так.
И вообще, можно не создавать каждый раз новое меню, достаточно одну менюшку скрыть и показать, когда нужно. Ну и функции будут слегка другими.

PeaceCoder 05.07.2010 20:50

Цитата:

Сообщение от haha
И вообще, можно не создавать каждый раз новое меню,

а потом все пользователи удивляются. почему сайт то так тормозит? а в нем же куча элементов скрыто.
А если скрытый элемент не подходит ? если надо динамически править структуру ? вы ее будете кодом править?

haha 06.07.2010 07:20

Кто пишет тормозное меню, тому и создание/удаление не поможет.

pandasensey 06.07.2010 10:59

var root = document.createElement("DIV"), //Тут мы создаем корневой элемент
node = document.createElement("DIV"); //А тут создаем чайлда

root.appendChild(node);
document.body.appendChild(root);

В итоге у нас получается два новых, созданных динамически, элемента, ссылки на которых мы записали в соответствующие переменные. Далее мы можем сделать так:

root.removeChild(node);

или
root.removeChild(root.lastNode);


Для того, чтобы работало в твоем случае - достаточно хранить все ссылки в массиве или объекте - как удобнее. Но согласен с общим мнением по поводу неверного подхода.

Такой подход очень плохо работает с элементами типа IMG, так как далеко не всегда при удалении их из DOM-структуры, они удаляются из очереди загрузки броузера и у них по прежнему могут выскакивать события onload и т.д.

Арсений 06.07.2010 11:39

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

haha 06.07.2010 12:37

Арсений,
Области видимости переменных в функциях. Как-то так надо искать. Скрещивать с DOM надо правильно, и все получится.


function (e) {
e = e || window.event;
var div = document.createElement( "div" );
div.id = "el";
div.setAttribute("style","position:absolute; width:4px; height:4px; background-color:blue; top:"+e.pageY+"px; left:"+e.pageX+"px;");
div.setAttribute("onmouseup", "release()");
div.setAttribute("onmousedown", "capture(event)");
div.setAttribute("oncontextmenu", "return menu(1, event);");
document.body.appendChild( div );
}

в этой функции нужно вынести переменную div наружу, тогда созданный элемент станет легко досягаем.

pandasensey 06.07.2010 13:11

Цитата:

как сохранить ссылку на создаваемый элемент
Я же написал:
var root = document.createElement("DIV")

После выполнения этой команды в переменную root будут записана ссылка на созданный элемент. И после добавления этого элемента к чему-дибо (appendChild) ссылка остается. Ты можешь создавать это и в цикле и присваивать элементам массива ссылки на новые элементы:
var root = document.createElement('DIV'),
temp = document.createDocumentFragment(); //Это важно, потому что в цикле добавлять элементы к чему-то существующему на странице - неэтично)
var links = [];
for (var i = 0; i < 10; i++) {
  links[i] = document.createElement('DIV');
  temp.appendChild(links[i]);
}
//В этом цикле мы создали 10 DIV'ов во временном контейнере и записали ссылки на них в массив links
root.appendChild(temp);
document.body.appendChild(root);

Арсений 06.07.2010 16:05

pandasensey
Я вас понял но выходит что тут создается сразу 10ть диваков а мне нужно что бы диваки создавались по одному.
Вот смотрите:
шаг1 - Я нажимаю левую кнопку мыши на картинке создается дивак1
шаг2 - Я нажимаю левую кнопку мыши на картинке создается дивак2
...
шаг10 - Я нажимаю левую кнопку мыши на картинке создается дивак10
шаг11 - Я нажимаю левую\правую кнопку мыши на дивак5 появляется меню для удаления дивака

Kolyaj 06.07.2010 16:07

Цитата:

Сообщение от Арсений
диваков

Хватит уже этого детского жаргона, глаза режет.

Арсений 06.07.2010 16:12

короче решил проблему добавление и удалением нового className всем спасибо за помощь:)

pandasensey 06.07.2010 18:09

Цитата:

но выходит что тут создается сразу 10ть диваков а мне нужно что бы диваки создавались по одному
Про цикл - это был пример использования. В вашем случае:
<img src="myImg.jpg" id="clickImage"/>

Это ваша картинка, на которую вы будете кликать (не принуждаю, конечно.
var img = document.getElementById('clickImage');
//Имеем ссылку на картинку
img.onсlick = theCreator;//Назначаем обработчик нажатия
function theCreator() {
  var newDiv = document.createElement('DIV');
  newDiv.onclick = function() {document.body.removeChild(newDiv);} //Тут мы создаем замыкание, поэтому переменная newDiv будет хранить ссылку на новый элемент
  document.body.appendChild(newDiv);
}

В этом примере при нажатии на изображение будут создаваться div'ы а при нажатие на div - он будет удаляться

pandasensey 06.07.2010 23:10

Цитата:

Хватит уже этого детского жаргона, глаза режет
Kolyaj, зачем же так. Лучше на вопросы отвечать, а не обвинять в эстетическом нарушении гармонии вашего сознания (хотя я тоже с этим согласен, слух режет =)).

Алкоголь, алкоголь, алкоголь...

Kolyaj 07.07.2010 08:26

Цитата:

Сообщение от pandasensey
Лучше на вопросы отвечать

Если хотите, чтобы вам нормально ответили на вопрос, задайте его нормально.

pandasensey 07.07.2010 09:59

Если что, то обвинение не мне должно быть адресовано.
В рунете просто достаточно "злые" форумы.

Kolyaj 07.07.2010 10:06

Да я и не вам его адресую, я вам отвечаю просто.

Арсений 08.07.2010 12:47

Kolyaj
как по мне на оборот приятней звучит:)я ведь всего лишь слово див просклонял по падежам:)
но если вы настолько суровы, что помогаете только тем кто пишет название всех элементов только на английском я это учту:)

Kolyaj 08.07.2010 12:56

Цитата:

Сообщение от Арсений
я ведь всего лишь слово див просклонял по падежам

див - дива - диву, а не дивак - дивака - диваку. Странное у вас понятие о падежах.

Я помогаю тем, кто понятно излагает суть проблемы. Если в сообщении куча грамматических ошибок, которые затрудняют чтение (а не все затрудняют чтение), если выложен код, не влезающий в экран, то я даже не трачу время на чтение такого сообщения. Я за это время лучше помогу нескольким другим, которые умеют грамотно писать, и не поленились локализовать проблему. Но это не про ваш случай. В вашем случае в самом первом сообщении какой-то бред написан, а дальше отслеживать нить обсуждения опять же трата времени.


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