rbfyec
А, я что-то подумал, нужно сделать задержку перед началом прокрутки.
Вроде работает. Или не то?
А какой тогда еще критерий применять? Раз работает, значит то.
Ну, и смотря чей это документ. Если чужой, то лучше через addEventListener/removeEventListener:
window.addEventListener("wheel", function onWheel(e) { // ... setTimeout(function() { window.removeEventListener("wheel", onWheel, false); }, 1000); }, false);
И, по идее, для удаления лучше делать document.onwheel = null (я, впрочем, не уверен, есть ли на это дело документация).
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Люди, помогите решить такую задачу (если возможно). Просто достало уже дальше некуда...
После январского обновления AdBlock Plus регулярно начала пропадать его иконка (кнопка) с панели дополнений. С чем связано, выяснить не удалось. Такая проблема встречается и у других людей. Ответа по данному вопросу в теме адблока я не получил. Возвращаться на последнюю рабочую версию 2.4 не вариант. Решил побороть эту напасть кардинально.
Отсутствует
именно так по аналогии и смотрел!
я не настолько глуп, чтобы вначале не пересмотреть все похожие настройки...
за 4 года на форуме чему-то смог научится, тем более как использовать CB для работы с about:config
здесь же нужно копнуть поглубже, может как-то отследить эту галку через dom inspector
так что теоретические усилия я прикладываю, а вот в практических прошу помощи
Отсутствует
Поэтому, помогите реализовать следующую задумку: после старта браузера, можно даже не проверяя текущее состояние этой галки, устанавливать ее в состояние "включено".
Для этого придется открывать страницу настроек, потому что это не настройка, а состояние панели инструментов.
Можно вот такое попробовать:
setTimeout(function() { var abpURL = Components.classes["@adblockplus.org/abp/public;1"] .getService(Components.interfaces.nsIURI); var global = Components.utils.import(abpURL.spec, {}); var UI = global.require("ui").UI; if(!UI.isToolbarIconVisible()) UI.toggleToolbarIcon(); }, 0);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Вопрос знающим людям как получить адрес иконки сайта через new XMLHttpRequest()
var xhr = new XMLHttpRequest(); xhr.open("GET", "http://forum.mozilla-russia.org/", true); xhr.onreadystatechange = function() { var data = xhr.responseText; LOG(data) }; xhr.send();
Отсутствует
Спасибо. Да LINK и shortcut icon указывают на иконку сайа но почему на https://forum.mozilla-russia.org/ я их не нахожу. Мистика
Отредактировано bunda1 (07-06-2014 23:10:34)
Отсутствует
ну он обычно стандартный http://site.ru/favicon.ico
если в ответ прилетает 404 то придется загрузить страницу и посмотреть там
Так не пойдет, в корне сайта может лежать что угодно, тогда как браузер покажет иконку из <link rel="icon" ...
И сперва есть смысл проверить, нет ли иконки в кэше (но если страница не была открыта ранее, то иконки не будет ):
https://developer.mozilla.org/en-US/doc … Page%28%29
//var faviconService = Components.classes["@mozilla.org/browser/favicon-service;1"] // .getService(Components.interfaces.mozIAsyncFavicons); var faviconService = PlacesUtils.favicons; var pageURI = content.document.documentURIObject; faviconService.getFaviconURLForPage(pageURI, { onComplete: function(uri, dataLen, data, mimeType) { alert(uri && uri.spec); } });
(это для текущей вкладки; для приватных окон, кстати, не работает, хотя в атрибуте image вкладки все есть)
И вот какой-то пример с загрузкой страницы:
var xhr = new XMLHttpRequest(); xhr.open("GET", "https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest", true); xhr.responseType = "document"; xhr.onload = xhr.onerror = function() { var doc = xhr.responseXML; if(!doc) { alert("Error!\nStatus: " + xhr.status + " " + xhr.statusText); return; } var links = doc.getElementsByTagName("link"); for(var i = 0, l = links.length; i < l; ++i) { var link = links[i]; if(/(?:^|\s)icon(?:\s|$)/.test(link.getAttribute("rel"))) { alert(link.href); return; } } alert("<link> not found, /favicon.ico ?"); }; xhr.send();
Но иконку можно еще скриптом задавать (вот пример)...
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Вот спасибо, это то что нужно, хочу сделать код который восстанавливает иконки у закладок без загрузки вкладок. Там где new XMLHttpRequest(); не сработает буду использовать как адрес иконки "http://www.google.com/s2/u/0/favicons?domain=" + domain; или 'http://favicon.yandex.net/favicon/' + domain; хотя тут могут быть проблемы, я не знаю как браузер к этому отнесётся
Отредактировано bunda1 (07-06-2014 23:56:44)
Отсутствует
И есть готовое решение FavIcon Reloader. Можно в нём посмотреть, как реализовано.
Отсутствует
1 достаточно открыть одну страницу с домена чтоб все остальные иконки с того же домена восстановились
Интересно, на FF24 такое не наблюдаю. Конечно особого смысла в таком коде мало но иногда он нужен.
И есть готовое решение FavIcon Reloader. Можно в нём посмотреть, как реализовано.
Спасибо
Отсутствует
Вопрос знающим людям
Как отсортировать массив объектов placesList по свойству uri так что бы объекты с одинаковыми доменами uri.split(/\/+/g)[1] были по группам в массиве, а эти группы были отсортированы по свойству title в алфавитном порядке placesList.sort(function(a, b) a.title.localeCompare(b.title, {sensitivity: "base"}));
Мучаюсь с этим уже который час и не могу придумать решение
Отсутствует
да там нюанс есть если ты удаляешь элемент z то в следующей итерации i должно остаться темже т.к. элементы сдвинутся и z = z[i+1] из прошлой итерации вобщем увеличивай счетчик только когда не удаляешь элемент.
Странно, но почему:
placesList.forEach(function(node, i) { if (PlacesUtils.nodeIsFolder(node)) { placesList.splice(i,1) } });
удаляет не все папки из массива. Проблема в .splice(i,1)
Отредактировано bunda1 (08-06-2014 14:26:46)
Отсутствует
Упс, проблема в том при вызове splice массив уменьшается и удаляется текущий, i-й элемент, и на место сдвигаюется новый, непроверенный элемент, которого цикл уже не проверит. Надо уменшить i после вызова splice
for ( i = 0; i < placesList.length; ++i ) { if ( PlacesUtils.nodeIsFolder(placesList[i]) ) { placesList.splice(i, 1); i--; } } alert(placesList.length);
Добавлено 08-06-2014 15:31:44
именно поэтому я и написал про while тк со слайсом forEach будет некорректен.
да while но for привычней.
Добавлено 08-06-2014 15:42:27
Ну а далше:
var item = placesList[0]; for ( var array = [], i = 0; i < placesList.length; i++ ) { if ( item.uri.split(/\/+/g)[1] == placesList[i].uri.split(/\/+/g)[1] ) { array.push( placesList[i] ); placesList.splice(i, 1); i--; } } alert(array.map(function(item) item.uri ).join("\n")); // проверка
Теперь надо придумать как заново вызвать цикл и объединить массивы.
Отредактировано bunda1 (08-06-2014 15:42:27)
Отсутствует
Может кому надо:
// Добавить новый пункт "Сортировать по домену и названию" в меню папок закладок, от 08.06.2014. ................................ (function() { var menuitem = document.createElement("menuitem"); menuitem.id = "placesContext_sortBy:locationAndName"; menuitem.setAttribute("label", "Сортировать по домену и названию"); menuitem.setAttribute("selection", "folder"); menuitem.setAttribute("closemenu", "single"); menuitem.setAttribute("oncommand", "this.run(document);"); // если клик или команда на пункте меню menuitem.run = function(doc) { // создать массив с пунктами меню папки закладок var view = PlacesUIUtils.getViewForNode( doc.popupNode ); var folderId = view.selectedNode.itemId; var contents = PlacesUtils.getFolderContents( folderId, false, false ).root; for ( var placesList = [], i = 0; i < contents.childCount; ++i ) { placesList.push( contents.getChild(i) ); } // удалить разделители из меню закладок и массива for ( i = 0; i < placesList.length; i++ ) { if ( PlacesUtils.nodeIsSeparator(placesList[i]) ) { PlacesUtils.bookmarks.removeItem( placesList[i].itemId ); placesList.splice(i, 1); i--; } } // создать новый массив, добавить туда отсортированные по алфавиту папки и удалить папки из массива var newPlacesList = placesList.filter(function(node) { return PlacesUtils.nodeIsFolder(node) }); newPlacesList.sort(function(a, b) a.title.localeCompare(b.title, {sensitivity: "base"})); for ( i = 0; i < placesList.length; i++ ) { if ( PlacesUtils.nodeIsFolder( placesList[i] ) ) { placesList.splice(i, 1); i--; } } // добавить в новый массив отсортированные по алфавиту группы закладок по доменами и удалить всё из массива function sortForDomain() { try { var host = placesList[0].uri.split(/\/+/g)[1] } catch(e) { return; }; for ( var array = [], i = 0; i < placesList.length; i++ ) { if ( placesList[i].uri.split(/\/+/g)[1] == host ) { array.push( placesList[i] ); placesList.splice(i, 1); i--; } } array.sort(function(a, b) a.title.localeCompare(b.title, {sensitivity: "base"})); newPlacesList = newPlacesList.concat( array ); if ( placesList.length > 0 ) sortForDomain(); }; sortForDomain(); // изменить меню закладок в соответствии с новым отсортированным массивом let callback = { runBatched: function() { for( let i = 0; i < newPlacesList.length; ++i) { PlacesUtils.bookmarks.setItemIndex( newPlacesList[i].itemId, i ); } } }; PlacesUtils.bookmarks.runInBatchMode( callback, null ); }; // добавлять новый пункт в меню во все меню папок закладок .... addEventListener("popupshowing", function(e) { var node = e.target; if ( node.id !== 'placesContext' ) return; var sortByName = node.getElementsByAttribute("id", "placesContext_sortBy:name")[0]; setTimeout(function() { menuitem.setAttribute("disabled", sortByName.disabled ) }, 0) node.insertBefore( menuitem, sortByName ); addDestructor(function() { node.removeChild( menuitem ) }); }, true, window ); })();
Отредактировано bunda1 (08-06-2014 18:22:38)
Отсутствует
Как называется функция которая вызывается по ПКМ на кнопке - я попробывал поискать и не смог найти ни её ни передаваемых параметров.
Мне нужно её именно вызывать на прямую, а не просто по ПКМ.
Отредактировано Indomito (11-06-2014 08:50:17)
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Обычное ПКМ по кнопке Выдаёт меню(выпадающее). Как его вызвать принудительно без нажатия ПКМ по кнопке.
"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах
Отсутствует
Обычное ПКМ по кнопке Выдаёт меню(выпадающее). Как его вызвать принудительно без нажатия ПКМ по кнопке.
Отсутствует