添加html元素的简单用户脚本

时间:2012-10-07 06:16:06

标签: javascript dom greasemonkey href userscripts

我正在尝试为Chrome编写一个用户脚本,它只是为网站添加了一个元素,但是由于我有限的Javascript知识,我真的不是很成功。

主题的例子:

<html>
<body>
<p class="listcaption">......................................</p>
<p class="listrow" id="listrow_aka_battlep"><span class="small"><b><a href="item.php?action=academy"></a>-: </b> / <b> : </b>0000</span></p>
<p class="listrow" id="listrow_char_mission"><a href="ability.php">text</a> | <a href="item.php?action=missiondesc"> text</a></p>
<p class="listrow" id="listrow_clan"><b>some</b><a href="clanmenu.php?action=manageclan">-------</a> &nbsp;|&nbsp; <a href="fight.php?action=groupjoinrand" target="mainFrame" title="group"></a></p>
<p class="listrow" id="listrow_group"><b>group: </b><a href="clanmenu.php?action=groupmenu">~~~~~</a></p>
<p class="listrow" id="listrow_lifep"><b>LP: </b>(<span class="healthok"><b>000</b></span>/000)</p>
<p class="listrow" id="listrow_money"><b>gold: </b>629 &nbsp;&nbsp;&nbsp;&nbsp;(<a href="item.php?action=moneydrop1"></a> | <a href="item.php?action=moneytransfer1"></a>)</p>
<p class="listrow" id="listrow_int"><b>......</b>0000<span class="healthok" id="speedok">000</span>000</p>
<p class="listrow" id="listrow_attackp"><b>text</b>000<span class="valueincreased">000</span>text</p>
<p class="listrow" id="listrow_attackw" title=""><b>............</b>text</p>
<p class="listrow" id="listrow_defensep"><b>?????????????</b>0000<span class="valueincreased">000000</span></p>
<p class="listrow" id="listrow_defensew" title="100%"><b>000000000000</b>texts</p>
<p class="listrow" id="listrow_neck"><b>neck:</b>something</p>
<p class="listrow" id="listrow_special"><a href="item.php?action=special">Special</a></p><p class="listrow" id="listrow_status"><span class="small"></span></p>
</body></html>

期望的输出:

<html>
<body>
<p class="listcaption">......................................</p>
<p class="listrow" id="listrow_aka_battlep"><span class="small"><b><a href="item.php?action=academy"></a>-: </b> / <b> : </b>0000</span></p>
<p class="listrow" id="listrow_char_mission"><a href="ability.php">text</a> | <a href="item.php?action=missiondesc"> text</a></p>
<p class="listrow" id="listrow_clan"><b>some</b><a href="clanmenu.php?action=manageclan">-------</a> &nbsp;|&nbsp; <a href="fight.php?action=groupjoinrand" target="mainFrame" title="group"></a></p>
<p class="listrow" id="listrow_group"><b>group: </b><a href="clanmenu.php?action=groupmenu">~~~~~</a></p>
<p class="listrow" id="listrow_lifep"><b>LP: </b>(<span class="healthok"><b>000</b></span>/000)</p>
<p class="listrow" id="listrow_money"><b>gold: </b>629 &nbsp;&nbsp;&nbsp;&nbsp;(<a href="item.php?action=moneydrop1"></a> | <a href="item.php?action=moneytransfer1"></a>)</p>
<p class="listrow" id="listrow_int"><b>......</b>0000<span class="healthok" id="speedok">000</span>000</p>
<p class="listrow" id="listrow_attackp"><b>text</b>000<span class="valueincreased">000</span>text</p>
<p class="listrow" id="listrow_attackw" title=""><b>............</b>text</p>
<p class="listrow" id="listrow_defensep"><b>?????????????</b>0000<span class="valueincreased">000000</span></p>
<p class="listrow" id="listrow_defensew" title="100%"><b>000000000000</b>texts</p>
<p class="listrow" id="listrow_neck"><b>neck:</b>something</p>
<p class="listrow" id="listrow_newlist"><a href="item.php?action=activate&amp;act_item_id=000029"><img src="../images/items/image1.gif" width="20" height="20" title="1" border="0" align="absmiddle"></a> |&nbsp; <a href="item.php?action=watch&amp;act_item_id=000016"><img src="../images/items/image2" width="20" height="20" title="2" border="0" align="absmiddle"></a>&nbsp;|&nbsp; <a href="item.php?action=watch&amp;act_item_id=0000061"><img src="../images/items/image3" width="20" height="20" title="3" border="0" align="absmiddle"></a>&nbsp;|&nbsp; <a href="item.php?action=watch&amp;act_item_id=000095"><img src="../images/items/image4.gif" width="20" height="20" title="4" border="0" align="absmiddle"></a></p>
<p class="listrow" id="listrow_special"><a href="item.php?action=special">Special</a></p><p class="listrow" id="listrow_status"><span class="small"></span></p>
</body></html>

我只是希望用户脚本添加此列表:

<p class="listrow" id="listrow_newlist"><a href="item.php?action=activate&amp;act_item_id=000029"><img src="../images/items/image1.gif" width="20" height="20" title="1" border="0" align="absmiddle"></a> |&nbsp; <a href="item.php?action=watch&amp;act_item_id=000016"><img src="../images/items/image2" width="20" height="20" title="2" border="0" align="absmiddle"></a>&nbsp;|&nbsp; <a href="item.php?action=watch&amp;act_item_id=0000061"><img src="../images/items/image3" width="20" height="20" title="3" border="0" align="absmiddle"></a>&nbsp;|&nbsp; <a href="item.php?action=watch&amp;act_item_id=000095"><img src="../images/items/image4.gif" width="20" height="20" title="4" border="0" align="absmiddle"></a></p>

谢谢大家的帮助!

更新

我试着先添加这个元素:

<a href="item.php?action=activate&amp;act_item_id=000029"><img src="../images/items/image1.gif" width="20" height="20" title="1" border="0" align="absmiddle"></a>

这可能是错误的做法。 (因为它确实有效):

// ==UserScript==
// @name           my script
// @description    ...
// @author         ...
// @version        1.0
// ==/UserScript==
var links = document.getElementsByClassName( 'listrow' );
    ( var i = 0; i < links.length; i++ ) {
    var link = links[i];
    var newlist = document.createElement( 'a' );
    newlist.href = item.php?action=activate&amp;act_item_id=000029
    var the_image = document.createElement('img');
    the_image.src = '../images/image1.gif';
    newlink.appendChild(the_image);
    }

2 个答案:

答案 0 :(得分:1)

使用jQuery:

<html>
  <head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script>
      $(document).ready(function(){
        function buildLink(url, imagePath){
          var img = $('<img/>').attr('src', imagePath);
          var link = $('<a/>').attr('href', url).append(img);

          return link;
        }

        var newlist = $('<p/>').attr('id', 'listrow_newlist').addClass('listrow');

        newlist.append(buildLink('#url01', 'path_to_image1'));
        newlist.append(buildLink('#url02', 'path_to_image2'));
        newlist.append(buildLink('#url03', 'path_to_image3'));

        newlist.insertAfter('#listrow_neck');
      });
    </script>
  </head>
  <body>
    <p class="listcaption">......................................</p>
    <p class="listrow" id="listrow_aka_battlep"><span class="small"><b><a href="item.php?action=academy"></a>-: </b> / <b> : </b>0000</span></p>
    <p class="listrow" id="listrow_char_mission"><a href="ability.php">text</a> | <a href="item.php?action=missiondesc"> text</a></p>
    <p class="listrow" id="listrow_clan"><b>some</b><a href="clanmenu.php?action=manageclan">-------</a> &nbsp;|&nbsp; <a href="fight.php?action=groupjoinrand" target="mainFrame" title="group"></a></p>
    <p class="listrow" id="listrow_group"><b>group: </b><a href="clanmenu.php?action=groupmenu">~~~~~</a></p>
    <p class="listrow" id="listrow_lifep"><b>LP: </b>(<span class="healthok"><b>000</b></span>/000)</p>
    <p class="listrow" id="listrow_money"><b>gold: </b>629 &nbsp;&nbsp;&nbsp;&nbsp;(<a href="item.php?action=moneydrop1"></a> | <a href="item.php?action=moneytransfer1"></a>)</p>
    <p class="listrow" id="listrow_int"><b>......</b>0000<span class="healthok" id="speedok">000</span>000</p>
    <p class="listrow" id="listrow_attackp"><b>text</b>000<span class="valueincreased">000</span>text</p>
    <p class="listrow" id="listrow_attackw" title=""><b>............</b>text</p>
    <p class="listrow" id="listrow_defensep"><b>?????????????</b>0000<span class="valueincreased">000000</span></p>
    <p class="listrow" id="listrow_defensew" title="100%"><b>000000000000</b>texts</p>
    <p class="listrow" id="listrow_neck"><b>neck:</b>something</p>
    <p class="listrow" id="listrow_special"><a href="item.php?action=special">Special</a></p><p class="listrow" id="listrow_status"><span class="small"></span></p>
  </body>
</html>  

修改

以下脚本不使用jQuery,但只使用纯JS,我测试了它并且工作得很好,我不确定它是否可以与Greasemonkey或Tampermonkey一起使用,但至少它没有任何库依赖项。

  window.addEventListener('load', function(){
    function buildLink(url, imagePath){
      var img = document.createElement('img');
      img.src = imagePath;

      var link = document.createElement('a');
      link.href = url;
      link.appendChild(img);

      return link;
    }

    var newlist = document.createElement('p');
    newlist.setAttribute('id', 'listrow_newlist')
    newlist.className = 'listrow';

    newlist.appendChild(buildLink('#url01', 'path_to_image1'));
    newlist.appendChild(buildLink('#url02', 'path_to_image2'));
    newlist.appendChild(buildLink('#url03', 'path_to_image3'));

    var nextEl = document.getElementById('listrow_special');
    document.body.insertBefore(newlist, nextEl);
  });

答案 1 :(得分:1)

成长为爱jQuery,特别是the Manipulation Functions

这是添加该段落的完整的Firefox / Greasemonkey和Chrome用户脚本。请参阅内联评论。

// ==UserScript==
// @name     _Add New paragraph at targeted location
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant    GM_addStyle
// ==/UserScript==

function GM_main ($) {
    var insertTarget    = $("#listrow_special");

    //-- Insert empty container paragraph before the target paragraph.
    insertTarget.before ('<p class="listrow" id="listrow_newlist"></p>');

    //-- Set this array to the unique parts of the links.
    var linkDatArray    = [
        ["activate&amp;act_item_id=000029", "image1.gif", "title 1"],
        ["watch&amp;act_item_id=000016",    "image2.gif", "title 2"],
        ["watch&amp;act_item_id=0000061",   "image3.gif", "title 3"],
        ["watch&amp;act_item_id=000095",    "image4.gif", "title 4"]
    ];

    //-- Now use the array to insert the links into the container paragraph.
    var contParag       = $("#listrow_newlist");

    $.each (linkDatArray, function (rowIdx, arryRow) {
        //-- Create empty link with correct action.
        var newLink     = $('<a href="item.php?action=' + arryRow[0] + '"></a>');

        //-- Insert the image into it.
        newLink.append (
            '<img src="../images/items/' + arryRow[1] + '" title="' + arryRow[2] + '">'
        );

        //-- Insert the link into the container paragraph.
        contParag.append (newLink);

        //-- Except for the last link, add our seperator characters.
        if (rowIdx  <  linkDatArray.length - 1) {
            contParag.append ('&nbsp;|&nbsp;');
        }
    } );
}

/*--- STYLE THE IMAGES (And anything else) WITH CSS!  NOT ATTRIBUTES.
*/
//-- GM_addStyle() works on both Firefox and Chrome
GM_addStyle ( '                     \
    #listrow_newlist a img {        \
        width:          20px;       \
        height:         20px;       \
        border:         none;       \
        vertical-align: middle;     \
    }                               \
' );

//-- Fire the main/payload code
add_jQuery (GM_main);

//-- This is just a standard utility function
function add_jQuery (callbackFn, jqVersion) {
    jqVersion       = jqVersion || "1.7.2";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'http://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}