【问题标题】:A little help with DOM manip and GreaseMonkeyDOM manip 和 GreaseMonkey 的一点帮助
【发布时间】:2010-09-26 18:34:11
【问题描述】:

我不是 JS 人,所以我有点在黑暗中磕磕绊绊。基本上,我想要的东西可以添加一个链接到 Twitter 搜索 @replies 到特定用户,同时在那个人的页面上。

我想弄清楚两件事:

  1. 如何从页面中提取用户名,以便构建正确的 URL。 IE。如果我在 http://twitter.com/ev 上,我应该让“ev”回来。
  2. 如何操作 DOM 以在正确的位置插入内容

这是我要定位的 HTML 片段:

<ul id="tabMenu">
  <li>
    <a href="/ev" id="updates_tab">Updates</a>  </li>
  <li>
    <a href="/ev/favourites" id="favorites_tab">Favorites</a>  </li>
  </ul>

这是脚本(到目前为止):

// ==UserScript==
// @name         Twitter Replies Search
// @namespace    http://jauderho.com/
// @description  Find all the replies for a particular user
// @include      http://twitter.com/*
// @include      https://twitter.com/*
// @exclude      http://twitter.com/home
// @exclude      https://twitter.com/home
// @author       Jauder Ho
// ==/UserScript==

var menuNode = document.getElementById('tabMenu');
if (typeof(menuNode) != "undefined" && menuNode != null)
{
    var html = [];
    html[html.length] = '<li>';
    html[html.length] = '<a href="http://search.twitter.com/search?q=to:ev" class="section-links" id="replies_search_tab">@Replies Search</a>';
    html[html.length] = '</li>';

    // this is obviously wrong
        var div = document.createElement('div');
    div.className = 'section last';
    div.innerHTML = html.join('');
    followingNode = menuNode.parentNode;
    followingNode.parentNode.insertBefore(div, followingNode);
}

【问题讨论】:

    标签: javascript twitter greasemonkey


    【解决方案1】:

    这是上面的一个纯 DOM 方法——为了好玩,我也提取了用户名:

    var menuNode = document.getElementById('tabMenu');
    if (menuNode!=null)
    {
        // extract username from URL; matches /ev and /ev/favourites
        var username = document.location.pathname.split("/")[1];
    
        // create the link
        var link = document.createElement('a');
        link.setAttribute('href', 'http://search.twitter.com/search?q=to:'+username);
        link.setAttribute('id', 'replies_search_tab');
        link.appendChild(document.createTextNode('@Replies Search'));
    
        // create the list element
        var li = document.createElement('li');
    
        // add link to the proper location
        li.appendChild(link);
        menuNode.appendChild(li);    
    }
    

    这相当于(基于原代码sn-p):

      <ul id="tabMenu">
      <li>
        <a href="/ev" id="updates_tab">Updates</a>  </li>
      <li>
        <a href="/ev/favourites" id="favorites_tab">Favorites</a>  </li>
      <li>
        <a href="http://search.twitter.com/search?q=to:ev" id="replies_search_tab">@Replies Search</a></li>
      </ul>
    

    如果您希望添加的链接显示在不同的位置,则需要使用insertBefore 进行一些操作。

    附言。冒昧地忽略了“section-links”类,因为这是 x 关注、y 关注、z 更新链接的格式。

    【讨论】:

      【解决方案2】:

      这是一种方法,未​​经实际测试(没有 Twitter 帐户)。

      var userName = window.location.href.match(/^http:\/\/twitter\.com\/(\w+)/)
      if (userName == null)
        return; // Problem?
      userName = userName[1];
      var menuNode = document.getElementById('tabMenu');
      if (menuNode != null)
      {
        var html = '<a href="http://search.twitter.com/search?q=to:' +
            userName +
            '" class="section-links" id="replies_search_tab">@Replies Search</a>';
      
        var li = document.createElement('li');
        li.className = 'section last';
        li.innerHTML = html;
        menuNode.appendChild(li);
      }
      

      它将 li 添加到末尾,我删除了 div,因为我怀疑将 li 放在 div 中是否正确。如果你真的需要把li放在ul的开头,试试menuNode.insertBefore(li, menuNode.firstChild)

      【讨论】:

        【解决方案3】:

        在没有库的情况下编写 JavaScript 是我永远无法回到的地狱。

        这是一个启用 jQuery 的脚本框架:

        // ==UserScript==
        // @name           MyScript
        // @namespace      http://example.com
        // @description    Example
        // @include        *
        //
        // @require     http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js
        // ==/UserScript==
        
        var menuNode = $('#tabMenu');
        if (menuNode!=null)
        {
            // extract username from URL; matches /ev and /ev/favourites
            var username = document.location.pathname.split("/")[1];
        
            // create the link
            var link = $('<a id="replies_search_tab">@Replies Search</a>');
            link.href = 'http://search.twitter.com/search?q=to:'+username;
        
            // create the list element
            var li = $('<li />');
        
            // add link to the proper location
            li.append(link);
            menuNode.append(li);    
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-20
          • 1970-01-01
          • 2021-05-16
          • 1970-01-01
          相关资源
          最近更新 更多