2016-09-06 4 views
2

мне нужно, чтобы скрыть раздел из HTML-страницы:Tampermonkey скрипт запускается до загрузки страницы

<h1 data-ng-show="!menuPinned &amp;&amp; !isSaaS" class="logo floatLeft" aria-hidden="false"><span>XXX&nbsp;</span><span style="font-weight: bold;">XXX&nbsp;</span><span>XXXXX</span></h1> 

Следующий код прекрасно работает в Chrome Dev. инструменты

var ibmlogo = document.querySelectorAll('h1.logo.floatLeft'); 
ibmlogo[1].remove(); 

Но когда я загружаю страницу с активным скриптом, раздел (h1) не исчезнет. Я считаю, что это происходит потому, что, когда сценарий запускается, DOM еще не завершен, поэтому скрипт не находит селектор.

Я пробовал много разных вещей (например, window.onLoad), но мой сценарий не эффективен. Последняя попытка (неудача) заключается в следующем:

var logo = document.querySelectorAll('h1.logo.floatLeft'); 
logo.onload = function() {removeLogo()}; 

function removeLogo(){ 
    console.log("### logo array lenght: " + logo.length); 
    logo[1].remove(); 
}; 

Любой совет? Спасибо, Джованни

+2

бы не стиль пользователя (например, с помощью [Стильный] (https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=en)) с 'h1.logo.floatLeft {display: none; } 'трюк? – hsan

ответ

8

Обязательно:

  • @run-at: document-start в userscript metablock.

    // ==UserScript== 
    .............. 
    // @run-at  document-start 
    .............. 
    // ==/UserScript== 
    

Теперь с выше варианты:

  1. Просто впрыснуть стиль, который скрывает логотип:

    (document.head || document.documentElement).insertAdjacentHTML('beforeend', 
        '<style>h1.logo.floatLeft { display: none!important; }</style>'); 
    
  2. Использование MutationObserver для обнаружения и удаления элемента сразу после его добавления в DOM.

     

    new MutationObserver(function(mutations) { 
        // check at least two H1 exist using the extremely fast getElementsByTagName 
        // which is faster than enumerating all the added nodes in mutations 
        if (document.getElementsByTagName('h1')[1]) { 
         var ibmlogo = document.querySelectorAll('h1.logo.floatLeft')[1]; 
         if (ibmlogo) { 
          ibmlogo.remove(); 
          this.disconnect(); // disconnect the observer 
         } 
        } 
    }).observe(document, {childList: true, subtree: true}); 
    // the above observes added/removed nodes on all descendants recursively 
    
+0

Спасибо @woxxom, первый вариант делает трюк, даже если я не совсем понимаю, как это сделать. Когда сценарий запускает мой элемент, не существует (я тестировал его с помощью document.querySelectorAll, так как вставлять insertAdjacentHTML что-то в не существующий узел? И если он создает узел, когда страница в конечном итоге загружается, он не должен переопределять мой Введенный элемент? –

+0

Привет, я не мог сделать его вторым вариантом (намного большим), работающим в вашем коде. Я получаю синтаксическую ошибку во второй до последней строки (не могу понять, почему). Затем я попробовал образец с веб-сайта mozilla и код не работает, потому что цель не является Узлом и проверяет его, когда я создаю цель, элемент не существует (я даже пытался с «html»), и цель всегда равна нулю. . Cheers –

+0

1. Это то, что Листы CSS для 2. Код должен работать как есть, не изменяйте параметр 'document' в' наблюдать'. В любом случае, я не психический, поэтому не могу сказать, что происходит в вашем браузере – wOxxOm