Отсутствует
Можно ли сделать кнопочку для автопрокрутки на четыре стандартных прокрутки колеса. В общем если я захожу на 4pda.ru/*showtopic=* то страница прокручивается. Смотрю дайджесты на 4pda, открываю много вкладок, надоедает постоянно прокручивать.
Отсутствует
Kamui
Настройку, вроде, так просто не узнать, но можно подобрать нужное значение вручную:
Отредактировано Infocatcher (25-12-2012 10:59:27)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Что подразумевается под автоматикой?
Можно временно переключать встроенную настройку скорости прокрутки.
var progressListener = { hosts: { "4pda.ru": true }, locations: [/^https?:\/+4pda\.ru\/.*showtopic=/], isFastScroll: false, onLocationChange: function(aWebProgress, aRequest, aLocation) { var isFastScroll = false; try { var host = aLocation.host; } catch(e) { } if(host && host in this.hosts) { let loc = aLocation.spec; let regs = this.locations; for(let i = 0, l = regs.length; i < l; ++i) { if(regs[i].test(loc)) { isFastScroll = true; break; } } } if(isFastScroll != this.isFastScroll) { this.isFastScroll = isFastScroll; this.toggleFastScroll(isFastScroll); } }, toggleFastScroll: function(isFast) { //LOG("Fast scroll: " + isFast); Application.prefs.setValue("mousewheel.default.delta_multiplier_y", isFast ? 1000 : 100); } }; gBrowser.addProgressListener(progressListener); this.onDestroy = function() { gBrowser.removeProgressListener(progressListener); };
Отредактировано Infocatcher (25-12-2012 15:17:54)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Kamui
Тогда проще применить Greasemonkey.
Только там уже
window.scrollByLines(16);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Тогда проще применить Greasemonkey.
В общем, получилось так как надо
Собственно в код добавил window.scrollByLines(23); и include. Благодарю
Хотя нет, работает так: если вкладка активна при загрузке, то скролл происходит нормально, но если переключиться на другую вкладку и обратно, то страница прокручивается в начало, так же если вкладка загружается в фоне, при переключении на нее видно, что позиция нужная, но сразу происходит скролл в начало.
Отбой тревоги, оказалось кнопка от okkamas_knife шалила, удалил->рестарт и все нормально.
Отредактировано Kamui (25-12-2012 20:01:50)
Отсутствует
Здравствуйте !
Под FF крутится прога на JS. Есть ли возможность передачи из JS какого-либо флага сигнализирующего о завершении того или иного этапа программы(нужно для обработки виндовой аппликацией)?
В clipboard и файл нельзя. Вроде бы можно в переменную окружения(среды), но примеров я не нашел.
Отсутствует
может потому и не работала что конфликтовала с чем то?
Возможно, позже заметил что она все-таки прокручивала страницу, но пикселей на пять, а не на 300-400 которые я указывал.
Отсутствует
Вроде бы можно в переменную окружения(среды), но примеров я не нашел.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Dumby
Существует.
Для получения такого же глюка достаточно добавить любому пункту контекстного меню всплывающую подсказку через атрибут tooltiptext.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Существует.
Это хорошо, значит с лисой всё в порядке, спасибо.
Ещё такая странность:
в то-же контекстное меню addon Bookmark Favicon Changer (у меня v.1.43) добавляет свои пункты (4 шт.),
так вот их через Ctrl + Click никак не получается открыть ( открывается #document ).
Разумеется - это не жалоба, и ни что другое, но только «чисто на интерес».
Отсутствует
Шутка
Digital ClockВыделить кодКод:
custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDigital%20Clock%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAHg8AAAEAIABsBwAAFgAAACgAAAAeAAAAHgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//////9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v//////2a2//+QOgD////b/9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v///////+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////2a2//+QOgD////b/zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL/2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2////////////2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ////////////tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/tv///2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2////////////2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2//+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////////////////////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL//////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b//////////////////////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b///////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20showSec%20%3D%20true%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A/*%20dct-style%0A%0A%23digital-clock-text%20%7B%0A%09color%3A%20%23b73520%20%21important%3B%0A%09font-weight%3A%20bold%20%21important%3B%0A%0A%7D%0A%0Adct-style%20*/%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20button%20%3D%20this%3B%0Aconst%20mark%20%3D%20%22dct-style%22%3B%0Aconst%20init%20%3D%20button.getAttribute%28%22cb-init%22%29%3B%0Aconst%20style%20%3D%20init.substring%28%0A%09init.indexOf%28%22/*%20%22%20+%20mark%29%20+%203%20+%20mark.length%2C%0A%09init.lastIndexOf%28mark%20+%20%22%20*/%22%29%0A%29.replace%28/%5Cn+/g%2C%20%22%5Cn%22%29.replace%28/%5E%5Cn/%2C%20%22%22%29.replace%28/%5Cn%24/%2C%20%22%22%29%3B%0A%0Abutton.label%20%3D%20showSec%20%3F%20%2200%3A00%3A00%22%20%3A%20%2200%3A00%22%3B%0A%0Avar%20icon%20%3D%20document.getAnonymousElementByAttribute%28button%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Aicon.style.display%20%3D%20%22none%22%3B%0Avar%20text%20%3D%20document.getAnonymousElementByAttribute%28button%2C%20%22class%22%2C%20%22toolbarbutton-text%22%29%3B%0Atext.style.display%20%3D%20%22block%22%3B%0Atext.id%20%3D%20%22digital-clock-text%22%3B%0A%0Avar%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Components.interfaces.nsIStyleSheetService%29%3B%0Avar%20cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28style%29%29%3B%0Aif%20%28%21sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%20sss.loadAndRegisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%0Aconst%20format%20%3D%20showSec%20%3F%20%22%25H%3A%25M%3A%25S%22%20%3A%20%22%25H%3A%25M%22%3B%0Avar%20timer%20%3D%20Components.classes%5B%22@mozilla.org/timer%3B1%22%5D.createInstance%28Components.interfaces.nsITimer%29%3B%0Afunction%20tick%28%29%20%7B%0A%09var%20date%20%3D%20new%20Date%28%29%3B%0A//%09date.setHours%28date.getHours%28%29%20+%200%29%3B%0A%09button.label%20%3D%20date.toLocaleFormat%28format%29%3B%0A%7D%0Atimer.initWithCallback%28tick%2C%201000%2C%20timer.TYPE_REPEATING_PRECISE%29%3B%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%09if%20%28sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%0A%09%09sss.unregisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%09timer.cancel%28%29%3B%0A%7D%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Пользуюсь несколько дней и есть вопрос: так в чём же шутка? Часики как часики...
Отсутствует
так в чём же шутка?
Ироничное отношение немного помогает преодалеть ужас осознания глубины той пропасти,
которая отделяет меня от настоящих кодеров. У меня даже не получилось
отцентровать label по вертикали в пределах кнопки.
А если ты посмотришь на исходник - то увидишь, что такое круть.
function CanvasPixelPrinter(canvas) { this.init(canvas); } CanvasPixelPrinter.prototype = { canvas: null, font: null, _context: null, get context() { if (!this._context) { if (this.canvas) this._context = this.canvas.getContext("2d"); else throw("SimpleCanvas error: no canvas"); } return this._context; }, init: function(canvas, font) { if (typeof(canvas) == "string") this.canvas = document.getElementById(canvas); else this.canvas = canvas; }, putch: function(ch) { if (this.font && this.font [ch]) { var chr = this.font [ch]; var chw = chr [0]; var chh = chr [1]; var i, j, k; var line, cbit; this.context.save(); for (i = 0; i < chh; i++) { this.context.save(); this.context.translate(chw, 0); line = chr [i + 2]; for (j = 0; j < chw; j++) { this.context.translate(-1, 0); cbit = line & 1; line >>= 1; if (cbit) this.context.fillRect(0, 0, 1, 1); } this.context.restore(); this.context.translate(0, 1); } this.context.restore(); this.context.translate(chw + 1, 0); } }, print: function(str) { this.context.save(); for (var i = 0; i < str.length; i++) this.putch(str.charAt(i)); this.context.restore(); } } function DigitalClock(canvas, showSeconds) { this.showSeconds = showSeconds; this.init(canvas); } DigitalClock.prototype = { displayColor: "black", displayBackground: "-moz-dialog", displayBorderColor: "transparent", canvasBackground: "transparent", width: 33, height: 16, button: null, _showSeconds: false, set showSeconds(val) { this._showSeconds = val; if (val) this.width = 49; else this.width = 33; }, get showSeconds() { return this._showSeconds; }, font: { "0": [5, 8, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E], "1": [5, 9, 0x02, 0x06, 0x0A, 0x12, 0x02, 0x02, 0x02, 0x02], "2": [5, 9, 0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F], "3": [5, 9, 0x0E, 0x11, 0x01, 0x06, 0x01, 0x01, 0x11, 0x0E], "4": [5, 9, 0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02, 0x02], "5": [5, 9, 0x1F, 0x10, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E], "6": [5, 9, 0x0E, 0x11, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x0E], "7": [5, 9, 0x1F, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04], "8": [5, 9, 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x11, 0x0E], "9": [5, 9, 0x0E, 0x11, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E], ":": [3, 9, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00] }, init: function(canvas) { this.__super.prototype.init.apply(this, [canvas]); this.context.translate(20, 20); }, fixmod: function(str, len) { while ((str.length % len) != 0) str = "0" + str; return str; }, drawBorder: function() { this.context.save(); this.context.fillStyle = this.displayBorderColor; this.context.fillRect(0, 1, 1, this.height - 2); this.context.fillRect(1, 0, this.width - 2, 1); this.context.fillRect(this.width - 1, 1, 1, this.height - 2); this.context.fillRect(1, this.height - 1, this.width - 2, 1); this.context.restore(); }, getTimeString: function() { var date = new Date(); var h = this.fixmod(date.getHours().toString(), 2); var m = this.fixmod(date.getMinutes().toString(), 2); var res = h + ":" + m; if (this.showSeconds) { var s = this.fixmod(date.getSeconds().toString(), 2); res += ":" + s; } return res; }, tick: function() { this.context.save(); this.context.scale(1, 1); this.context.fillStyle = this.canvasBackground; this.context.fillRect(0, 0, this.width, this.height); this.context.fillStyle = this.displayBackground; this.context.fillRect(1, 1, this.width - 2, this.height - 1); this.drawBorder(); this.context.fillStyle = this.displayColor; this.context.translate(3, 4); var date = new Date(); var h = this.fixmod(date.getHours().toString(), 2); var m = this.fixmod(date.getMinutes().toString(), 2); var s = this.fixmod(date.getSeconds().toString(), 2); this.print(this.getTimeString()); this.context.restore(); this.button.setAttribute("tooltiptext", this.getTime("tooltip")); }, getTime: function(mode) { var d = new Date(); /* var p = (d.getHours() < 12) ? "AM": "PM"; var time = d.toLocaleFormat("%I:%M ") + p; var date = d.toLocaleFormat("%A, %B %d, %Y"); var res = (mode == "tooltip") ? (date + "\n" + time) : (date + " " + time); return res; */ var time = d.toLocaleFormat("%H:%M "); var date = d.toLocaleFormat("%A, %d %B %Y"); return (mode == "tooltip") ? date : (date + " " + time); }, QueryInterface: function(iid) { if (iid.equals(Components.interfaces.nsISupports) || iid.equals(Components.interfaces.nsITimerCallback)) return this; return Components.results.NS_ERROR_NO_INTERFACE; }, notify: function(oTimer) { this.tick(); }, oTimer: null, start: function() { if (this.oTimer) this.stopTimer(); this.oTimer = Components.classes ["@mozilla.org/timer;1"] .createInstance(Components.interfaces.nsITimer); this.oTimer.initWithCallback(this, 1000, 1); } } DigitalClock.prototype.__proto__ = CanvasPixelPrinter.prototype; DigitalClock.prototype.__super = CanvasPixelPrinter; this.htmlNS = "http://www.w3.org/1999/xhtml"; this.xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var canvas = this.getElementsByTagNameNS(this.htmlNS, "canvas") [0]; if (!canvas) { var canvas = document.createElementNS(this.htmlNS, "canvas"); this.clock = new DigitalClock(canvas, false); this.clock ["button"] = this; canvas.setAttribute("width", this.clock.width); canvas.setAttribute("height", this.clock.height); canvas.setAttribute("style", "width: " + (this.clock.width + 6) + "px; " + "min-width: " + this.clock.width + "px; " + "max-width: " + (this.clock.width + 6) + "px; " + "height: " + (this.clock.height + 1) + "px; " + "min-height: " + this.clock.height + "px; " + "max-height: " + (this.clock.height + 1) + "px; " + "margin: 0 .5em;"); this.image = "data:"; this.setAttribute("class", ""); canvas = this.appendChild(canvas); var pn = this.parentNode; var ns = this.nextSibling; var button = pn.removeChild(this); if (ns) pn.insertBefore(button, ns); else pn.appendChild(button); } this.clock.start(); //////////////////////////////////////////////////////////////////////////// /////////////////////////// Start Button updater /////////////////////////// /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/1.1/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * Original code is Button Updater for Custom Buttons extension * * The Initial Developer of the Original Code is LouCypher. * Portions created by the Initial Developer are Copyright (C) 2011 * the Initial Developer. All Rights Reserved. * * Contributor(s): * - LouCypher: original code * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. * * ***** END LICENSE BLOCK ***** */ this.updater = { btnClick: self.onclick, btnType: self.type, btnImage: self.image, btnTooltip: self.tooltipText, baseURL: "https://loucypher.googlecode.com/svn/custombuttons/xml/mods/", get updateURL() { return this.baseURL + encodeURIComponent(self.name.replace(/(\/|:)/g, "-")) + ".xml"; }, openUpdateURL: function updater_openUpdateURL() { switchToTabHavingURI(this.updateURL); }, get stdIcon() { var stdIcon = parseInt(self.cbStdIcon.match(/\d/)); switch (stdIcon) { case 4: return "chrome://custombuttons/skin/stdicons/bbutton.png"; case 3: return "chrome://custombuttons/skin/stdicons/gbutton.png"; case 2: return "chrome://custombuttons/skin/stdicons/rbutton.png"; default: return "chrome://custombuttons/skin/button.png"; } }, get bsyIcon() { switch (Application.id) { case "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": if (Application.version >= "4") { return "chrome://browser/skin/tabbrowser/connecting.png"; } else { return "chrome://global/skin/icons/loading_16.png"; } case "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": return "chrome://communicator/skin/icons/loading.gif"; default: return "chrome://custombuttons/skin/button.png"; } }, // Check if the URI is Custom Button URI (custombutton://...) isValidCbURI: function updater_isValidCbURI(aURL) { if (!aURL) return false; return /^custombutton\:\/\//.test(aURL); }, // Convert 'custombutton:' URI to DOM convertURItoDOM: function updater_convertURItoDOM(aURL) { if (!this.isValidCbURI(aURL)) { custombuttons.alertBox(self.name, "Not a Custom Buttons link!"); return; } var string = unescape(aURL.replace(/^custombutton\:\/\//, "").toString()); var parser = new DOMParser(); var dom = parser.parseFromString(string, "text/xml"); if (dom.documentElement.nodeName == "parsererror") { return null; } else { return dom.documentElement; } }, // Get value from XML element getParamValue: function updater_getParamValue(aDocument, aNodeName) { var node = aDocument.querySelector(aNodeName); if (!node) return ""; if (!node.firstChild || (node.firstChild && (node.firstChild.nodeType == node.TEXT_NODE))) { return node.textContent; } else { return node.firstChild.textContent; } }, // Set button parameters from XML alement getButtonParameters: function updater_getButtonParameters(aButtonLink, aURL) { var dom = this.convertURItoDOM(aURL); var params = custombuttons.cbService.getButtonParameters(aButtonLink) .wrappedJSObject; params.name = this.getParamValue(dom, "name") params.date = this.getParamValue(dom, "date") || ""; params.image = this.getParamValue(dom, "image") || this.getParamValue(dom, "stdicon"); params.code = this.getParamValue(dom, "code") params.initCode = this.getParamValue(dom, "initcode") params.help = this.getParamValue(dom, "help") params.accelkey = this.getParamValue(dom, "accelkey") params.mode = this.getParamValue(dom, "mode") params.wrappedJSObject = params; return params; }, // Reset button attribute if user click the button during update resetAttributes: function updater_resetAttributes() { self.image = this.btnImage; self.tooltipText = self.name; self.removeAttribute("busy"); self.onclick = this.btnClick; self.type = this.btnType; self.tooltipText = this.btnTooltip; }, // Check button for update checkForUpdate: function updater_checkForUpdate(aCallback) { if (!navigator.onLine) { // If browser is in offline mode // ask to switch to online var online = custombuttons.confirmBox(self.name, "Firefox is currently in offline mode.\n" + "Switch to online mode and try again?", "Yes", "No"); if (!online) return; BrowserOffline.toggleOfflineStatus(); // switch to online } var url = this.updateURL + "?" + Date.now(); var req = new XMLHttpRequest(); req.open("GET", url, true); if (self.hasAttribute("busy")) { this.resetAttributes(); return } var updater = this; req.onreadystatechange = function (aEvent) { self.onclick = function(aEvent) { aEvent.preventDefault(); req.abort(); self.updater.resetAttributes(); } self.image = updater.bsyIcon; self.setAttribute("busy", ""); self.removeAttribute("type"); self.tooltipText = "Checking for update...\nClick to abort."; if (req.readyState == 4 && req.status == 200) { updater.resetAttributes(); aCallback(req.responseXML); } } req.send(null); }, // Get update from XML getUpdate: function updater_getUpdate(aDocument) { if (aDocument.documentElement.localName != "custombutton") { custombuttons.alertBox(self.name, "Not a valid Custom Buttons XML file!"); return; } //inspectDOMDocument(aDocument); return; let icon = self.updater.btnImage ? self.updater.btnImage : self.updater.stdIcon; let button = aDocument.getElementById("button"); let link = button.getElementsByTagNameNS(xhtmlns, "a")[0]; if (link.href == self.URI) { let as = Cc['@mozilla.org/alerts-service;1']. getService(Ci.nsIAlertsService); as.showAlertNotification(icon, "No update found!", "Finish checking", false, "", null); return; } var install = custombuttons.confirmBox(self.name, "Update found! " + "Update this button?", "Yes", "No"); if (!install) return; let btnLink = custombuttons.makeButtonLink("update", self.id); let params = self.updater.getButtonParameters(btnLink, link.href); //inspectObject(params); return; custombuttons.cbService.installButton(params); custombuttons.alertBox(self.name, "Button updated!"); self.setAttribute("cb-edit-state", "active"); }, init: function updater_onLoad() { var icon = this.btnImage ? this.btnImage : this.stdIcon; function $(aId) { return document.getElementById(aId); } function addMenuItem(aNewIDs, aNodeIDs, aSeparator) { // Remove previously created menuitems if any if ($(aNewIDs)) { if (aSeparator && ($(aNewIDs).nextSibling.localName == "menuseparator")) { $(aNewIDs).parentNode.removeChild($(aNewIDs).nextSibling); } $(aNewIDs).parentNode.removeChild($(aNewIDs)); } var mi = cbu.makeXML(<menuitem xmlns={xulns} id={aNewIDs} class="menuitem-iconic" image={icon} label="Check for updates for this button" onclick={"if (event.button == 1) { " + "var btn = document.getElementById('" + self.id + "'); btn.updater.openUpdateURL(); }"} oncommand={"var btn = document.getElementById('" + self.id + "'); btn.updater.checkForUpdate(" + "btn.updater.getUpdate);"} observes="custombuttons-contextbroadcaster-primary"/>); $(aNodeIDs).parentNode.insertBefore(mi, $(aNodeIDs).nextSibling); if (aSeparator) { var sep = cbu.makeXML(<menuseparator xmlns={xulns} id={mi.id + "-separator"}/>); mi.parentNode.insertBefore(sep, mi.nextSibling); } } function initUpdaterCbPopup(aEvent) { var popupNode = "triggerNode" in aEvent.target ? aEvent.target.triggerNode : document.popupNode; $(kIDs).hidden = (popupNode != self); ($(kIDs).nextSibling.id == $(kIDs).id + "-separator") && ($(kIDs).nextSibling.hidden = (popupNode != self)); } var kIDs = self.id + "-checkForUpdate"; var uIDs = "custombuttons-contextpopup-updateButton"; // Add 'Check for Update...' menuitem to CB contextmenu addMenuItem(kIDs, uIDs, true); $(uIDs).parentNode.addEventListener("popupshowing", initUpdaterCbPopup, false); $(uIDs).parentNode.removeEventListener("popuphiding", initUpdaterCbPopup, false); self.onDestroy = function(aReason) { if (aReason != "delete") return; $(uIDs).parentNode.removeEventListener("popupshowing", initUpdaterCbPopup, false); $(kIDs).parentNode.removeChild($(kIDs + "-separator")); $(kIDs).parentNode.removeChild($(kIDs)); } } } this.updater.init(); //////////////////////////// End Button updater //////////////////////////// ////////////////////////////////////////////////////////////////////////////
Отсутствует
Это хорошо, значит с лисой всё в порядке, спасибо.
Вообще, конечно, не очень хорошо. У меня на основном профиле иногда и без всплывающих подсказок подсвечивает пункты не в том меню (у меня для :hover закладок добавляется подчеркивание и делается курсор как на ссылках).
Ещё такая странность:
в то-же контекстное меню addon Bookmark Favicon Changer (у меня v.1.43) добавляет свои пункты (4 шт.),
так вот их через Ctrl + Click никак не получается открыть ( открывается #document ).
Разумеется - это не жалоба, и ни что другое, но только «чисто на интерес».
Это из-за того, что пункты удаляются при закрытии меню.
Такие можно исследовать через Ctrl+Shift+click.
Правда, из-за блокирования всех меню/подсказок от закрытия/открытия будут разные особенности. Ну, и для отключения надо или DOM Inspector закрыть, или нажать в окне с заблокированным меню Escape.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Можно ли сделать кнопочку "BlExtRef" для блокирования внешних ссылок при загрузке страниц?
Если да, то не будет ли возникать конфликта при одновременной загрузке нескольких вкладок (например, если для одних вкладок запрашиваемые ссылки будут внешними, а для других - нет).
<html>
<head>
<link href='http://www.1.ru/1.css' rel="stylesheet" />
<meta property="og:image" content="http://www.2.ru
/2.gif" />
<script src='http://www.1.ru/1.js' type="text/javascript"></script>
<script src='http://www.2.ru
/2.js' type="text/javascript"></script>
</head>
<img src="http://www.1.ru/1.png">
<script src='http://www.1.ru/1.js' type="text/javascript"></script>
<img src="http://www.2.ru
/2.png">
<script src='http://www.3.ru
/3.js' type="text/javascript"></script>
</html>
<script src='http://www.4.ru
/4.js' type="text/javascript"></script>
При её загрузке происходит парсинг страницы и появление запросов на другие ресурсы.
При включении, кнопочка должна блокировать запросы на ресурсы, находящиеся на других сайтах (выделены).
Отсутствует
для блокирования внешних ссылок при загрузке страниц?
RequestPolicy, не?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Dumby, меня устраивает(рядом аналоговые часы Antonа)
А часики-"исходник" мне не понравились ещё ранее. И почему-то твое восхищение "исходником" напомнило мне
Отредактировано lokiju (31-12-2012 03:05:50)
Отсутствует
Infocatcher
Спасибо! Подобное искал по выражению "внешние ссылки", а надо было по "межсайтов".
Одно плохо , RequestPolicy v0.5.22 последняя, которая поддерживает Firefox 3.x. (обновить не позволяет старое медленное "железо"), а в планах разработчика и "регулярка", и "Чёрный список" .
Отсутствует
okkamas_knife
больше не запускать, то даже DVD могу смотреть
MB: Iwill BD100Plus/31311A (Nov.25.1999), i440BX - W977EF
Chipset: Intel 82443BX AGPset (Seattle) + PIIX4E
CPU: Intel Pentium III-650E (Coppermine, cB0), 650 MHz, Slot 1 SECC2
Memory: 512 MBytes @ 100 MHz
Graphics: NVidia Riva 128/128ZX, SGRAM 8 MBytes
Отсутствует
насчёт свежих версий RP - попробуй помучать install.rdf чтоб установить может заработают
Note that fixing this bug required me to use functionality only available in Gecko 2.0+. Therefore, Firefox versions below 4.0 are no longer supported. RequestPolicy 0.5.22 will be the last version that supports Firefox 3.x.
Отредактировано olDjeka (01-01-2013 13:12:03)
Отсутствует