Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Изменение HEAD перед загрузкой BODY (https://javascript.ru/forum/xhtml-html-css/6166-izmenenie-head-pered-zagruzkojj-body.html)

B~Vladi 15.11.2009 19:27

Цитата:

Сообщение от Temchik
document.getElementsByTagName("head")[0]

document.getElementsByTagName("head")[0] не вернёт HEAD, т.к. document указывает на body (вроде как) и ищет там тег с именем head и не находит. Я же приводил пример, как можно получить HEAD:
document.documentElement.getElementsByTagName('HEAD')[0].

Дальше.
Вместо setAttribute используй свойства узлов:
link.href - путь,
link.rel - тип.

Советую почитать документацию DOM.

B~Vladi 15.11.2009 19:36

На будущее:
свойство документа (document) documentElement указывает на корень этого документа - html. В нём и надо искать head, а в нём уже и ссылки на стили. Ещё могут быть линки и в body. Там их можно найти в document.body.

Octane 15.11.2009 19:47

Цитата:

Сообщение от B~Vladi
document.getElementsByTagName("head")[0] не вернёт HEAD, т.к. document указывает на body (вроде как) и ищет там тег с именем head и не находит.

Чо? Никуда он не указывает, document.getElementsByTagName("head") найдет <head>.


Temchik, вы break с return не перепутали?

Riim 15.11.2009 19:55

document круче чем html, html в нем находится. Раньше я этого не знал и вот эта функция:
parent: function(self, nodeName) {
	if (self) {
		if (nodeName) {
			nodeName = nodeName.toLowerCase();
			while ((self = self.parentNode) && self.nodeName.toLowerCase() != nodeName);
			return $(self);
		}
		return $(self.parentNode);
	}
}


только написанная через tagName, а не через nodeName, в определенных ситуациях вызывала ошибку.

B~Vladi 15.11.2009 20:01

Riim, я из твоей функции ничего не понял, можно на чистом JS?!
Octane, document - это документ и он не обязан указывать на своих детей. Есть свойство документа: documentElement - корень документа, от которого и нужно отталкиваться в поиске.

Octane 15.11.2009 20:04

B~Vladi, для чего тогда у document есть getElementsByTagName и другие методы для поиска элементов?

B~Vladi 15.11.2009 20:09

Цитата:

Сообщение от Octane
B~Vladi, для чего тогда у document есть getElementsByTagName и другие методы для поиска элементов?

Octane, у document кроме как getElementsByName больше ничего нет, что касается поиска элементов. Реализация сама решит какие свойства иметь, для всего остального есть documentElement.

PS: document это не <HTML>...

Octane 15.11.2009 20:24

Ага. Ну чтобы не фантазировать, что кому должен, и какая реализация, что решает, полезли в W3C читать доки:
Цитата:

Сообщение от W3C
The Document interface represents the entire HTML or XML document. Conceptually, it is the root of the document tree, and provides the primary access to the document's data. Interface Document

Здесь сказано, что document является root-элементом дерева. Смотрим там же дальше интерфейс:
Цитата:

Сообщение от W3C
interface Document : Node {
…
  NodeList           getElementsByTagName(in DOMString tagname);
…
};

О_о getElementsByTagName есть у document по стандарту, листаем дальше:
Цитата:

Сообщение от W3C
getElementsByTagName
Returns a NodeList of all the Elements with a given tag name in the order in which they are encountered in a preorder traversal of the Document tree.

Говорится про Document tree, ничего про отдельную ветку с <body> не сказано.

Так почему надо искать <head> с помощью document.documentElement.getElementsByTagName("hea d"), а не document.getElementsByTagName("head")?

Riim 15.11.2009 20:24

Цитата:

Сообщение от B~Vladi
Riim, я из твоей функции ничего не понял, можно на чистом JS?!

так $ убрать и будет на чистом js. Я просто помню ты давно показывал свою такую же функцию (там еще с рекурсией), и у тебя там тоже через tagName было, вот я и показываю, что бы ты у себя проверил, а то вдруг тоже ошибка. Ошибка в том, что если из родительских тегов никто не подходит, то цикл доходит до document у которого tagName == null, ну и toLowerCase к null вызовет ошибку.

Octane 15.11.2009 20:30

И еще вот:
alert(document.childNodes[0].nodeName)


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