|
阅读:5807回复:6
改进zAutoPopup.uc.js
下面的代码在29能正常工作,但有三点遗憾,不知能否改进:
1、对 Adblock Edge 无效。 2、对前进后退按钮无效。 2、对三条杠内的扩展下拉菜单无效。 // ==UserScript==
// <a href="home.php?mod=space&uid=467097">@Name</a> zAutoPopup.uc.js
// @description Auto popup menulist/menupopup
// @compatibility Firefox 2.0+
// <a href="home.php?mod=space&uid=321866">@author</a> GOLF-AT
// <a href="home.php?mod=space&uid=570682">@version</a> 2.0.0.20131119
(function() {
var PopElt = null; var DropElt = null;
var PopTimer = null; var HideTimer = null;
var AlwaysPop = false; var nDelay = 200;
function IsNewMenuBtn(elt) {
try {
return elt.id=='PanelUI-menu-button';
}catch(e) {
return false;
}
}
function AutoPopup()
{
PopTimer = null;
if (DropElt) {
if (DropElt.localName=='dropmarker' ||
IsNewMenuBtn(DropElt))
PopElt = DropElt;
else {
var v = null;
try {
v = DropElt.ownerDocument.
getAnonymousNodes(DropElt);
}catch(ex) {}
if (v!=null && v.length!=0 && v[0].
localName=='menupopup')
PopElt = v[0];
else
PopElt = DropElt.childNodes[0];
}
if (IsNewMenuBtn(PopElt)) {
PanelUI.show(); return;
}
try {
PopElt.showPopup(PopElt.parentNode,
-1, -1, 'popup', 'bottomleft',
'topleft');
}catch(e) { PopElt = null; }
}
}
function HidePopup()
{
try {
if (PopElt.localName=='dropmarker')
PopElt.parentNode.closePopup();
else if (IsNewMenuBtn(PopElt))
PanelUI.hide();
else
PopElt.hidePopup();
}catch(e) {}
HideTimer = null; DropElt = null;
PopElt = null;
}
function MouseOver(e)
{
if (!AlwaysPop && !document.hasFocus())
return;
if (IsButton(e.target)) {
type = e.target.getAttribute('type');
if (type == 'menu-button') {
if (e.originalTarget!=e.target)
return;
}
/*else {
if (type != 'menu') return;
}*/
}
if (HideTimer) {
window.clearTimeout(HideTimer);
HideTimer = null;
}
try {
if ('PopupAutoComplete'==e.target.id.
substr(0,17))
return;
for(var elt=e.target; elt!=null; elt=
elt.parentNode) {
if (elt.localName=='popup' || elt.
localName=='menupopup')
return;
}
}catch(ex) {}
if (IsNewMenuBtn(PopElt)) {
if (e.target != PopElt) HidePopup();
}
else if (PopElt != null) {
if (DropElt!=null && e.target==DropElt)
return;
try {
if (PopElt.localName != 'dropmarker'
) {
for(var elt=e.target; elt!=null;
elt=elt.parentNode) {
if (elt == PopElt) return;
}
}
}catch(ex) {}
HidePopup();
}
DropElt = e.target;
PopTimer = setTimeout(AutoPopup, nDelay);
}
function MouseOut(e)
{
if (PopTimer) {
window.clearTimeout(PopTimer);
PopTimer = null;
}
if (!HideTimer && PopElt && !IsNewMenuBtn(e.
target))
HideTimer = window.setTimeout(HidePopup,
500);
}
function IsButton(elt) {
try {
return elt.localName=='toolbarbutton' || elt
.localName=='button';
}catch(e) { return false; }
}
function IsMenuButton(elt) {
if (IsNewMenuBtn(elt)) return true;
if (!IsButton(elt)) return false;
for(var i=0; i<2; i++) {
try {
var nodes = i==0x01 ? elt.childNodes : elt.
ownerDocument.getAnonymousNodes(elt);
if (nodes!=null && nodes.length && nodes[0]
.localName=='menupopup')
return true;
}catch(e) {}
}
return false;
}
function EnumElement(elt) {
try {
if (elt.localName == 'prefpane') {
elt.addEventListener('paneload', function(e) {
setTimeout(function() { EnumElement(e.
target); }, 100);
}, false);
}
else if(elt.id=='sidebar' && !elt.hasAttribute(
'AutoPopup')) {
elt.setAttribute('AutoPopup', true)
elt.addEventListener('SidebarFocused',
function(e) { EnumElement(elt); }, false);
}
else if(elt.id == 'editBookmarkPanel')
return;
}catch(e) {}
for(var i=0; i<2; i++) {
var nodes = null;
try {
if (elt.localName == 'browser') {
i = 1;
nodes = elt.contentDocument.childNodes;
}
else
nodes = i==0x01 ? elt.childNodes : elt.
ownerDocument.getAnonymousNodes(elt);
}catch(e) { nodes = null; }
if (nodes == null) continue;
for(var n=0; n<nodes.length; n++) {
try {
var node = nodes[n];
if ('PopupAutoComplete'==node.getAttribute(
'id').substr(0,17) || 'menupopup'==node
.localName || node.localName=='popup')
;
else if (node.localName != 'dropmarker') {
if (node.localName=='menu' && 'menubar'
==node.parentNode.localName)
;
else if(!IsMenuButton(node))
node = null;
}
else if(node.getAttribute('type')=='menu') {
node = node.parentNode;
if (!node.firstChild || node.firstChild.
localName!='menupopup')
continue;
}
if (node == null) {
EnumElement(nodes[n]); continue;
}
if (node.hasAttribute('command')) continue;
node.addEventListener('mouseout', MouseOut,
false);
node.addEventListener('mouseover',MouseOver,
false);
}catch(e) {}
}
}
}
setTimeout(function() { EnumElement(document); }, 100);
})();
(function () {
var stylishBtn = document.getElementById("stylish-toolbar-button");
if (!stylishBtn) return;
var menupopup = document.getElementById("stylish-popup");
if (!menupopup) return;
stylishBtn.setAttribute("popup", "");//取消原来的下拉菜单
stylishBtn.insertBefore(menupopup, stylishBtn.firstChild);
})();
(function() {
var GMBtn = document.getElementById("greasemonkey-tbb");
if (!GMBtn) return;
var GMMenupopup = GMBtn.firstChild;
if (!GMMenupopup) return;
var GMEnable = document.getElementById("gm_toggle_enabled");
if (!GMEnable) return;
var GMCheck = document.getElementById("gm_toggle_checked");
GMMenupopup.setAttribute("id","greasemonkey-popup");//
GMEnable.removeAttribute("oncommand");
GMEnable.setAttribute("oncommand","GM_util.setEnabled(!GM_util.getEnabled());GMsetIconStatus(event);");//
GMCheck.removeAttribute("oncommand");
GMCheck.setAttribute("oncommand","GM_util.setEnabled(!GM_util.getEnabled());GMsetIconStatus(event);");//
GMBtn.removeAttribute("command");//取消按钮功能(会导致autoPopup无法自动弹出下拉菜单)
GMBtn.removeAttribute("oncommand");//取消原来按钮(奇葩的GM居然还做两遍,上面这行是为了切换图标?)
GMBtn.setAttribute("type", "menu");//按钮+右键菜单
GMBtn.setAttribute("onclick",
"GM_util.setEnabled(!GM_util.getEnabled());GMsetIconStatus(event);");//GMsetStatusDirectly(event);
GMsetIconStatus = function (event) {
if(event.button > 0) return;//left click only
GMenabled = true;
if (GMenabled == null) return;
if (!GMenabled) {GMBtn.style.opacity = '0.3';
} else {
GMBtn.removeAttribute('disabled');
GMBtn.setAttribute('style','opacity: 1.0');
}
};
})(); |
|
|
1楼#
发布于:2014-05-05 09:37
作者是 golf+at?
@GOLF-AT 一下 |
|
|
|
2楼#
发布于:2014-05-05 10:30
|
|
|
3楼#
发布于:2014-05-05 11:05
紫焰蔷薇:请问这种UC.JS脚本怎么知道它可以起什么作用,还有安装之后要怎么操作,比如按什么快捷键?小白翻了一下代码,不像stylish有/**/做备注,根本不知道它可以干嘛,搜索也是一些求助贴,没有说明。回到原帖http://g.mozest.com/thread-20276-1-1 这里有介绍怎么使用、安装。 uc脚本大家提供时候最好简单介绍一下怎么使用,方便别人。description字段里面也有描述,比如这个就是自动弹出菜单的脚本。 |
|
|
|
4楼#
发布于:2014-05-05 12:20
|
|
|
5楼#
发布于:2014-05-05 13:53
|
|
|
6楼#
发布于:2014-05-09 14:27
发现对 ABE 也无效。
|
|