将数字值与网页上的字词相关联,然后将其乘以该字词后面的网页上的数字

时间:2013-01-24 06:50:34

标签: javascript greasemonkey

<img src="http://lawyer.gif" />
<a href="http://lawyer.com">lawyer</a> (111)

<img src="http://doctor.gif" />
<a href="http://doctor.com">doctor</a> (222)

所以有多个页面包含类似于上面的html。我想为“律师”或“lawyer.gif”或其他任何事件分配一个特定值,并将其乘以111如果律师在页面上,然后将其添加到“医生”乘以222如果医生在页。有很多不同的可能“职业”(~50),所以这里的代码非常简单。一页可能有医生,律师和消防员,而另一页可能只有牙医。然后应该在页面上或弹出窗口或其他任何内容中显示此总和。这里的111和222来自代码中括号中的数字,这些数字在每页上都有变化。

我计划用greasemonkey / javascript做这个,但仅仅是因为我对此的经验有限。所以我想我的问题是第一,这甚至可能至少在某种程度上是简单的,如果是这样,有人至少可以给我一些提示让我开始吗?感谢。

1 个答案:

答案 0 :(得分:1)

一般来说:

  1. 要处理很多事情,请使用数组:[blah1, blah2, etc.]
  2. 要将ad-hoc值与ad-hoc标签相关联,请使用对象:
    [ {blah1: 3.1}, {blah2: 415}, etc.]
  3. 要检测和操作页面上的内容,请使用 jQuery
  4. 要向页面添加显示或其他元素,请使用jQuery。
  5. 总而言之,一个完整的脚本可以解决您的问题。您还可以see the code in action at jsFiddle.

    // ==UserScript==
    // @name     Arbitrary math on arbitrary page values
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
    // @grant    GM_addStyle
    // ==/UserScript==
    /*- The @grant directive is needed to work around a design change
        introduced in GM 1.0.   It restores the sandbox.
    */
    
    var textToValuesArray   = [
        {"doctor": 3}
        , {"lawyer": 5}
        , {"rodeo clown": 7}
        // etc.
    ];
    var targetNodes = $("td.left:has(a)");
    var targetText  = targetNodes.text ();
    var reportValue = 0;
    
    //-- Loop through the textToValuesArray.
    $.each (textToValuesArray, function (index, textToValueObject) {
        var textTerm    = Object.keys (textToValueObject)[0];
    
        //-- Is the text term in the targeted part of the page?
        var termRegex   = new RegExp(textTerm, 'i'); // Case insensitive
        if (termRegex.test (targetText) ) {
            console.log ("Text '" + textTerm + "' was found!");
    
            /*-- Given the indicated page structure, targetText will look like:
                "doctor (2)lawyer (4)" etc.
                With the value we want coming one space after the target term
                and in parentheses.
    
                So, if we split the string on the search term, we get the next
                (number), if any.
            */
            var splitStr    = targetText.split (termRegex);
            if (splitStr  &&  splitStr.length > 1) {
                var multiplierString = splitStr[1].replace (/^\s*\((\d+)\).*$/, "$1");
                if (multiplierString) {
                    var multiplierInteger = parseInt (multiplierString, 10);
                    if (isNaN (multiplierInteger) ) {
                        console.log ("Multiplier value not found! (2)");
                    }
                    else {
                        /*-- We found a term and we found its multiplier.
                            Add to the report value.
                        */
                        var termValue   = textToValueObject[textTerm];
                        console.log (
                            "termValue: ", termValue,
                            "   ",
                            "multiplierInteger: ", multiplierInteger
                        );
                        reportValue    += termValue * multiplierInteger
                    }
                }
                else {
                    console.log ("Multiplier value not found! (1)");
                }
            }
            else {
                console.log ("Split string error!");
            }
        }
    } );
    
    console.log ("reportValue: ", reportValue);
    
    $("body").prepend ('<div id="gmReport">The final value was: ' + reportValue + '</div>');
    $("#gmReport").css ("background", "orange");