-1

私のブラウザは SRWare Iron 24.0 Portable で、Tampermonkey のバージョンは 2.12.3124.256 または
3.0.3389.11 です。次のユーザースクリプトを書きます。

// ==UserScript==
// @name        Night Mode
// @namespace   http://use.i.E.your.homepage/
// @version     1.0
// @description  Add night mode style
// @include     http*
// @run-at      document-start
// ==/UserScript==

function addNightStyle(){
    var rules = ['html, body { background: #383838 !important; }',
        'div { background-color: #383838 !important; }',
        'header,nav,table,th,tr,td,dl,ul,li,ol,fieldset,form,h1,h2,h3,h4,h5,h6,pre { background: transparent !important;}',
        '* { color: #B6AA7B !important; }',
        'a:link,a:link *,a:link:hover,a:link:hover *,a:link:active,a:link:active * { color: #B6AA7B !important; }',
        'a:visited,a:visited *,a:visited:hover,a:visited:hover *,a:visited:active,a:visited:active * { color: #D9C077 !important; }'
        ];
    with( document.head.appendChild(document.createElement('style')) ){
        id = 'nightmode';
        for(var i=0; i<rules.length; i++){
            sheet.insertRule(rules[i], i);
        }
    }
}
setTimeout(addNightStyle,90);

このスクリプトがアクティブな場合、より多くのページをブラウズすると、レンダラー プロセスのメモリ使用量と仮想サイズが徐々に増加します。メモリは、対応するレンダラー プロセスのすべてのタブを閉じることによってのみ解放できます。

このスクリプトでメモリ リークが発生するのはなぜですか?

修正方法は?

4

1 に答える 1

0

まず第一にrules、この場合はキーワードです。ループは開始されません。ルール リストに別の名前を選択する必要があります。とにかく、MDN Reference - CSSStyleSheetinsertRuleによると、この方法でアクセスすることはできませんが、代わりにこれを行うことができます:

function addNightStyle(){
    var ruleList = ['html, body { background: #383838 !important; }',
        'div { background-color: #383838 !important; }',
        'header,nav,table,th,tr,td,dl,ul,li,ol,fieldset,form,h1,h2,h3,h4,h5,h6,pre { background: transparent !important;}',
        '* { color: #B6AA7B !important; }',
        'a:link,a:link *,a:link:hover,a:link:hover *,a:link:active,a:link:active * { color: #B6AA7B !important; }',
        'a:visited,a:visited *,a:visited:hover,a:visited:hover *,a:visited:active,a:visited:active * { color: #D9C077 !important; }'
        ];
    document.head.appendChild(document.createElement('style'));
    with(sheet = document.styleSheets[document.styleSheets.length - 1]){
        id = 'nightmode';
        for (var i = 0; i < ruleList.length; i++) {
            sheet.insertRule(ruleList[i], i);
        }
    }
}

ワーキングJSFiddle

于 2013-05-26T09:31:39.077 に答える