您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add new item to top of right-click context menu to override position:fixed on elements in a page.
// ==UserScript== // @name Unfix Fixed Position Element on Firefox Context Menu // @description Add new item to top of right-click context menu to override position:fixed on elements in a page. // @author Jefferson "jscher2000" Scher // @namespace JeffersonScher // @copyright Copyright 2016 Jefferson Scher // @license BSD 3-clause // @include * // @version 0.5.1 // @grant none // ==/UserScript== // Context menu options -- Firefox only, and do not replace any existing context menu! Also, do not run in iframes if (!document.body.hasAttribute("contextmenu") && "contextMenu" in document.documentElement && (window.self == window.top)) { var cmenu = document.createElement("menu"); cmenu.id = "UFPEcontext"; cmenu.setAttribute("type", "context"); cmenu.innerHTML = '<menu id="UFPEFlyout" label="Unfix Fixed Element" ufpeundolist="">' + '<menuitem id="UFPEStatic" label="Make Static"></menuitem>' + '<menuitem id="UFPEHide" label="Hide"></menuitem>' + '<menuitem id="UFPEUnHide" label="UnHide"></menuitem>' + '</menu>'; document.body.appendChild(cmenu); document.getElementById("UFPEStatic").addEventListener("click", UFPE_doStyle, false); document.getElementById("UFPEHide").addEventListener("click", UFPE_doStyle, false); document.getElementById("UFPEUnHide").addEventListener("click", UFPE_dispUnHide, false); // attach menu and create event for filtering document.body.setAttribute("contextmenu", "UFPEcontext"); document.body.addEventListener("contextmenu", UFPE_cmenuFilter, false); } else { console.log("DIDN'T ADD CONTEXT MENU!"); } function UFPE_cmenuFilter(e){ // Mark the right-clicked element for later reference (is there an easier way?) var tgt = e.target; // Compute and store a highly unique element based on the current time var dNew = new Date(); tgt.setAttribute('unfixtime', dNew.getTime()); // Store that same time on the first context menu item for each of reference document.getElementById('UFPEFlyout').setAttribute('unfixtgt', tgt.getAttribute('unfixtime')); } function UFPE_doStyle(e){ // What is the action? var axn = e.target.id.substr(4); // Static or Hide // Find the right-clicked element using the stored timestamp -- should be unique var tgtval = document.getElementById('UFPEFlyout').getAttribute('unfixtgt'); var tgt = document.querySelector('[unfixtime="'+tgtval+'"]'); if (!tgt){ // Oh crap, something went wrong alert('Unable to find my target!'); return; } // Find the position:fixed element -- it could be the right-clicked element or an ancestor containing it while (tgt.nodeName != 'BODY') { var posval = window.getComputedStyle(tgt,null).getPropertyValue('position'); // For debugging purposes // console.log('tgt.nodeName='+tgt.nodeName+' has '+posval); if (posval=='fixed' || (posval=='static' && tgt.hasAttribute('ufpestatic') && axn=='Hide')){ // This is the nearest ancestor with position:fixed switch (axn){ case 'Static': // Set position:static and store a timestamp for reference tgt.style.position = 'static'; tgt.setAttribute('ufpestatic', tgtval); return; case 'Hide': // Set a timestamp for reference and add it to the undo list tgt.setAttribute('ufpehidden', tgtval); tgt.setAttribute('ufpedisplay', window.getComputedStyle(tgt,null).getPropertyValue('display')); var hidden = document.getElementById('UFPEFlyout').getAttribute('ufpeundolist'); if (hidden.length === 0) hidden = tgtval; else hidden += ',' + tgtval; document.getElementById('UFPEFlyout').setAttribute('ufpeundolist', hidden); // Set display:none to hide the element tgt.style.display = 'none'; return; } console.log('Value for axn is corrupted!'); break; } else { // Check the next higher ancestor tgt = tgt.parentNode; } } } function UFPE_dispUnHide(e){ // Retrieve undo list var hidden = document.getElementById('UFPEFlyout').getAttribute('ufpeundolist'); if (hidden.length === 0){ alert('Nothing is hidden right now'); return; } // Split off the last timestamp in the list var cpos = hidden.lastIndexOf(','); if (cpos === -1){ tgtval = hidden; hidden = ''; } else { tgtval = hidden.substr(cpos+1); hidden = hidden.substr(0, cpos); } // Update the undo list document.getElementById('UFPEFlyout').setAttribute('ufpeundolist', hidden); // Seek the hidden element var tgt = document.querySelector('[ufpehidden="'+tgtval+'"]'); if (!tgt){ // Oh crap, something went wrong alert('The hidden item seems to be gone. Maybe try again?'); return; } else { // Restore the previous value of the display property tgt.style.display = tgt.getAttribute('ufpedisplay'); } }