помогите решить такую проблемку: есть код очищающий пункты истории дополнения по маске
if(event.button == 0 && !event.altKey && event.ctrlKey && !event.shiftKey) { var str = "кино1"; lmnpopHistory.open(); const statement = lmnpopHistory.dbConn.createStatement( "DELETE FROM history WHERE title NOT LIKE '%" + str + "%'"); statement.executeAsync(); statement.finalize(); lmnpopHistory.close(); lmnpopHistory.changed = true; }
как его доработать, если таких масок несколько? Т.е. еще будут str1 и str2.
Отсутствует
Спасибо, okkamas_knife,
Касательно индикации, то здесь всё очень просто: достаточно показывать только число оставшихся в контейнере вкладок, а режим (Вкл/Выкл) можно отражать сотней способов - цветом фона, фонта, стилем или весом фонта и т.д.
Касательно алгоритма:
Основная пользовательская операция - всего одна - загрузка текущей вкладки УРЛом из контейнера, остальные же операции - экзотичны.
В своё время bunda1 показал мне как реализовать кликабельную подсказку, так что дефицита кликов нет
Теперь насчёт функционала в целом:
1. Скрытие вкладок работает очень хорошо, здесь имхо ничего дополнительного делать не надо.
2. Надо что-то подправить, чтобы УРЛ ссылок тоже записывались в контейнер правильно (для закладок они записываются правильно, а для ссылок что-то мешает им писаться верно).
3. Основной момент - это подгрузка вкладок из контейнера. Как я понял из кода (а я ещё по-прежнему дилетант здесь), загрузка инициируется событием закрытия вкладки и поэтому здесь это срабатывает лишь при закрытии определённой вкладки (имхо - потому что событие закрытия привязывается к какой-то определённой вкладке, но это ИМХО, могу и ошибиться).
Поэтому мне кажется, что требуется другой механизм инициации подгрузки - например по интервалу - каждые 200мс подсчитывается общее кол-во вкладок, и если их меньше максимума и контейнер не пустой - это и будет инициацией подгрузки - т.е. открытия новой фоновой вкладки. При этом подходе нет привязки к событию закрытия, т.е. нет привязки к какой-то вкладке.
4. Очень элегантным имхо решением было бы использование в качестве информера (со всем семейством кликов/меню и т.д.) активной вкладки. Ведь если она активна, то мне не нужно знать ни title, ничего - она ведь на экране В этом случае саму кнопку можно скрыть (Infocatcher научил меня как это делать и даже для такого дилетанта как я - это просто, заявляю ответственно). Но сначала имхо надо реализовать пункты 2 и 3... А элегантность можно отложить на потом
Отредактировано difabor (16-01-2014 11:56:52)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
не заставляй людей делать бесполезную работу по переделыванию.
зы укажи также меняется там порядок и количество элементов или содержимое внутри основного дива стабильно
Содержимое стабильно;; переделывать просить не буду. Нужно именно для той структуры как указано.
Отсутствует
bunda1
В перестало работать добавление и удаление закладок двойным ПКМ. Можешь поправить?
Сейчас попробовал и вроде работает, разве только в папке Часто посещаемые нет.
Отсутствует
difabor
Список в tabArray И вот тут можно почитать про то что такое Массивы
Кликом можно вызвать список(если он есть) вот так:
// Настройка функций кликов мыши для кнопки ................................ this.onclick = function(e) { // действие при клике ЛКМ .... if ( e.button == 0 ) { alert( tabArray ); }; };
И у меня ссылки нормально открываются.
Пожалуйста пиши как то лаконичней а то мне выносит мозг от такого обилия текста и вопросов.
Отредактировано bunda1 (16-01-2014 22:45:14)
Отсутствует
И у меня ссылки нормально открываются.
У меня те ссылки, которые не пропустила кнопка, (т.е. которые в контейнере) открываются неверно при закрытии таба - вместо них открывается пустая вкладка (У меня - Fast Dial)
Когда я отключил Fast Dial - вообще даёт некорректный адрес.
Отредактировано difabor (16-01-2014 23:32:48)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Не контейнере а в массиве. Да со ссылками ситуация не понятная не знаю в чём тут дело. И что показывает alert( tabArray ); перед открытием такой пустой вкладки.
alert выдаёт на русском языке: "Новая вкладка,Новая вкладка".
Когда же я включаю FastDial, то получаю УРЛ этого FastDial - chrome://fastdial/content/fastdial.html
Такое впечатление, что в:
tabArray.push( e.type == 'TabOpen' ? tab.label : tab.linkedBrowser.contentDocument.location );
что вместо tab.label нужно другое...
А может, вместо tab.linkedBrowser.contentDocument.location...
Когда перехватывается закладка - всё ОК
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Сейчас попробовал и вроде работает, разве только в папке Часто посещаемые нет.
Спасибо. Что и удаляет? У меня только добавляет в корневые папки, те которые находятся непосредственно на панели закладок, а во вложенные нет. И нигде не удаляет. Попробую у себя в профиле поискать, может какой конфликт опять возник.
Отсутствует
еще будут str1 и str2
Может попробуй
"DELETE FROM history WHERE " + "title NOT LIKE '%" + str + "%' AND " + "title NOT LIKE '%" + str1 + "%' AND " + "title NOT LIKE '%" + str2 + "%'"
Отсутствует
Так что ты из Fast Dial ссылки открываешь.
Нет, конечно! Я открываю ссылки из обыкновенных сайтов - перепробовал много.
Просто когда включён Fast Dial он перехватывает все пустые вкладки и подсовывает себя вместо них. Поэтому я его отключил.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Не новая наверно:
function manageBookmarks(e) { var target = e.originalTarget; // эсли это закладка из папки закладок .... if ( !!target._placesNode && ( target.localName == "menuseparator" || target.localName == "menuitem") ) { var type = e.type; var bookMenu = target.parentNode; // левый клик открывает закладку в новой или добавляет текущую вкладку в закладки удержанием левой кнопки .... if ( e.button == 0 && ( type == 'mousedown' || type == 'mouseup' ) ) { if ( type == 'mouseup' ) e.preventDefault(); if ( type == 'mousedown' ) { this.addBook = false; addEventListener("drag", function(e) { // сбросить таймер при перетаскивание закладки window.clearTimeout( this.addBookTimer ); removeEventListener( e.type, arguments.callee, true ); }, true ); this.addBookTimer = setTimeout(function( self ) { // таймер запускает добавление закладки self.addBook = true; addBookmark(); }, 400, this ); } if ( type == 'mouseup' && !this.addBook ) { window.clearTimeout( this.addBookTimer ); // открыть закладку в новой или в текущей вкладке если это указанная вкладка var itemUri = target._placesNode.uri; var bookmarklet = ( itemUri.substr(0, 11) == "javascript:" ); var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"]; ( bookmarklet || current.indexOf( content.location.href ) !== -1 || e.ctrlKey ) ? gBrowser.loadURI( itemUri ) : gBrowser.addTab( itemUri ); } // добавить страницу в закладки в текущей папке function addBookmark() { var index = PlacesUtils.bookmarks.getItemIndex( target._placesNode.itemId ) + 1; var docTitle = ( content.document.title || gBrowser.mCurrentTab.label ).substr(0, 50); var folderId = PlacesUtils.getConcreteItemId( target.parentNode.parentNode._placesNode ); var currentUri = Services.io.newURI( content.location, null, null ); PlacesUtils.bookmarks.insertBookmark( folderId, currentUri, index, docTitle ); } }; // средний клик открвыяет закладку в текущей вкладке .... if ( e.button == 1 && type == 'mouseup' && target.localName !== "menuseparator" ) { addEventListener("click", function(e) { // обработчик блокирует действие по умолчанию для клика e.stopPropagation(); gBrowser.loadURI( target._placesNode.uri ); // открыть закладку removeEventListener( e.type, arguments.callee, true ); }, true ); }; // двойной правый клик удаляет закладку или разделитель .... if ( e.button == 2 && type == 'mouseup' ) { if ( bookMenu.open == true ) { e.preventDefault(); setTimeout(function() { document.getElementById("placesContext").hidePopup() }, 0); try { PlacesUtils.bookmarks.removeItem( target._placesNode.itemId ) } catch(e) {}; } bookMenu.open = true; setTimeout(function() { bookMenu.open = false }, 400 ); // сбросить флаг по таймеру }; // автоматически закрыть все меню закладок при уходе курсора .... if ( bookMenu.stopListener ) return; // блокировать повторный запуск обработчика для текущего меню закладок bookMenu.stopListener = true; // обработчик закрывает меню при ухода мыши с меню и удаляет себя addEventListener("mouseover", function close(e) { if ( !/menu/.test( e.originalTarget.nodeName ) ) { clearTimeout( bookMenu.timer ); bookMenu.timer = setTimeout(function() { removeEventListener("mouseover", close, false, window ); bookMenu.stopListener = false; // отключить блокировку запуска for ( var node = bookMenu; node; node = node.parentNode ) { // закрыть все родственные меню закладок if ( node.nodeName == 'menupopup' ) node.hidePopup(); } }, 450 ); // закрыть меню через ms } else clearTimeout( bookMenu.timer ); }, false ); } }; addEventListener("mouseup", manageBookmarks, true ); addEventListener("mousedown", manageBookmarks, true );
Отсутствует
Уважаемый bunda1, кроме того я обнаружил следующее:
1. tabArray.push( (e.type == 'TabOpen') ? tab.label : tab.linkedBrowser.contentDocument.location ); идёт всегда на tab.label, т.е. всегда e.type == 'TabOpen
2. tab.linkedBrowser.contentDocument.location он вообще не "любит" почему-то.
Я просто для отслеживания создал ещё и var tArray = [] и туда пытался пушнуть tab.linkedBrowser.contentDocument.location, а алерт написал так:
alert( tabArray +" | "+ tArray) - так алерт вообще не появлялся!
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
1. А вот и нет, не всегда e.type == 'TabOpen после старта при восстановлении сессии e.type будет и SSTabRestoring. В коде как ты наверно заметил два обработчика которые отслеживают открытие вкладок и каждый требует свой способ получения адреса вкладки которая открывается. При открытии вкладки сперва открывается новая пустая вкладка а потом в ней уже вкладка с нужным адресом и отсюда проблемы с получением адреса этой вкладки. Для addEventListener("TabOpen"... почему то это e.target.label
И если у тебя e.target.label отдаёт Новая вкладка что обычно бывает при восстановлении сессии то тебе надо запустить мой код на чистом профиле для проверки возможного конфликта с другим кодом или расширением,
2. Если вообще не появился алерт значит в коде ошибка.
Ну да ладно попробую сделать код без addEventListener("TabOpen"...
Отредактировано bunda1 (17-01-2014 20:05:50)
Отсутствует
difabor
1. А вот и нет, не всегда e.type == 'TabOpen после старта при восстановлении сессии e.type будет и SSTabRestoring. В коде как ты наверно заметил два обработчика которые отслеживают открытие вкладок и каждый требует свой способ получения адреса вкладки которая открывается. При открытии вкладки сперва открывается новая пустая вкладка а потом в ней уже вкладка с нужным адресом и отсюда проблемы с получением адреса этой вкладки. Для addEventListener("TabOpen"... почему то это e.target.label
И если у тебя e.target.label отдаёт Новая вкладка что обычно бывает при восстановлении сессии то тебе надо запустить мой код на чистом профиле для проверки возможного конфликта с другим кодом или расширением,
2. Если вообще не появился алерт значит в коде ошибка.Ну да ладно попробую сделать код без addEventListener("TabOpen"...
Уважаемый bunda1, я ведь не претендую на истину (с моими-то убогими знаниями) - мне хотелось помочь (быть может), а получилось наоборот...
Я знаю, что если не появился алерт, значит ошибка. Я это и обнаружил: если пытаться сделать:
tArray.push(tab.linkedBrowser.contentDocument.location), то в этом случае alert( tabArray +" | "+ tArray) просто не появлялся при клике.
Из этого я и сделал вывод, что e.type == 'TabOpen' не "любит" tab.linkedBrowser.contentDocument.location
Что касается чистого профиля, то я не умею его создавать.
В своё время Вы дали мне ссылку на экспериментальные версии но я не знаю, что будет если я такую инсталлирую и как можно будет вернуться к старой...
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Инсталлировать не надо, это портативная версия Mozilla Firefox, Portable Edition | PortableApps.com - Portable software for USB, portable and cloud drives
Отредактировано bunda1 (17-01-2014 21:37:01)
Отсутствует
Я её скачал. Если я сейчас запущу скаченный файл, то запустится ещё один Файрфокс, или новый Файрокс заместит текущий?
Если заместит текущий, то как к нему вернуться?
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
bunda1
А не подскажешь нет ли случайно чего нибудь такого, нажал на кнопку и открылось x адресов заранее в неё вбитых, до панели закладок не очень оперативно добираться.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
bunda1
А не подскажешь нет ли случайно чего нибудь такого, нажал на кнопку и открылось x адресов заранее в неё вбитых, до панели закладок не очень оперативно добираться.
/*CODE*/
getBrowser (). addTab ("http://forum.mozilla-russia.org/index.php");
getBrowser (). addTab ("http://forum.mozilla-russia.org/index.php")
К примеру.
Отсутствует