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)

Temchik 15.11.2009 16:03

Изменение HEAD перед загрузкой BODY
 
У меня есть js файл который я подключаю к опере.
Eсть страница с некоторым <head>.....</head>

Мне нужно чтобы скрипт стер все ссылки на css и написал свою, после уже загружался body с тем css который написал js файл...

Тоесть убирать на сайте все его css и применять мой css

Temchik 15.11.2009 16:04

Я пробывал так, но ничегон е получилось

document.head.onload = function () {vcsss()} 
function vcsss() {
document.head="<link rel='stylesheet' href='http://........./vk1.css' type='text/css' />"
}

B~Vladi 15.11.2009 16:50

Цитата:

Сообщение от Temchik
document.head.onload

Это откуда взялось?
Идея ваша бредовая...
Можно удалить все link и пристегнуть свой, но это будет происходить в процессе загрузки body, поэтому при медленном нете у тебя будут частые перерисовки страницы и это будет напрягать...

Temchik 15.11.2009 16:53

Цитата:

Сообщение от B~Vladi (Сообщение 35353)
Это откуда взялось?
Можно удалить все link и пристегнуть свой

Можно код? Я в js не столь силен. Спасибо.

B~Vladi 15.11.2009 16:57

Код чего?! Удаления линков или добавления своего?!

Temchik 15.11.2009 16:58

Удаления линков и наверное дописывание своего (Надо как я понял через innerHTML) но как дописать в head??

B~Vladi 15.11.2009 17:11

document.documentElement.getElementsByTagName('LINK')

так можно получить все линки на css и удалить их (removeChild).
document.documentElement.getElementsByTagName('HEAD')[0]

так можно получить head.
В этот head вставляем (appendChild) свой link (document.createElement('link')).
Ещё вопросы?!

Temchik 15.11.2009 17:24

document.documentElement.getElementsByTagName('LINK').removeChild

document.documentElement.getElementsByTagName('HEAD')[0].document.createElement('link')


Если честно я суть то понял, но как это сделать я не понял... И еще 1 link создам а как в ему указать путь к новому css??

Temchik 15.11.2009 17:34

var head = document.getElementsByTagName("head")[0];

       // удаление старой иконки
       var links = head.getElementsByTagName("link");
       for (var i = 0; i < links.length; i++) {
               var lnk = links[i];
               if (lnk.rel=="stylesheet") {
                       head.removeChild(lnk);
                       return;
               }
       }

       // создание и добавление новой иконки
       var link = document.createElement("link");
       link.setAttribute("href","");
       link.setAttribute("rel","stylesheet");
       head.appendChild(link);


Я тут немного поискал, нашел пример со сменой иконки, немного переписал, поменял все ненужное на свое нужное, вот что получилось...

Temchik 15.11.2009 17:45

document.body.onload = function() {mlia()};
fumction mlia() {
var head = document.getElementsByTagName("head")[0];
 

       var links = head.getElementsByTagName("link");
       for (var i = 0; i < links.length; i++) {
               var lnk = links[i];
               if (lnk.rel=="stylesheet") {
                       head.removeChild(lnk);
                       return;
               }
       }
 

       var link = document.createElement("link");
       link.setAttribute("href","http://........./vk1.css");
       link.setAttribute("rel","stylesheet");
       head.appendChild(link);
}


Короче вот код, но не работает... =(( В чем может быть проблема??

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)

B~Vladi 15.11.2009 20:32

Riim, аха, разобрался.
Octane, это документ, так?!
document.documentElement - корень документа, так?!
ele.getElementsByTagName - ищет узлы с указанным именем в контексте элемента. Так какого хера тут вмешан document?! Я не против того чтобы у документа был этот замечательный метод, но разве не надо искать в контексте DOM-узла? ИМХО у документа этот метод лишний...

B~Vladi 15.11.2009 20:33

Octane, повторяю - document != html.
Разницу чувствуешь?

B~Vladi 15.11.2009 20:36

Цитата:

Сообщение от Octane
Здесь сказано, что document является root-элементом дерева.

DOM-элементом? html?! root-элемент дерева это html...

Octane 15.11.2009 20:45

Цитата:

Сообщение от B~Vladi
Octane, повторяю - document != html.
Разницу чувствуешь?

Разве из моего сообщения #20 это не видно? <html> является дочерним по отношению к document.

Цитата:

Сообщение от B~Vladi
DOM-элементом?...

Опять же из сообщения #20 и описания интерфейса видно, что всё таки document — это еще и узел, у него есть дочерние узлы, и даже nodeName есть:
alert(document.nodeName);


В стандарте методы присутствуют, то что тебе это не нравится — твои личные предпочтения, я ничего нелогичного или неправильного в этом не вижу.

B~Vladi 15.11.2009 20:53

Цитата:

Сообщение от Octane
о что тебе это не нравится — твои личные предпочтения

Конечно.
Покопавшись - увидел, что document: nodeType==9, т.е. это нода... Что на счёт реализаций?! Всё хорошо?!

Octane 15.11.2009 21:01

Цитата:

Сообщение от B~Vladi
Что на счёт реализаций?! Всё хорошо?!

Вроде да :)

А tagName у него нет, скорее всего, потому что от HTMLElement ничего не наследует:
alert(Node.prototype.setAttribute);
alert(HTMLElement.prototype.setAttribute)

B~Vladi 15.11.2009 21:09

Несовсем ясно. Откуда взялось Node и HTMLElement?!

Насчёт html - у узлов нет прототипа (в некоторых реализациях).

Temchik 15.11.2009 21:18

Цитата:

Сообщение от Octane
вы break с return не перепутали?

Поменял, протестил... Но... Css применяеться, но очень коряво...

Тоесть я вижу весь процес... Грузиться страница, убираються все стили, страница ержиться... ПОтом применяеться мой стиль но прямо на сьерженую страницу, страница не выравниваеться... Как быть??

B~Vladi 15.11.2009 21:20

Я тебя предупреждал... Это корявый метод... Уверен, есть другие, правильные решения.
Может опишешь ситуацию более глобально?!

Temchik 15.11.2009 21:21

Млин... Может ктонить знает какие??

Octane 15.11.2009 21:21

Цитата:

Сообщение от B~Vladi
Несовсем ясно. Откуда взялось Node?!

А насчёт html - у узлов нет прототипа (в некоторых реализациях).

Node, Element (по стандарту Element, а не HTMLElement, в IE8, кстати, правильно назвали, хотя в новых браузерах есть все 3 конструктора, в IE8 только Element).
alert(Element.prototype.getElementsByTagName === HTMLElement.prototype.getElementsByTagName);

B~Vladi 15.11.2009 21:29

Temchik, может ты всё-таки скажешь, что тебе надо?!

B~Vladi 15.11.2009 21:30

Octane, с интерфейсами всё понятно... откуда у window они взялись?

Temchik 15.11.2009 21:33

Млять... Сохраните в файлик js этот код
document.body.onload = function() {mlia()};
fumction mlia() {
var head = document.getElementsByTagName("head")[0];
 
 
       var links = head.getElementsByTagName("link");
       for (var i = 0; i < links.length; i++) {
               var lnk = links[i];
               if (lnk.rel=="stylesheet") {
                       head.removeChild(lnk);
                       return;
               }
       }
 
 
       var link = document.createElement("link");
       link.setAttribute("href","http://tmoney.at.ua/vk1.css");
       link.setAttribute("rel","stylesheet");
       head.appendChild(link);


И подкючите файл к опере на сайте контакта.... И посматрите результат... Как такое исправить??

B~Vladi 15.11.2009 21:36

Цитата:

Сообщение от Temchik
И подкючите файл к опере на сайте контакта...

Аха, щас... Контакт думаешь просто так свои стили писал?! от делать нечего?! Может займёшься делами по-важнее?!
В пень иди... Не буду помогать...

Temchik 15.11.2009 21:38

Цитата:

Сообщение от B~Vladi
В пень иди... Не буду помогать...

Большое спасибо...

Octane 15.11.2009 21:40

Цитата:

Сообщение от B~Vladi
Octane, с интерфейсами всё понятно... откуда у window они взялись?

А причем здесь window? :)

B~Vladi 15.11.2009 21:42

Цитата:

Сообщение от Octane
document всего лишь одно из свойств window

Это понятно. Ты пишешь: alert(HTMLelement...). HTMLElement откуда взялся?! из window?!
Цитата:

Сообщение от Temchik
Большое спасибо...

Незачто.

Octane 15.11.2009 21:49

Цитата:

Сообщение от B~Vladi
HTMLelement откуда взялся?! из window?!

А куда еще глобальный конструктор поместить?

B~Vladi 15.11.2009 21:50

Цитата:

Сообщение от Octane
А куда еще глобальный конструктор поместить?

Ясно. Просто не в курсе был.


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