>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Помогите плиз адаптировать javascript: URL для FireFox http://forum.mozilla-russia.org/viewtopic.php?id=42417 |
Kramar > 21-12-2009 01:27:06 |
Помогите плиз адаптировать javascript: URL (букмарклет) для FireFox или создать скрипт для Greasemonkey В IE отлично работает вот такая штука javascript:t=document.body.outerHTML;autor_reg=/Автор:<\/B>[^>]*>([^<]*)/;autor=autor_reg.exec(t)[1];name_reg=/Название:[/s]*<\/[bB]>[^>]*>([^<]*)/;name=name_reg.exec(t)[1];year_reg=/Год:[/s]*<\/[bB]>[^\d]*(\d*)/;year=year_reg.exec(t)[1];s=name+' '+autor+' ('+year+')';clipboardData.setData('Text',s); В FieFox естественно работать не хочет, познаний в JavaScript практически нет и беглое знакомство с тематикой показывает, что мне как не программеру уйму времени надо убить для минимального понимания, а возможности такой нет. В Инете накопал, что FireFox не дружит с outerHTML, попробовал заменить на document.documentElement.innerHTML, текст странички выдает, но с кириллицей явные проблемы (в скрипте слова Автор, Название, Год). javascript:t=document.documentElement.innerHTML;autor_reg=/Автор:<\/B>[^>]*>([^<]*)/;autor=autor_reg.exec(t)[1];name_reg=/Название:[/s]*<\/[bB]>[^>]*>([^<]*)/;name=name_reg.exec(t)[1];year_reg=/Год:[/s]*<\/[bB]>[^\d]*(\d*)/;year=year_reg.exec(t)[1];s=name+' '+autor+' ('+year+')';clipboardData.setData('Text',s); Еще есть подозрение (в консоли ошибок вижу Ошибка: autor_reg.exec(t) is null Источник: javascript:t=document.documentElement.innerHTML;autor_reg=/%D0%90%D0%B2%D1%82%D0%BE%D1%80:<\/B>[^>]*>([^<]*)/;autor=autor_reg.exec(t)[1]), что вот здесь autor=autor_reg.exec(t)[1] FireFox не нравится [1] (я так понимаю 1-ый элемент массива? или проблема еще в autor_reg, связанная с кирилицей?) Исходная информация (помогает понять предназначение букмарклета или скрипта) скрытый текст Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст. Заранее спасибо откликнувшимся |
luitzen > 21-12-2009 17:31:34 |
Вот такой вариант с alert() попробуйте: Выделить код Код:javascript: td = document.getElementsByClassName('newsbody')[0].textContent; alert(td.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' - ' + td.match(/^Название:\xA0([^\n]*)$/m)[1]); |
Kramar > 21-12-2009 18:04:04 |
luitzen пишет
О, спасибо, работает, т.е. поменяв порядок элементов и добавив год, получаем: javascript: td = document.getElementsByClassName('newsbody')[0].textContent; alert(td.match(/^Название:\xA0([^\n]*)$/m)[1] + ' - ' + td.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' (' + td.match(/^Год:\xA0([^\n]*)$/m)[1] + ')'); Для полного счастья осталось занести это в буфер а не выдать alert (если есть такая возможность) |
formatC'vt > 21-12-2009 18:47:39 |
Попробуйте через ClipboardHelper |
Kramar > 22-12-2009 10:53:50 |
formatC'vt пишет
Спасибо, интуитивно чувствую - "оно", но опять же таки дело в том, что в JavaScript я даже не чайник, а подставка от него. Я так понимаю, что в примере выше alert(); я должен заменить на gClipboardHelper.copyString(); с соответствующим содержимым? Но чтобы оно заработало надо куда-то воткнуть const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]. getService(Components.interfaces.nsIClipboardHelper); Вопрос задачи - куда? Или совсем-совсем неправ? Понимаю, что в глазах сообщества выгляжу как ... (заполнить на свое усмотрение), но прошу снизойти до объяснений. |
luitzen > 22-12-2009 14:07:30 |
Как-нибудь так тогда: Выделить код Код:javascript: td = document.getElementsByClassName('newsbody')[0].textContent;netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(td.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' - ' + td.match(/^Название:\xA0([^\n]*)$/m)[1]); Хотелось бы, конечно, ограничиться меньшими привилегиями и выкрутиться через .execCommand("Copy", false, null). |
Kramar > 22-12-2009 16:28:06 |
luitzen пишет
Консоль ошибок пишет Ошибка: A script from «http://www.infanata.org» was denied UniversalXPConnect privileges. |
luitzen > 22-12-2009 17:24:34 |
У меня всё работает, честно . При первом применении появляется диалог, в котором спрашивается, можно ли дать сценарию дополнительные привилегии. Если выставить флаг «запомнить решение», то больше этот диалог не повляется. Попробуйте отключить или удалить NoScript. Конечно, вариант с предоставлением более скромых привилегий предпочтительнее, но тут требуется помощь зала. |
Kramar > 22-12-2009 21:56:39 |
luitzen пишет
У меня этого диалога не было и отключение NoScript никак на это не повлияло. Диалог появился только после изменения в about:config параметра signed.applets.codebase_principal_support на true. После этого спрашивает о привилегиях. Изменение signed.applets.codebase_principal_support на true ничем страшным не чревато? После всех проведенных операций скрипт работает именно так, как его просили. Огромное спасибо luitzen и formatC'vt за помощь и терпение. Можно ли опубликовать полученное решение на форуме natahaus.info с упоминанием и благодарностью luitzen и formatC'vt ? |
luitzen > 22-12-2009 23:04:59 |
Kramar пишет
luitzen не против . |
formatC'vt > 23-12-2009 08:54:14 |
formatC'vt тоже не против |
Kramar > 23-12-2009 12:19:43 |
Еще раз большое спасибо ответившим. Пост на natahaus.info - скрытый текст Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст. |
luitzen > 24-12-2009 17:55:13 |
Вариант, для которого требуется меньше привилегий: Выделить код Код:javascript: var newsbody = document.getElementsByClassName('newsbody')[0]; var title = newsbody.textContent; var title = title.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' - ' + title.match(/^Название:\xA0([^\n]*)$/m)[1]; var input = document.createElement("input"); input.setAttribute("contentEditable", "true"); input.setAttribute("value", title); input = newsbody.appendChild(input); input.focus(); input.setSelectionRange(0, title.length); document.execCommand('Copy', false, true); newsbody.removeChild(input); void(0); Как выдать привилегии — описано здесь. Можно также использовать расширение AllowClipboard Helper. У такого букмарклета есть недостаток: после его вызова пропадает выделение текста (если оно было), пропадает фокус у полей ввода и пр. В принципе, с этим можно побороться. Kramar, простите, я продублировал это сообщение на тамошнем форуме . |
Kramar > 25-12-2009 23:27:56 |
luitzen пишет
Почему это вдруг "простите", наоборот спасибо Вам за это, только там про привилегии слегка по-другому сказано. |
Timofejj > 21-05-2015 19:27:58 |
Доброго времени суток всем! Дабы не плодить темы, то решил написать здесь. Моему знакомому понадобилось расширение для Mozilla типа Disqus-Downvote-Exposer которое есть только на Chrome. Оно помогает получить возможность видеть кол-во "минусов" в постах disqus'а. Состоит только из одного примитивного JavaScript, которое я решил адаптировать под Greasemonkey. Всё бы нечего но в JavaScript пока не силён и видимо переоценил свои возможности. Если нетрудно помогите разобраться где что не так. Спасибо! Выделить код Код:// ==UserScript== // @name Disqus-Downvote-Exposer // @namespace http://localhost // @include http://*.disqus.com/* // @include http://disqus.com/* // @run-at document-end // @version 1.0 // ==/UserScript== switch (window.location.hostname) { case "disqus.com" & "*.disqus.com": setInterval(ShowDownvotes, 3000); function ShowDownvotes() { var downvotes = document.getElementsByClassName("vote-down"); for (var i = 0; i < downvotes.length; i++) { var downvoteCount = downvotes[i].getElementsByClassName("downvote-count"); if (downvoteCount.length === 0) { downvoteCount = document.createElement("span"); downvoteCount.className = "downvote-count"; downvoteCount.style.position = "relative"; downvoteCount.style.top = "-3px"; downvotes[i].insertBefore(downvoteCount, downvotes[i].firstChild); } else downvoteCount = downvoteCount[0]; downvoteCount.innerHTML = downvotes[i].className.split(" ")[2].substring(6); if (downvoteCount.innerHTML == "0") downvoteCount.style.display = "none"; else downvoteCount.style.display = ""; } } } |
Infocatcher > 21-05-2015 21:48:45 |
Timofejj К тому же «"disqus.com" & "*.disqus.com"» превратится в 0, & – это побитовое И, строки приведет к числам и попытается посчитать. |
Timofejj > 22-05-2015 00:40:56 |
Infocatcher Огромное спасибо за отклик. Я сначала сам "дотункал" и всё таки "доканал", а потом зашёл сюда. Хотел коммент удалить, думал не кому ответить. Вот, рабочий вариант: Выделить код Код:// ==UserScript== // @name Disqus Downvote Exposer // @namespace ShowDownvotes // @author Yunku Daniel Kang // @description Это скрипт показывает количество отрицательных голосов в комментариях на Disqus // @include https://disqus.com/* // @include http://*.disqus.com/* // @version 1.0 // @grant none // ==/UserScript== setInterval(ShowDownvotes, 3000); function ShowDownvotes() { var downvotes = document.getElementsByClassName("vote-down"); for (var i = 0; i < downvotes.length; i++) { var downvoteCount = downvotes[i].getElementsByClassName("downvote-count"); if (downvoteCount.length == 0) { downvoteCount = document.createElement("span"); downvoteCount.className = "downvote-count"; downvoteCount.style.position = "relative"; downvoteCount.style.top = "-3px"; downvotes[i].insertBefore(downvoteCount, downvotes[i].firstChild); } else downvoteCount = downvoteCount[0]; downvoteCount.innerHTML = downvotes[i].className.split(" ")[2].substring(6); if (downvoteCount.innerHTML == "0") downvoteCount.style.display = "none"; else downvoteCount.style.display = ""; } } Первоначально было без того где ты описал мою ошибку. Потом начал "плутать" Дело в том что Greasemonkey очень "чуствителен" к заголовку юзер-скрипта. Scriptish в этом отношении получше. Потом через него адаптировал и на Greasemonkey. Благодарю! |