GreaseMonkey - JavaScript - 删除一些css和js refs后缀

时间:2011-08-07 15:47:33

标签: javascript greasemonkey replace

我在一个网站的头部和身体中有css和js链接,我想删除一个后缀。

头部的CSS链接如下所示:

<link rel="stylesheet" type="text/css" href="http://example.com/some.css?r=5.6" media="screen" />
<link rel="stylesheet" type="text/css" href="http://example.com/someother.css?r=5.6" media="screen" />

和身体中的一些JavaScript包括:

<script type="text/javascript" src="http://example.com/some.js?r=5.6"></script> 
<script type="text/javascript" src="http://example.com/someother.js?r=5.6"></script>

现在我想从这个链接中删除“?r = 5.6”部分(使用GreaseMonkey)。

使用以下代码我找到它并可以使用它来制作 - 例如 - 一个alert():

var cssLinks=document.getElementsByTagName("link");

for (var i=0;i<cssLinks.length;i++)
{
    alert(cssLinks[i].href.replace(/\?r=5.6/, ""));
}

var scriptLinks=document.getElementsByTagName("script");

for (var i=0;i<scriptLinks.length;i++)
{
    alert(scriptLinks[i].src.replace(/\?v=2.2.7/, ""));
}

但我想在源代码中替换它,以便不解析?r = 5.6。我用document.innerHTML,xPath和其他人尝试过很多例子,但我找不到合适的解决方案。

你能帮忙吗? : - )

1 个答案:

答案 0 :(得分:1)

要点:

  1. 通常,当您替换查询参数时,就像那样。 EG:

    http://example.com/someother.css?r=5.6
    

    要:

    http://example.com/someother.css
    

    没有任何效果。 ?r=5.6只是让浏览器获取最新版本文件(未缓存)的技巧,而无需实际重命名文件。


  2. 好消息是,如果你真的改变了CSS文件,那么EG:

    http://example.com/File_1.css
    

    要:

    http://example.com/File_2.css
    

    然后在Firefox中替换CSS规则,就像你希望的那样。


  3. 但是,如果您实际更改了JS文件,那么EG:

    http://example.com/File_A.js
    

    要:

    http://example.com/File_B.js
    

    然后根本没有执行新JS !旧的JS仍在内存中,以便启动。

  4. 所以,您可以这样添加新的JS:

    function addJS_Node (text, s_URL) {
        var scriptNode                      = document.createElement ('script');
        scriptNode.type                     = "text/javascript";
        if (text)  scriptNode.textContent   = text;
        if (s_URL) scriptNode.src           = s_URL;
    
        var targ    = document.getElementsByTagName('head')[0] || d.body || d.documentElement;
        targ.appendChild (scriptNode);
    }
    
    addJS_Node (null, "http://example.com/File_B.js");
    

    但是,如果两个文件(File_A.jsFile_B.js)都使用/设置相同的计时器或事件监听器,那么这可能会产生有趣的效果。

    可能的解决方法:使用AdBlock之类的内容阻止加载File_A.js


  5. 无论如何,这是一个完整的Greasemonkey脚本,它可以完成您所要求的 请参阅上面的说明,了解实际工作的方式和内容。

    // ==UserScript==
    // @name            _Swap CSS and Javascript links.
    // @include         http://YOUR_SERVER/YOUR_PATH/*
    // @require         http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
    // ==/UserScript==
    
    var targCSS = $("link[rel=stylesheet][href*='r=5.6']");
    
    targCSS.each ( function () {
        var jThis   = $(this);
        jThis.attr ('href', jThis.attr ('href').replace (/\?r=5.6/i, '') );
    } );
    
    var targJS  = $("script[src*='v=2.2.7']");
    
    /* No workie.  That is, new script will not execute.
    targJS.each ( function () {
        var jThis   = $(this);
        jThis.attr ('src', jThis.attr ('src').replace (/\?v=2.2.7/i, '') );
    } );
    */
    targJS.each ( function () {
        var jThis   = $(this);
        var newSrc  = jThis.attr ('src').replace (/\?v=2.2.7/i, '')
    
        addJS_Node (null, newSrc);
    } );
    
    function addJS_Node (text, s_URL) {
        var scriptNode                      = document.createElement ('script');
        scriptNode.type                     = "text/javascript";
        if (text)  scriptNode.textContent   = text;
        if (s_URL) scriptNode.src           = s_URL;
        var targ    = document.getElementsByTagName('head')[0] || d.body || d.documentElement;
        targ.appendChild (scriptNode);
    }