Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2014, 13:29   #1
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию Обработать веб страницу до открытия браузером.

Я через расширение браузера. Удаляю некоторые элементы дом документа.
Удаляются они после того как подгрузилась страница. То есть вижу сначала то, что за тем удаляется. Как сделать так ,чтобы уже была обработана страница, прежде чем я ее увижу..?
И такой вопрос. Некоторые скрипты не находит, неверный указан путь. Из-за этого браузер дольше грузит страницу. Как сделать так, чтобы это меньше времени занимало. То ест тоже удалить, перед тем как подгрузицтся страница.

Последний раз редактировалось Predator199; 16.03.2014 в 13:31.
Predator199 вне форума Ответить с цитированием
Старый 16.03.2014, 15:54   #2
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Во-первых надо запускать скрипт сразу после начала загрузки страницы. В Chromium'ах это делается путём присваивания значения "document_start" свойству content_scripts.run_at в манифесте (также можно сделать аналог при использовании chrome.tabs.executeScript из background).

Во-вторых, для сокращения времени мелькания надо ставить таймеры на попытку обращения к DOM. Если дерево ещё не построено, то повторить попытку через 50мс:
Код:
function run() {
    // code

    return;
}

function try_run() {
    if(document.body)
        run();
    else 
        setTimeout(try_run, 50);

    return;
}
Кстати, к document.head можно обратиться гораздо раньше, чем к document.body, поэтому можно сделать один крутой финт - вставить в head стиль
Цитата:
body { display: none !important; }
а после формирования document.body и изменения DOM отобразить body. Таким образом сначала недолго будет белая страница, а затем сразу появится то, что нужно. И никаких мельканий.
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 16.03.2014, 16:24   #3
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Цитата:
Сообщение от Fenex Посмотреть сообщение
Во-первых надо запускать скрипт сразу после начала загрузки страницы. В Chromium'ах это делается путём присваивания значения "document_start" свойству content_scripts.run_at в манифесте (также можно сделать аналог при использовании chrome.tabs.executeScript из background).

Во-вторых, для сокращения времени мелькания надо ставить таймеры на попытку обращения к DOM. Если дерево ещё не построено, то повторить попытку через 50мс:
Код:
function run() {
    // code

    return;
}

function try_run() {
    if(document.body)
        run();
    else 
        setTimeout(try_run, 50);

    return;
}
Кстати, к document.head можно обратиться гораздо раньше, чем к document.body, поэтому можно сделать один крутой финт - вставить в head стиль

а после формирования document.body и изменения DOM отобразить body. Таким образом сначала недолго будет белая страница, а затем сразу появится то, что нужно. И никаких мельканий.

Выставил document_start, разницы не заметил...
Точнее у меня выдает ошибку
Код:
Uncaught TypeError: Cannot call method 'setAttribute' of undefined
Код:
$.get(chrome.extension.getURL('/zxc.js'), 
    function(data) {
        var script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.innerHTML = data;
        document.getElementsByTagName("head")[0].appendChild(script);
        document.getElementsByTagName("body")[0].setAttribute("onLoad", "main();");
    }
);
Попробовал прописать
Код HTML:
 $('body').css({'display' : 'none !important'});
Не работает, не прописывается так стиль. Если я правильно вас понял.

Вот страница грузился, а скрипт не работает в это время. Можно ли как то заставить, чтобы работал и делал свое задание в момент загрузки. Формирования документа?

Последний раз редактировалось Predator199; 16.03.2014 в 16:45.
Predator199 вне форума Ответить с цитированием
Старый 16.03.2014, 20:22   #4
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Цитата:
Выставил document_start, разницы не заметил...
Точнее у меня выдает ошибку
Естественно, я об этом написал в своём сообщении.
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 16.03.2014, 23:03   #5
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Цитата:
Сообщение от Fenex Посмотреть сообщение
Естественно, я об этом написал в своём сообщении.
Я не совсем понимаю. Но ведь через баграунд, удаляются элементы. Это мне и нужно... Но ведь удаляются после того как на экране появляются. Можно ли, чтобы заранее были обработаны но в тоже время. Страница подгружалась... Я просто не хочу видеть то, что в дальнейшем исчезнет. Смотреть на белый экран, а затем все и сразу. Не удобно да и временя займет..
Predator199 вне форума Ответить с цитированием
Старый 17.03.2014, 06:18   #6
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Вы никак не сможете обращаться к DOM-дереву если его построение ещё не завершено.

Есть только один вариант, который я написал. Сначала инжектируете стиль, который всё прячет, затем дожидаетесь загрузки document.body, после этого удаляете\вставляете\изменяете элементы, и потом уже отображаете всё сразу. С нынешними скоростями белая страница будет отображаться минимальное время.
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 17.03.2014, 12:20   #7
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Fenex Посмотреть сообщение
Вы никак не сможете обращаться к DOM-дереву если его построение ещё не завершено.

Есть только один вариант, который я написал. Сначала инжектируете стиль, который всё прячет, затем дожидаетесь загрузки document.body, после этого удаляете\вставляете\изменяете элементы, и потом уже отображаете всё сразу. С нынешними скоростями белая страница будет отображаться минимальное время.
Можно обращаться к уже отстроенным узлам.
Со стилем, да, наилучший метод.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 17.03.2014, 14:50   #8
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Добавил в баграунд
Код:
$("head").prepend('<style type="text/css">body { display: none !important; }</style>');
Вот только белое окно постоянно.

Код:
$.get(chrome.extension.getURL('/zxc.js'), 
    function(data) {
        var script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.innerHTML = data;
        document.getElementsByTagName("head")[0].appendChild(script);
		$("head").prepend('<style type="text/css">body { display: none !important; }</style>');
        document.getElementsByTagName("body")[0].setAttribute("onLoad", "main();");
    }
);
Почему он не удаляется. Нет страницы после того как страница подгрузилась...

Присвоил id, после чего попытался удалить.Не выходит...

Последний раз редактировалось Predator199; 17.03.2014 в 16:20.
Predator199 вне форума Ответить с цитированием
Старый 17.03.2014, 17:09   #9
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Цитата:
Присвоил id, после чего попытался удалить.Не выходит...
Удалением тэгов style\script из DOM вы не удалите стиль, вы удалите DOM-элемент.

У стилей нет операции удаления, стили можно только применить к странице. Соответственно, "удаление" - это применение стилей по-умолчанию, то есть нужно создать новый элемент <style>, вписывая туда новое правило, которое будет отображать <body>.

Кстати, неплохо будет сразу за собой подчищать этот "мусор", удаляя тэги <style>. К <script> это тоже относится. Ну во всяком случае я так делаю.

Код:
var s = document.createElement('style');
s.innerHTML = 'body {display: none;}';
document.head.appendChild(s); //apply
document.head.removeChild(s); //clean up
Цитата:
Можно обращаться к уже отстроенным узлам.
Может быть и можно, но я бы не рисковал. Обязательно будут какие-то тонкости и что-то пойдёт не так.
^-.-^ My GitHub

Последний раз редактировалось Fenex; 17.03.2014 в 17:15.
Fenex вне форума Ответить с цитированием
Старый 17.03.2014, 17:29   #10
Predator199
Форумчанин
 
Аватар для Predator199
 
Регистрация: 26.01.2012
Сообщений: 648
По умолчанию

Цитата:
Сообщение от Fenex Посмотреть сообщение
Удалением тэгов style\script из DOM вы не удалите стиль, вы удалите DOM-элемент.

У стилей нет операции удаления, стили можно только применить к странице. Соответственно, "удаление" - это применение стилей по-умолчанию, то есть нужно создать новый элемент <style>, вписывая туда новое правило, которое будет отображать <body>.

Кстати, неплохо будет сразу за собой подчищать этот "мусор", удаляя тэги <style>. К <script> это тоже относится. Ну во всяком случае я так делаю.

Код:
var s = document.createElement('style');
s.innerHTML = 'body {display: none;}';
document.head.appendChild(s); //apply
document.head.removeChild(s); //clean up

Может быть и можно, но я бы не рисковал. Обязательно будут какие-то тонкости и что-то пойдёт не так.
Я так и не понял, что и как правильно мне в баграунде прописать. Вроде бы работает скрипт. Но после того как страница подгрузится. Выдает(Uncaught TypeError: Cannot call method 'setAttribute' of undefined )

Как правильно ваш код вписать в баграунд?
Predator199 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопка функции Открытия Веб Браузера? ProGec4 Windows Forms 1 22.02.2012 21:19
C#: нужно проанализировать веб-страницу Manonia Общие вопросы .NET 4 11.05.2010 07:50
Скриншот веб-страницы по URL без ее открытия в TWebBrowser. SkAndrew Общие вопросы Delphi 6 25.04.2010 21:08
ссылки на веб-страницу в Delphi, как? UNREALcv Помощь студентам 7 05.01.2010 00:37
как загрузить в окно веб страницу? proglamer Работа с сетью в Delphi 3 07.09.2007 20:10