Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Удаление атрибута в IE - в чем засада? (https://javascript.ru/forum/events/5426-udalenie-atributa-v-ie-v-chem-zasada.html)

гвоздик 14.10.2009 00:39

Удаление атрибута в IE - в чем засада?
 
Почему в IE не работает код нижеприведённый?
В FF и Опере работает.
Если поставить removeAttribute вместо delete - сработает, но мне хочется понять сам принцип.
Библиотека кроссбраузерного events.js у меня на IE 6 некорректно снимает события из-за этого - там тоже удаление в remove через delete.

<html>
<head>
</head>
<body>
	<h1 id="TestStop">Link</h1>

<script type="text/javascript"> 

	var el = document.getElementById('TestStop')

	el.newF = 1

	alert('1 - ' + el.newF)
	
	delete el.newF
//	el.removeAttribute('newF')

	alert('2 - ' + el.newF)
	
	</script>

</body>
</html>

Octane 14.10.2009 00:54

Атрибуты элементов и свойства объектов — разные вещи.


p.s. что с xpoint? такая полезная ссылка не доступна (((

гвоздик 14.10.2009 08:50

я устанавливаю в коде не атрибут
 
[quote=Octane;32377]Атрибуты элементов и свойства объектов — разные вещи.

Но ведь я устанавливаю в коде не атрибут, а именно свойство:
el.newF = 1

Атрибут я не устанавливаю! Да, синхронизацией браузера оно создаётся, но почему же IE не дает это установленное свойство удалить через delete ?

Как мне снести его? Именно свойство?

Kolyaj 14.10.2009 09:17

el.newF = undefined;

гвоздик 14.10.2009 09:59

а в синглтоне Event ?
 
Спасибо.
А в библиотечке http://javascript.ru/tutorial/events/crossbrowser - тут в ф-ии remove свойства элемента улаляются именно через delete.
.......
	  for (var any in elem.events) return
	  delete elem.handle
	  delete elem.events
    } 
......


Это разве корректно?
Собственно,у меня именно здесь и начал ругаться IE - что вывело на эту ошибку.

Т.е. давайте устаканим - всё же как наиболее кроссбраузерно удалить свойство? Я тестирую сайт свой под IE 6 и потому для меня этот вопрос важен.

Octane 14.10.2009 12:27

Хм… пробовал в IE8, там это видимо исправили, не понял сначала вопроса, в IE6 действительно ошибка.
Цитата:

Сообщение от Kolyaj
el.newF = undefined;

Это не спасает от:
document.body.x = 1;
document.body.x = undefined;
alert("x" in document.body); // true

Так как в IE упрощены атрибуты и свойства DOM-элементов, то наверное так и придется через removeAttribute делать:
document.body.x = 1;
document.body.removeAttribute("x");
alert("x" in document.body); // false в IE

хотя там с регистром еще заморочки…

Kolyaj 14.10.2009 12:36

Цитата:

Сообщение от Octane
Это не спасает от:

Смотря какие цели удаления.

гвоздик 14.10.2009 12:57

всё то же удаление
 
Re: Смотря какие цели удаления.

Цель - удалить-освободить "навешенные" на элемент свойства. Максимально возможно без утечек. В приведенной библиотеке events.js из-за этой ошибки в IE6 не выполняются у меня бизнес-логика.

В принципе, присваивание свойству undefined - освободит связанные свойством ресурсы, а оставшееся свойство... ну пусть и висит - оно не мешает, это как бы пустая ссылка уже. Да, оно находится в списке свойств, но привязано к элементу, и утечки с ним уже не возможны - время жизни свойства определит сам элемент.
Для events.js этот путь мне кажется достаточным.

Для объектов или массивов delete в IE6 работает нормально.

document.body.x = 1;
document.body.removeAttribute("x");
alert("x" in document.body); // false в IE


но этот же код true в FF !

гвоздик 14.10.2009 13:23

В библиотеке проверка существования св-ва делается через
document.body.x = undefined;
if(!document.body.x) alert('Свойства нет');

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


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