Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Twitter对话中的每个无限滚动事件上执行Greasemonkey脚本?_Javascript_Twitter_Greasemonkey - Fatal编程技术网

Javascript 如何在Twitter对话中的每个无限滚动事件上执行Greasemonkey脚本?

Javascript 如何在Twitter对话中的每个无限滚动事件上执行Greasemonkey脚本?,javascript,twitter,greasemonkey,Javascript,Twitter,Greasemonkey,我正在尝试制作一个greasemonkey用户脚本,用于Twitter对话 (给名字、用户名和每个第一个@reply加上颜色) 当Twitter对话有大量回复()时, 然后打开这样一个链接只会显示3个屏幕的回复(初始屏幕+2个以上) -至少在我的1920x1200显示器上- 然后你必须手动向下滚动才能看到其余的回复 如何在每个无限滚动事件上执行脚本 (在每个鼠标滚轮上向下或PgDn或向下箭头↓按键)? 有人善意地建议: 尝试在FF devtools调试器中检查代码(右键单击代码 然后选择“美化源

我正在尝试制作一个greasemonkey用户脚本,用于Twitter对话
(给名字、用户名和每个第一个@reply加上颜色)

当Twitter对话有大量回复()时,
然后打开这样一个链接只会显示3个屏幕的回复(初始屏幕+2个以上)
-至少在我的1920x1200显示器上- 然后你必须手动向下滚动才能看到其余的回复

如何在每个无限滚动事件上执行脚本 (在每个
鼠标滚轮上向下
PgDn
向下箭头↓按键)?

有人善意地建议:

尝试在FF devtools调试器中检查代码(右键单击代码 然后选择“美化源代码”)查看
InfiniteSrollWatcher
的功能 触发

因此,我想我应该使用 , 但是我不知道怎么做(这个功能对我来说太高级了)

该功能的美化来源是:

function infiniteScrollWatcher() {
  var a = 0,
  b = 1;
  this.checkScrollPosition = function () {
    var c = this.webkitFullscreenElement();
    if (c && this.node != c && !c.contains(this.node)) return;
    var d = this.$content.height(),
    e = !1;
    this.inTriggerRange(a) && (d > this.lastTriggeredHeight || this.lastTriggeredFrom(b)) ? (this.trigger('uiNearTheTop'), this.lastTriggerFrom = a, e = !0)  : this.inTriggerRange(b) && (d > this.lastTriggeredHeight || this.lastTriggeredFrom(a)) && (this.trigger('uiNearTheBottom'), this.lastTriggerFrom = b, e = !0),
    e && (this.lastTriggeredHeight = d)
  },
  this.inTriggerRange = function (c) {
    var d = this.$content.height(),
    e = this.$node.scrollTop(),
    f = e + this.$node.height(),
    g = Math.abs(Math.min(f - d, 0)),
    h = this.$node.height() / 2;
    return e < h && c == a || g < h && c == b
  },
  this.lastTriggeredFrom = function (a) {
    return this.lastTriggerFrom === a
  },
  this.resetScrollState = function () {
    this.lastTriggeredHeight = 0,
    this.lastTriggerFrom = - 1
  },
  this.webkitFullscreenElement = function () {
    return document.webkitFullscreenElement
  },
  this.after('initialize', function () {
    this.resetScrollState(),
    this.$content = this.attr.contentSelector ? this.select('contentSelector')  : $(document),
    this.on('scroll', utils.throttle(this.checkScrollPosition.bind(this), 100)),
    this.on('uiTimelineReset', this.resetScrollState),
    this.on('uiSwiftLoaded uiPageChanged', this.checkScrollPosition)
  })
}
function infiniteScrollWatcher(){
var a=0,
b=1;
this.checkScrollPosition=函数(){
var c=this.webkitFullscreenElement();
如果(c&&this.node!=c&&c.contains(this.node))返回;
var d=此.$content.height(),
e=!1;
this.triggerRange(a)&(d>this.lastTriggeredHeight | | this.lastTriggeredFrom(b))?(this.trigger('uinEarthTop')、this.lastTriggerFrom=a、e=!0):this.inTriggerRange(b)&(d>this.lastTriggeredHeight | this.lastTriggeredFrom(a))&(this.triggeredFrom('uinEarthTop')、this.lastTriggerFrom=b、e=!0),
e&(this.lastTriggeredHeight=d)
},
this.inTriggerRange=函数(c){
var d=此.$content.height(),
e=此。$node.scrollTop(),
f=e+this.$node.height(),
g=数学绝对值(数学最小值(f-d,0)),
h=此。$node.height()/2;
返回e
不同的方法:

Twitter通过jQuery发送请求以获取结果,路径为:

/twitter.com/i/[username]/conversation/[conversationid]?[query]
jQuery包括向所有ajax请求添加全局成功处理程序的选项,您可以使用该处理程序

在处理程序内部:

  • 解析当前url以获取用户名和会话id
  • 根据上面的路径测试AJAX请求的url(用步骤1的结果替换用户名和会话id)
  • 检查响应是否包含包含非空白字符的属性
    items\u html
  • 当步骤#2和#3成功后,新项目已加载,请执行所需的指令

    样本:

    // ==UserScript==
    // @name        twitter
    // @namespace   twitter
    // @include     https://twitter.com/*
    // @version     1
    // @grant       none
    // ==/UserScript== 
    
    window.addEventListener('load', function() {
    
            var path=location.pathname.split(/\//,5),_url;
    
            //check if we're inside a conversation
            if(path.length>=4 && path[2]==='status' && !isNaN(path[3])){
    
              //create the path for the comparison
              _url='/'+['i',path[1],'conversation',path[3]].join('/')+'?';
    
              $(document).ajaxSuccess(function(a, b, opts, data) {
                if (opts.url.indexOf(_url) === 0 //urls match
                      &&
                    data.items_html
                      &&
                    data.items_html.match(/\S/)//new items availabe
                ) {
                    //do what you want to
                    alert('new content inserted');
                }
            });
            }
    
        },
        false);
    
    但是,当您只想应用自定义样式时,不需要关心新内容,只需向文档中添加带有一些自定义规则的样式表(也可以通过以下方式完成):

    // ==UserScript==
    // @name        twitter
    // @namespace   twitter
    // @include     https://twitter.com/*
    // @version     2
    // @grant       none
    // ==/UserScript==
    
    var style=document.createElement('style');
    document.getElementsByTagName('head')[0].appendChild(style);
    //name
    style.sheet.insertRule('.tweet .stream-item-header strong.fullname' +
                           '{background:tomato;color:white}',0);
    //username
    style.sheet.insertRule('.tweet .stream-item-header span.username' +
                           '{background:tomato;color:black}',0);
    //first @reply
    style.sheet.insertRule('.tweet .tweet-text a.twitter-atreply:first-of-type *' +
                           '{background:blue;color:orange !important;}',0);