Я создаю пользовательский скрипт и, чтобы избежать страшного эффекта «дрожания», поскольку пользовательский скрипт редактирует стили страницы после завершения рендеринга страницы, я пытаюсь сделать это, пока страница все еще загружается.
Выполнение этого путем вставки правил в уже существующий объект стиля работает должным образом....
http://pastebin.com/NNjLjKA5 ...дождитесь создания объекта стиля, затем добавьте к нему новый стиль.
Однако при попытке создать новый объект стиля для вставки правил я испытываю странное поведение...
// ==UserScript==
// @name script
// @include *
// @run-at document-start
// ==/UserScript==
// Add style rules while page is loading (to prevent jumping)
function addStyleRules(){
// Check if stylesheets exist yet, if not try again in a bit
if( !document.styleSheets[0] ) return setTimeout( addStyleRules,1 );
// Get/create stylesheet element (if not already created)
if( !document.querySelector( 'style[title=new_stylesheet]' ) ){
var css = document.createElement( 'style' );
css.type = "text/css";
document.head.appendChild( css );
css.title = 'new_stylesheet';
}
// Get stylesheet object
var ss;
for(i in document.styleSheets )
if( document.styleSheets[i].title == 'new_stylesheet' )
ss = document.styleSheets[i];
// Add style rules
if(ss.addRule)
ss.addRule( '*','background-color:black',0);
else
ss.insertRule('*{background-color:black}',0);
//debug
console.log( 'page loading', ss, new Date().getTime() );
}
addStyleRules();
// Page has finished loading
document.addEventListener('DOMContentLoaded',function(e){
// Get stylesheet object
var ss;
for(i in document.styleSheets )
if( document.styleSheets[i].title == 'new_stylesheet' )
ss = document.styleSheets[i];
//debug
console.log('page loaded', ss, new Date().getTime() );
});
Этот сценарий должен создать новый элемент стиля, найти новый объект стиля в 'document.styleSheets', а затем применить новое правило.
Кажется, это нормально, как видно из первого события журнала. Однако после завершения загрузки страницы новый объект стиля больше не существует (даже если элемент стиля присутствует в DOM).
Итак, мой вопрос...
Что происходит с вновь созданным объектом таблицы стилей между его созданием, успешным применением нового правила и срабатыванием события DOMContentLoaded?
- Браузер Chrome 16.0.912.77