1

我正在关注这个 Twitter 帐户,该帐户在不同时区的军事时间发布推文。我正在尝试在 Firefox 中使用带有 GreaseMonkey 插件的 javascript 来将文本更改为适当的时区和常规时间。问题是我似乎无法让它工作。

我关注的帐户: https ://twitter.com/pso2_emg_bot

我使用的脚本:

// ==UserScript==
// @name        PSO2 Emg Bot Script
// @namespace   Twitter
// @description Convert time to EST
// @include     https://twitter.com/*
// @version     1
// ==/UserScript==

function replaceText(){
var theDiv = document.getElementsByClassName("js-tweet-text");
var theText = theDiv .innerHTML;

// Replace words
theText = theText.replace("4:00~4:30", "2:00 P.M. ~ 2:30 P.M.");
theText = theText.replace("14:00~14:30", "12:00 A.M. ~ 12:30 A.M.");
theText = theText.replace("15:00~15:30", "1:00 A.M. ~ 1:30 A.M.");
theText = theText.replace("16:00~16:30", "2:00 A.M. ~ 2:30 A.M.");

theDiv.innerHTML = theText;
}

目前它还不完整,因为我只需要在包含所有时间以供脚本搜索之前让它工作。如果有人能告诉我我做错了什么以及如何解决它,我将不胜感激。

4

2 回答 2

2
  • 您已经定义了一个函数,function replaceText()但是您的脚本中没有调用该函数的任何内容,因此没有执行任何操作。
  • 请注意,它theDiv实际上将包含一个 div 数组,因此您不能以这种方式设置或设置它的 innerHTML。
  • 在您提到的推特页面中,时间由一个字符分隔,它不是〜,而是屏幕字体显示能力之外的东西。使用复制+粘贴来正确获取。
  • 第11行还有一个语法错误,你在里面留了一个空格theDiv .innerHTML;

Twitter 已加载 jQuery,因此在您的情况下,使用它而不是 vanilla JS 可能会更容易。

//...
// ==/UserScript==

var $ = unsafeWindow.$;
var theDivs = $(".js-tweet-text");

theDivs.each(function(){
    var theText = $(this).text();

    theText = theText.replace("7:00~7:30", "7:00 P.M. ~ 7:30 P.M.");
    //other replacements you want to make.
    //consider using a regular expression instead of one line for each hour.
    $(this).text(theText);
});
于 2012-12-31T00:09:32.457 回答
1

几件事:

  1. 推文是通过 AJAX 添加的,因此您需要使用支持 AJAX 的脚本。下面,我将展示如何使用waitForKeyElements() 实用程序来执行此操作。
  2. 不要使用innerHTML. 它会破坏事情(加上它更慢)。使用jQuery或“DOM 技术”(如下所示)。
  3. .replace()使用正则表达式来获取时间,因此不需要大量不同的语句。

综上所述,这是一个完整的工作脚本

// ==UserScript==
// @name        _PSO2 Emg Bot Script
// @namespace   Twitter
// @description Convert time to EST
// @include     https://twitter.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.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.
*/

waitForKeyElements ("p.js-tweet-text", ChangeSpecialTimeStrs);

function ChangeSpecialTimeStrs (jNode) {
    var node    = jNode[0];

    //-- Search only in the first-level text nodes of this paragraph.
    for (var K = 0, numC = node.childNodes.length;  K < numC;  ++K) {
        var childNode = node.childNodes[K];
        if (childNode.nodeType === Node.TEXT_NODE) {
            if (childNode.nodeValue.length > 8)  {
                //-- Anything shorter can't have our kind of string.
                childNode.nodeValue  = childNode.nodeValue.replace (
                    /*-- This matches strings like: "5:00~15:30"
                        Where "~" may be unicode FF5E
                    */
                    /\b(\d{1,2}):(\d{2})(?:~|\uFF5E)(\d{1,2}):(\d{2})\b/gi,
                    shiftHourStr
                );
            }
        }
    }
}

function shiftHourStr (
    matchedStr,                 //- Housekeeping supplied by .replace()
    hour1Str, minute1Str,       //- Payload vals from () groups
    hour2Str, minute2Str,       //- Payload vals from () groups
    matchOffset, totalString    //- Housekeeping supplied by .replace()
) {
    //-- Return a string with a format like: "12:00 A.M. ~ 12:30 A.M."
    const tzOffsetHours = 10;
    var newHr1Arry      = getHourOffset (hour1Str, tzOffsetHours);
    var newHr2Arry      = getHourOffset (hour2Str, tzOffsetHours);
    var outputStr       = newHr1Arry[0]     //-- Hour value
                        + ":" + minute1Str
                        + newHr1Arry[1]     //-- AM or PM
                        + " ~ "
                        + newHr2Arry[0]     //-- Hour value
                        + ":" + minute2Str
                        + newHr2Arry[1]     //-- AM or PM
                        ;
    return outputStr;
};

function getHourOffset (hourVal, hoursOffset) {
    var amPmStr     = "A.M.";
    var newHourVal  = parseInt (hourVal, 10) + hoursOffset;

    if (newHourVal > 23) {
        newHourVal -= 24;
    }
    if (newHourVal >= 12) {
        newHourVal -= 12;
        amPmStr     = "P.M.";
    }
    if (newHourVal == 0) {
        newHourVal  = 12;
        amPmStr     = "A.M.";
    }
    return [newHourVal, " " + amPmStr];
}
于 2012-12-31T00:57:35.490 回答