2011-06-25 243 views
9

我对Greasemonkey的世界相当陌生,而且我在徘徊如何在JavaScript中制作一个按钮。使用Greasemonkey或Tampermonkey添加JavaScript按钮?

假设我想在YouTube或Google上放一个按钮?我将如何去调用它或做它?

我很困惑,找不到任何东西。除非有与这些网站的HTML交互并将它们添加到Greasemonkey脚本的方式吗?

+2

很难相信你找不到任何东西。在互联网上必须有* dozends *的Greasemonkey教程。 – Tomalak

回答

21

好吧,这里是一个完整的剧本,增加了一个活扣,以SO问题页:

// ==UserScript== 
// @name  _Adding a live button 
// @description Adds live example button, with styling. 
// @include  http://stackoverflow.com/questions/* 
// @grant  GM_addStyle 
// ==/UserScript== 

/*--- Create a button in a container div. It will be styled and 
    positioned with CSS. 
*/ 
var zNode  = document.createElement ('div'); 
zNode.innerHTML = '<button id="myButton" type="button">' 
       + 'For Pete\'s sake, don\'t click me!</button>' 
       ; 
zNode.setAttribute ('id', 'myContainer'); 
document.body.appendChild (zNode); 

//--- Activate the newly added button. 
document.getElementById ("myButton").addEventListener (
    "click", ButtonClickAction, false 
); 

function ButtonClickAction (zEvent) { 
    /*--- For our dummy action, we'll just add a line of text to the top 
     of the screen. 
    */ 
    var zNode  = document.createElement ('p'); 
    zNode.innerHTML = 'The button was clicked.'; 
    document.getElementById ("myContainer").appendChild (zNode); 
} 

//--- Style our newly added elements using CSS. 
GM_addStyle (multilineStr (function() {/*! 
    #myContainer { 
     position:    absolute; 
     top:     0; 
     left:     0; 
     font-size:    20px; 
     background:    orange; 
     border:     3px outset black; 
     margin:     5px; 
     opacity:    0.9; 
     z-index:    1100; 
     padding:    5px 20px; 
    } 
    #myButton { 
     cursor:     pointer; 
    } 
    #myContainer p { 
     color:     red; 
     background:    white; 
    } 
*/})); 

function multilineStr (dummyFunc) { 
    var str = dummyFunc.toString(); 
    str  = str.replace (/^[^\/]+\/\*!?/, '') // Strip function() { /*! 
      .replace (/\s*\*\/\s*\}\s*$/, '') // Strip */ } 
      .replace (/\/\/.+$/gm, '') // Double-slash comments wreck CSS. Strip them. 
      ; 
    return str; 
} 




出人意料的是,这个问题不显得在SO之前就已经被这样问过了。

+4

太好了,这正是我所需要的。谢谢你的未来! – Cerberus

+0

不客气,@Cerberus! –

1

如果你问我,你可以做小了很多(与HTML5ñES6),如:

function addButton(text, onclick, cssObj) { 
    cssObj = cssObj || {position: 'absolute', bottom: '7%', left:'4%', 'z-index': 3} 
    let button = document.createElement('button'), btnStyle = button.style 
    document.body.appendChild(button) 
    button.innerHTML = text 
    button.onclick = onclick 
    btnStyle.position = 'absolute' 
    Object.keys(cssObj).forEach(key => btnStyle[key] = cssObj[key]) 
    return button 
} 

示例脚本(用于选择在谷歌的收件箱中的所有阅读电子邮件):

// ==UserScript== 
// @name  mark unread 
// @namespace all 
// @include  https://inbox.google.com/* 
// @version  1 
// @grant  none 
// ==/UserScript== 

(function(){ 
    'use strict' 

    window.addEventListener('load',() => { 
    addButton('select read', selectReadFn) 
    }) 

    function addButton(text, onclick, cssObj) { 
     cssObj = cssObj || {position: 'absolute', bottom: '7%', left:'4%', 'z-index': 3} 
     let button = document.createElement('button'), btnStyle = button.style 
     document.body.appendChild(button) 
     button.innerHTML = text 
     button.onclick = onclick 
     Object.keys(cssObj).forEach(key => btnStyle[key] = cssObj[key]) 
     return button 
    } 

    function selectReadFn() { 
     [...document.getElementsByClassName('MN')].filter(isRead).forEach(element => element.click()) 
    } 

    function isRead(element) { 
     childs = element.parentElement.parentElement.parentElement.getElementsByClassName('G3') 
     return ![...childs].some(e => e.innerText.search(/unread/i)!==-1) 
    } 

}())