n2day
小狐狸
小狐狸
  • UID54431
  • 注册日期2016-07-22
  • 最后登录2019-04-24
  • 发帖数16
  • 经验28枚
  • 威望0点
  • 贡献值6点
  • 好评度2点
  • 社区居民
  • 忠实会员
阅读:227回复:2

FF 66.0.2下BMMultiColumn.uc失效求修复

楼主#
更多 发布于:2019-04-04 18:05
BMMultiColumn.uc脚本可以实现书签菜单自动分列显示(先上下后左右),很喜欢的一个脚本,FF 66.0.2下失效求修复,代码如下:


// ==UserScript==
// @name           BMMultiColumn.uc.js
// @description    书签菜单自动分列显示(先上下后左右)
// @author         ding
// @include        main
// @version        2018.2.3.1
// @startup        window.BMMultiColumn.init();
// @shutdown       window.BMMultiColumn.destroy();
// @note           适配Firefox57+
// ==/UserScript==

location == "chrome://browser/content/browser.xul" && (function () {
    if (window.BMMultiColumn) {
        window.BMMultiColumn.destroy();
        delete window.BMMultiColumn;
    }

    var BMMultiColumn = {
        cachedMenus: [],
        init: function () {
            $('PlacesToolbarItems').addEventListener('popupshowing', this, false);
            var pop = $('BMB_bookmarksPopup');
            if (pop) {
                pop.addEventListener('popupshowing', this, false);
                pop.addEventListener('click', this, false);
            }
        },
        destroy: function () {
            $('PlacesToolbarItems').removeEventListener('popupshowing', this, false);
            var pop = $('BMB_bookmarksPopup');
            if (pop) {
                pop.removeEventListener('popupshowing', this, false);
                pop.removeEventListener('click', this, false);
            }

            var i = 0;
            for (i = 0; i < this.cachedMenus.length; i++) {
                var menu = this.cachedMenus;
                if (menu && menu._x_inited) {
                    menu._x_scrollbox.width = '';
                    menu._scrollBox.style.maxHeight = "";
                    menu.style.maxWidth = "";

                    var container = menu._x_box;
                    if(container){
                        container.style.minHeight = "";
                        container.style.height = "";
                        container.style.display = "";
                        container.style.flexFlow = "";
                        container.style.overflow = "";
                    }

                    delete menu._x_scrollbox;
                    delete menu._x_inited;
                    delete menu._x_box;
                }
            }
            this.cachedMenus = [];
        },
        handleEvent: function (event) {
            var menupopup;
            if (event.target.tagName == 'menu') {
                menupopup = event.target.menupopup;
            } else if (event.target.tagName == 'menupopup') {
                menupopup = event.target;
            } else return;
            if (!menupopup) return;
            //没有初始化或换过位置,重新设置属性
            if (!menupopup.firstChild) return;

            if (!menupopup._x_inited || !menupopup._x_scrollbox.scrollWidth) {
                var scrollbox = menupopup._scrollBox._scrollbox;

                var firstMenu = menupopup.firstChild;
                while (firstMenu) {
                    if (firstMenu.tagName == "menuitem") break;
                    firstMenu = firstMenu.nextSibling;
                }

                var box = firstMenu.boxObject.parentBox;

                if (box) {
                    menupopup._x_box = box;
                    menupopup._x_scrollbox = scrollbox;
                    if (!menupopup._x_inited) {
                        menupopup._x_inited = true;
                        this.cachedMenus.push(menupopup);
                    }
                }
                var container = menupopup._x_box;
                if(container){
                    container.style.minHeight = "21px";
                    container.style.height = "auto";
                    container.style.display = "inline-flex";
                    container.style.flexFlow = "column wrap";
                    container.style.overflow = "-moz-hidden-unscrollable";
                    menupopup._scrollBox.style.maxHeight = "calc(100vh - 129px)";
                }
                menupopup.style.maxWidth = "calc(100vw - 20px)";
            }
            if (menupopup._x_inited) {

                if (!(menupopup._x_scrollbox.width == menupopup._x_box.scrollWidth)) menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                //弹出菜单点击bug,要计算两次
                if (event.type == "click") {
                    if (!(menupopup._x_scrollbox.width == menupopup._x_box.scrollWidth)) menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                }
                //如果菜单数量或者文字宽度发生变化,可能会多出空区域,重新计算下
                var menuitem = menupopup.lastChild;
                while (menuitem) {
                    if (!menuitem.style.maxWidth) {
                        menuitem.style.maxWidth = "300px";
                        menuitem.style.minWidth = "100px";
                    }
                    menuitem = menuitem.previousSibling;
                }

                var lastmenu = menupopup.lastChild;
                while (lastmenu) {
                    if (lastmenu.scrollWidth >= 90) break;
                    lastmenu = lastmenu.previousSibling;
                }

                if (lastmenu && lastmenu.scrollWidth >= 90) {
                    var pos1 = lastmenu.boxObject.x - 0 + lastmenu.boxObject.width;
                    var pos2 = menupopup._x_box.boxObject.x - 0 + menupopup._x_box.boxObject.width;
                    if (pos2 - pos1 > 30) {
                        menupopup._x_scrollbox.width = "";
                        menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                    }
                }
            }
        }
    }
    BMMultiColumn.init();
    window.BMMultiColumn = BMMultiColumn;

    function $(id) {
        return document.getElementById(id);
    }
})();


先行谢过!
zhouhuajdsh
小狐狸
小狐狸
  • UID49842
  • 注册日期2015-04-27
  • 最后登录2019-04-23
  • 发帖数5
  • 经验5枚
  • 威望0点
  • 贡献值0点
  • 好评度0点
1楼#
发布于:2019-04-07 23:14
// ==UserScript==
// @name           BMMultiColumn.uc.js
// @description    书签菜单自动分列显示(先上下后左右)
// @author         ding
// @include        main
// @version        2018.2.3.1
// @startup        window.BMMultiColumn.init();
// @shutdown       window.BMMultiColumn.destroy();
// @note           适配Firefox57+
// ==/UserScript== 
 
location == "chrome://browser/content/browser.xul" && (function () {
    if (window.BMMultiColumn) {
        window.BMMultiColumn.destroy();
        delete window.BMMultiColumn;
    }
 
    var BMMultiColumn = {
        cachedMenus: [],
        init: function () {
            $('PlacesToolbarItems').addEventListener('popupshowing', this, false);
            var pop = $('BMB_bookmarksPopup');
            if (pop) {
                pop.addEventListener('popupshowing', this, false);
                pop.addEventListener('click', this, false);
            }
        },
        destroy: function () {
            $('PlacesToolbarItems').removeEventListener('popupshowing', this, false);
            var pop = $('BMB_bookmarksPopup');
            if (pop) {
                pop.removeEventListener('popupshowing', this, false);
                pop.removeEventListener('click', this, false);
            }
 
            var i = 0;
            for (i = 0; i &lt; this.cachedMenus.length; i++) {
                var menu = this.cachedMenus[i];
                if (menu && menu._x_inited) {
                    menu._x_scrollbox.width = '';
                    menu._scrollBox.style.maxHeight = "";
                    menu.style.maxWidth = "";
 
                    var container = menu._x_box;
                    if(container){
                        container.style.minHeight = "";
                        container.style.height = "";
                        container.style.display = "";
                        container.style.flexFlow = "";
                        container.style.overflow = "";
                    }
 
                    delete menu._x_scrollbox;
                    delete menu._x_inited;
                    delete menu._x_box;
                }
            }
            this.cachedMenus = [];
        },
        handleEvent: function (event) {
            var menupopup;
            if (event.target.tagName == 'menu') {
                menupopup = event.target.menupopup;
            } else if (event.target.tagName == 'menupopup') {
                menupopup = event.target;
            } else return;
            if (!menupopup) return;
            //没有初始化或换过位置,重新设置属性
            if (!menupopup.firstChild) return;
 
            if (!menupopup._x_inited || !menupopup._x_scrollbox.scrollWidth) {
                var scrollbox = menupopup._scrollBox;
 
                var firstMenu = menupopup.firstChild;
                while (firstMenu) {
                    if (firstMenu.tagName == "menuitem") break;
                    firstMenu = firstMenu.nextSibling;
                }
 
                var box = firstMenu.boxObject.parentBox;
 
                if (box) {
                    menupopup._x_box = box;
                    menupopup._x_scrollbox = scrollbox;
                    if (!menupopup._x_inited) {
                        menupopup._x_inited = true;
                        this.cachedMenus.push(menupopup);
                    }
                }
                var container = menupopup._x_box;
                if(container){
                    container.style.minHeight = "21px";
                    container.style.height = "auto";
                    container.style.display = "inline-flex";
                    container.style.flexFlow = "column wrap";
                    //container.style.overflow = "auto";
                    container.style.overflow = "-moz-hidden-unscrollable";
                    menupopup._scrollBox.style.maxHeight = "calc(100vh - 15px)";
                }
                menupopup.style.maxWidth = "calc(100vw - 20px)";
            }
            if (menupopup._x_inited) {
 
                if (!(menupopup._x_scrollbox.width == menupopup._x_box.scrollWidth)) menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                //弹出菜单点击bug,要计算两次
                if (event.type == "click") {
                    if (!(menupopup._x_scrollbox.width == menupopup._x_box.scrollWidth)) menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                }
                //如果菜单数量或者文字宽度发生变化,可能会多出空区域,重新计算下
                var menuitem = menupopup.lastChild;
                while (menuitem) {
                    if (!menuitem.style.maxWidth) {
                        menuitem.style.maxWidth = "280px";
                        menuitem.style.minWidth = "100px";
                    }
                    menuitem = menuitem.previousSibling;
                }
 
                var lastmenu = menupopup.lastChild;
                while (lastmenu) {
                    if (lastmenu.scrollWidth &gt;= 90) break;
                    lastmenu = lastmenu.previousSibling;
                }
 
                if (lastmenu && lastmenu.scrollWidth &gt;= 90) {
                    var pos1 = lastmenu.boxObject.x - 0 + lastmenu.boxObject.width;
                    var pos2 = menupopup._x_box.boxObject.x - 0 + menupopup._x_box.boxObject.width;
                    if (pos2 - pos1 &gt; 30) {
                        menupopup._x_scrollbox.width = "";
                        menupopup._x_scrollbox.width = menupopup._x_box.scrollWidth;
                    }
                }
            }
        }
    }
    BMMultiColumn.init();
    window.BMMultiColumn = BMMultiColumn;
 
    function $(id) {
        return document.getElementById(id);
    }
})();

我正在用的66.02正常

KF的原作者已经更新过脚本了,你可以去他网盘看看。
n2day
小狐狸
小狐狸
  • UID54431
  • 注册日期2016-07-22
  • 最后登录2019-04-24
  • 发帖数16
  • 经验28枚
  • 威望0点
  • 贡献值6点
  • 好评度2点
  • 社区居民
  • 忠实会员
2楼#
发布于:2019-04-08 11:58
zhouhuajdsh:// ==UserScript==
// @name           BMMultiColumn.uc.js
// @description    书签菜单自动分列显示(先上下后左右)
// @author         din...
回到原帖
网盘确实更新了,感谢告知!
游客

返回顶部