修复ESPNConversations(添加暂停复选框)

时间:2011-06-10 04:49:45

标签: javascript jquery greasemonkey

ESPNConversations

尝试添加暂停/恢复实时评论的复选框。 (现在它的工作方式是当鼠标滚动到客户区域或推出时暂停/恢复)。我遵循Brock Adams here的指示,但它不起作用(下面的复选框没问题,只是实际的暂停/恢复功能完全无效。)

function paused() {
  return false;
}

function pause_click() {

   if (this.checked) {
     $("div.echo-stream-body").bind("mouseout",paused);   
     $("div.echo-stream-body").mouseover();     
   }
   else   {
     $("div.echo-stream-body").unbind("mouseout",paused);   
     $("div.echo-stream-body").mouseout();
   }
}

function add_pause_checkbox() {

  $(".echo_sort_down").after("<span style='position:relative;  top:-3px; margin-left:540px;'><input  type='checkbox' name='pause_gm' id='pause_gm' value='Pause' onClick='pause_click()' /><span style='position:relative; top:-2px;'>Pause</span></span>");

  $("#pause_gm").click(pause_click);
}

$(document).ready(add_pause_checkbox);

2 个答案:

答案 0 :(得分:1)

有几件事:

  1. 在这种情况下,您需要使用页面的jQuery副本。因此$的所有实例都需要unsafeWindow.jQuery

  2. 在GM脚本触发后,不要关闭JS将加载的结构!例如,.echo_sort_down通常不存在。

    在这种情况下,请在#echostream1之前插入。

  3. 避免使用内联样式。代码将更清晰,更容易摆弄。通过GM_addStyle()使用CSS。

  4. 以下作品,下面讨论的例外......

    // ==UserScript==
    // @name            _ESPN pause foo.
    // @include         http://scores.espn.go.com/nba/*
    // ==/UserScript==
    
    function paused (zEvent) {
        return false;
    }
    
    function pause_click () {
    
        if (this.checked) {
            unsafeWindow.jQuery ("div.echo-stream-body").bind ("mouseout", paused);
            unsafeWindow.jQuery ("div.echo-stream-body").mouseover ();
        }
        else {
            unsafeWindow.jQuery ("div.echo-stream-body").unbind ("mouseout", paused);
            unsafeWindow.jQuery ("div.echo-stream-body").mouseout ();
        }
    }
    
    unsafeWindow.jQuery ("#echostream1").before (
        "<span class='mySpan'><input type='checkbox' id='pause_gm'/><span>Pause</span></span>"
    );
    unsafeWindow.jQuery ("#pause_gm").click (pause_click);
    
    
    GM_addStyle ( (<><![CDATA[
        span.mySpan
        {
            position:       relative;
            top:            -3px;
            margin-left:    540px;
        }
        span.mySpan span
        {
            position:       relative;
            top:            -2px;
        }
    ]]></>).toString () );
    

    重要:

    请注意,绑定mouseout无效。也就是说,该复选框将用于暂停对话,但如果用户然后将鼠标移过然后退出,则对话将恢复,复选框将不同步。

    这很可能是因为我们无法保证我们的绑定函数在页面之前触发。

    要探索的一些可能的解决方法:

    1. 找到页面的mouseout挂钩的功能,然后在单击复选框时取消绑定并重新绑定页面的mouseout。

    2. 在会话区域上方放置一个透明覆盖层,并根据需要使用它来拦截鼠标移出事件。

    3. 事件监听器绑定顺序无疑涉及其他SO问题。搜索其他人可能如何处理类似情况。

答案 1 :(得分:1)

Brock Adams -

谢谢!在这里回复你,我可以提供一些代码。

似乎没有使用unsafewindow是问题的症结所在,但我发现我必须使用echo-item-content而不是echo-stream-body。 (见下面的代码)。不知道为什么我不能引用echo_sort_down而不是echostream1,好像后者存在,那么前者也是如此。而且我只在$(document).ready上执行它(我注意到你删除了)。但是如果只使用echostream1.before就会出现格式化问题。如果我可以访问echo-stream-state(echostream1的子),那么我可以做echo-stream-state.before,但是访问它时遇到了问题。

但无论如何,下面的代码我现在已经开始工作,会考虑你用GM_addStyle做了什么。

再次感谢。

function paused (zEvent) {
    return false;
}

function pause_click () {

    if (this.checked) {
        unsafeWindow.jQuery ("div.echo-item-content").bind ("mouseout", paused);
        unsafeWindow.jQuery ("div.echo-item-content:first").mouseover ();
    }
    else {
        unsafeWindow.jQuery ("div.echo-item-content").unbind ("mouseout", paused);
        unsafeWindow.jQuery ("div.echo-item-content:first").mouseout ();
    }
}

function add_pause_checkbox() {

  unsafeWindow.jQuery (".echo_sort_down").after("<span style='position:relative;  top:-3px; margin-left:500px;'><input  type='checkbox' name='pause_gm' id='pause_gm' value='Pause' onClick='pause_click()' /><span style='position:relative; top:-2px;'>Pause</span></span>");

  unsafeWindow.jQuery ("#pause_gm").click(pause_click);
}

unsafeWindow.jQuery (document).ready(add_pause_checkbox);