Не... Там пишут:
NOTES - The select event only fires when text inside a text input or textarea is selected.
Это как раз то, о чём я писал
отследить выделение или снятие выделения с конкретного элемента, наподобие как onselect и onblur, но не в текстовом поле
Скажем текст в диве или спане
Может можно через CustomEvent https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent
Но я там ничего не понял
Отсутствует
beggrr
Вот пример:
// Функции автоматически копирует выделенный текст на странице, если это разрешено в 'about:config' ................................ function autocopy(e) { if ( e.button == 2 ) return; if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test( e.target.localName.toLowerCase() ) ) return; if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection(); if ( e.type !== 'mouseup' ) return; var selection = getBrowserSelection(); if ( cbu.getPrefs("Autocopy") && selection && selection !== lastSelection ) { goDoCommand('cmd_copy'); // выделенный текст мигает .... if ( !cbu.getPrefs("Autocopy.selectingTextBlink") ) return; document.activeElement.blur(); setTimeout(function() { window.content.focus() }, 300); } }; addEventListener("mouseup", autocopy, false, gBrowser ); addEventListener("mousedown", autocopy, false, gBrowser );
Отсутствует
beggrr
Вот пример:
Хорошая кнопка, но как она дает ответ на мой вопрос:
отследить выделение или снятие выделения с конкретного элемента, наподобие как onselect и onblur, но не в текстовом поле
?
Отсутствует
beggrr
На крайний случай, вот — жуткая жуть, наверняка глючная, но можешь повозиться
function addSelListener(node) { if (!node || "cbSelListener" in node) return; var sl = { node: node, win: null, winSel: null, lastSel: "", hasSel: false, mouseDown: false, init: function() { this.win = this.node.ownerDocument.defaultView; this.winSel = this.win.getSelection().QueryInterface(Ci.nsISelectionPrivate); this.hasSel = this.winSel.containsNode(this.node, true); this.node.cbSelListener = true; this.winSel.addSelectionListener(this); this.addListeners(true); }, destroy: function() { if (!this.node) return; delete this.node.cbSelListener; this.winSel.removeSelectionListener(this); }, addListeners: function(add) { var sl = this; var func = add ? addEventListener : removeEventListener; ["unload", "mousedown", "mouseup", "blur"].forEach(function(type) func(type, sl, false, sl.win) ); }, handleEvent: function(e) { if (e instanceof MouseEvent && e.button) return; this[e.type](e); }, unload: function(e) { this.addListeners(false); this.destroy(); this.node = null; }, mousedown: function() this.mouseDown = true, mouseup: function() this.mouseDown = false, blur: function() this.mouseDown = false, notifySelectionChanged: function(doc, sel, reason) { if (this.mouseDown) return; if (sel.isCollapsed || !sel.containsNode(this.node, true)) { if (this.hasSel) { this.hasSel = false; this.onUnselect(); } return; } this.hasSel = true; var str = ""; var nodeRange = doc.createRange(); nodeRange.selectNode(this.node); for(var r = 0; r < sel.rangeCount; r++) { var range = sel.getRangeAt(r).cloneRange(); var [nodeStartsAfter, nodeEndsBefore, nodeStartsBefore, nodeEndsAfter] = "END_TO_START START_TO_END START_TO_START END_TO_END".split(" ") .map(function(how) range.compareBoundaryPoints(Range[how], nodeRange) == (how[0] == "E" ? 1 : -1) ); if (nodeStartsAfter || nodeEndsBefore) continue; if (nodeStartsBefore) range.setStart(this.node, 0); if (nodeEndsAfter) range.setEnd(nodeRange.endContainer, nodeRange.endOffset); str += range.toString(); } if (this.lastSel == str) return; this.lastSel = str; this.onSelect(str); }, onSelect: function(txt) { Services.console.logStringMessage(_id + " - SELECT:\n" + txt); custombuttons.alertBox(_id, "SELECT:\n" + txt); }, onUnselect: function() { Services.console.logStringMessage(_id + " - UNSELECT"); custombuttons.alertBox(_id, "UNSELECT"); } }; sl.init(); addDestructor(sl.destroy, sl); }
Отсутствует
Уважаемые форумчане, помогите пожалуйста, есть код кнопки. По задумке из файла берется строчка с поисковым запросом в произвольном порядке и вставляется в searchbar.
Вот этот код:
/*CODE*/ var path = "c:\\file.txt"; var words = custombuttonsUtils. readFile (path); words = words. split (/[\r\n]{1,2}/); if (words. length != 0) { var ind = Math. floor (Math. random () * words. length); var sb = document. getElementById ("searchbar"); sb. doSearch (MyOwnConverter.ConvertToUnicode(words[ind]), "current"); sb. value = MyOwnConverter.ConvertToUnicode(words[ind]); sb. _textbox. _formHistSvc. addEntry (sb. _textbox. getAttribute ("autocompletesearchparam"), MyOwnConverter.ConvertToUnicode(words[ind])); // Если надо добавить текст в историю поиска }
Помогите пожалуйста видоизменить код, чтобы произвольный запрос вставлялся не в searchbar, а происходил переход по конструкции вида:
Т.е. до поискового запроса из файла конструкция "http://site.ru/search.html?searchid=XXX&text=" и после запроса "&web=0#"
Заранее большое спасибо!
Отредактировано Sekotka (03-03-2014 18:47:59)
Отсутствует
Можно конструкцию вида
сохранить в переменную, чтоб потом имя этой переменной подставлять для краткости, а не писать всю конструкцию многократно?
Отсутствует
а функция чем неустраивает?
А как это будет выглядеть?
Отсутствует
У меня это выражение является частью условия
На самом деле в условии бывает выражение куда более длинное и бывает нужно несколько раз это условие записывать. Сейчас я делаю так:
Вместо 5 - любое значение. А дальше я не пишу это длинное выражение со сравнениями и пр. а просто повторяю if (my_var = 5) столько раз сколько нужно.
А как правильно нужно делать?
Отредактировано Ki_rrrilll (04-03-2014 15:09:04)
Отсутствует
okkamas_knife спасибо!
Отсутствует
Я хочу приделать на URLBar обработчик ondblclick.
Как сделать, чтобы при двойном клике контекстное меню адресной строки не появлялось или хотя бы само исчезало через очень короткое время?
Отсутствует
Я хочу приделать на URLBar обработчик ondblclick.
Как сделать, чтобы при двойном клике контекстное меню адресной строки не появлялось или хотя бы само исчезало через очень короткое время?
addEventListener("dblclick", function(e) { var box = e.target.inputField.parentNode; var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu"); setTimeout(function() popup.hidePopup(), 50); }, false, gURLBar );
Отсутствует
bunda1 спасибо, а как бы ещё в адресной строке отменить выделение слова по двойному клику?
e.preventDefault() не помогает.
addEventListener("dblclick", function(e) { var box = e.target.inputField.parentNode; var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu"); setTimeout(function() { popup.hidePopup(); gURLBar.blur(); } , 5); }, false, gURLBar );
или
addEventListener("dblclick", function(e) { var box = e.target.inputField.parentNode; var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu"); setTimeout(function() { popup.hidePopup(); gURLBar.inputField.selectionEnd = 0; } , 5); }, false, gURLBar );
Отредактировано bunda1 (08-03-2014 12:37:47)
Отсутствует
bunda1
Я попробовал оба варианта, всё равно по двойному клику ЛКМ на очень короткое время слово выделяется.
Я хотел сделать копирование текста в адресной строке по двойному клику. Но копируется не то, что я заранее выделил, а слово, которое успело выделиться, пока выделение сбросилось.
Отсутствует
Но ПКМ копирует.
ПКМ - да. По ПКМ не выделяется слово целиком. Просто у меня на double rightclick повешено уже другое действие.
Ну, что-то придумаю...
Ещё раз спасибо за помощь
Отсутствует
Чайник
Можно копировать и так:
addEventListener("select", function(e){ var theBox = document.commandDispatcher.focusedElement; var startPos = theBox.selectionStart; var endPos = theBox.selectionEnd; var selection = theBox.value.substring(startPos, endPos); gClipboard.write( selection ); }, false, gURLBar );
Отсутствует
Можно копировать и так:
Этот код корректно работает где-то на странице, где выделяют текст только чтобы скопировать, и ни для чего больше.
А в адресной строке (да и в любом инпуте) начинаются косяки: я выделяю фрагмент, чтобы удалить, а он копируется.
Или ещё хуже: выделяю, чтобы вставить на это место из буфера, а в буфере оказывается уже не то что было, а только что выделенный текст.
Я пока сделал себе так. У меня прямо над адресной строкой есть кнопка и я добавил в неё код:
var myTim; this.onmouseover = function () { var u = gURLBar; var sel = u.value.substring(u.selectionStart, u.selectionEnd); if (sel != 0) { myTim = setTimeout(function () { // чтобы не срабатывало, если gClipboard.write(sel); //случайно провести мышкой над кнопкой u.selectionEnd = 0 }, 500) } } // прибивает таймер, если убрать курсор с кнопки вовремя this.onmouseleave = function () { clearTimeout(myTim) }
Вроде удобно (для меня).
Отредактировано Чайник (08-03-2014 21:37:47)
Отсутствует
Подскажите как отсортировать массив из объектов по свойству в алфавитном порядке.
Добавлено 08-03-2014 23:30:29
Вроде так:
array.sort(function(a,b) { return a.title > b.title } ) alert( array.map(function(item) item.title ) ); // проверка
Отредактировано bunda1 (08-03-2014 23:30:46)
Отсутствует
Подскажите как отсортировать массив из объектов по свойству в алфавитном порядке.
По идее, лучше как в документации:
array.sort(function(a, b) { if(a.title > b.title) return 1; if(a.title == b.title) return 0; return -1; });
А простое сравнение дает только
Кстати, там еще со скоростью обработки некоторые странности: http://jsperf.com/array-sort-objects (создание переменных медленнее, чем доступ к свойствам, хотя, казалось бы, это должно легко оптимизироваться).
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует