Страницы: 1
Помогите плиз адаптировать 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, связанная с кирилицей?)
Исходная информация (помогает понять предназначение букмарклета или скрипта)
Заранее спасибо откликнувшимся
Отсутствует
Вот такой вариант с alert() попробуйте:
javascript: td = document.getElementsByClassName('newsbody')[0].textContent; alert(td.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' - ' + td.match(/^Название:\xA0([^\n]*)$/m)[1]);
Отсутствует
javascript: td = document.getElementsByClassName('newsbody')[0].textContent; alert(td.match(/^Автор:\xA0([^\n]*)$/m)[1] + ' - ' + td.match(/^Название:\xA0([^\n]*)$/m)[1]);
О, спасибо, работает, т.е. поменяв порядок элементов и добавив год, получаем:
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 (если есть такая возможность)
Отсутствует
Попробуйте через ClipboardHelper
"Software is like SEX - it's better when it's FREE" (C) Linus Torvalds
Отсутствует
Попробуйте через ClipboardHelper
Спасибо, интуитивно чувствую - "оно", но опять же таки дело в том, что в JavaScript я даже не чайник, а подставка от него.
Я так понимаю, что в примере выше alert(); я должен заменить на gClipboardHelper.copyString(); с соответствующим содержимым? Но чтобы оно заработало надо куда-то воткнуть const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]. getService(Components.interfaces.nsIClipboardHelper);
Вопрос задачи - куда? Или совсем-совсем неправ?
Понимаю, что в глазах сообщества выгляжу как ... (заполнить на свое усмотрение), но прошу снизойти до объяснений.
Отсутствует
Как-нибудь так тогда:
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).
Но как я ни мучился со всякими capability.policy.allowclipboard, результата не достиг :(.
Отредактировано luitzen (22-12-2009 14:08:23)
Отсутствует
Как-нибудь так тогда:
Выделить кодКод:
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).
Но как я ни мучился со всякими capability.policy.allowclipboard, результата не достиг .
Консоль ошибок пишет Ошибка: A script from «http://www.infanata.org» was denied UniversalXPConnect privileges.
Стоит правда NoScript, но на infanata он неактивен.
Отсутствует
У меня всё работает, честно . При первом применении появляется диалог, в котором спрашивается, можно ли дать сценарию дополнительные привилегии. Если выставить флаг «запомнить решение», то больше этот диалог не повляется.
Попробуйте отключить или удалить NoScript.
Конечно, вариант с предоставлением более скромых привилегий предпочтительнее, но тут требуется помощь зала.
Отсутствует
При первом применении появляется диалог, в котором спрашивается, можно ли дать сценарию дополнительные привилегии. Если выставить флаг «запомнить решение», то больше этот диалог не повляется.
У меня этого диалога не было и отключение NoScript никак на это не повлияло. Диалог появился только после изменения в about:config параметра signed.applets.codebase_principal_support на true. После этого спрашивает о привилегиях. Изменение signed.applets.codebase_principal_support на true ничем страшным не чревато?
После всех проведенных операций скрипт работает именно так, как его просили.
Огромное спасибо luitzen и formatC'vt за помощь и терпение.
Можно ли опубликовать полученное решение на форуме natahaus.info с упоминанием и благодарностью luitzen и formatC'vt ?
Отсутствует
Можно ли опубликовать полученное решение на форуме natahaus.info с упоминанием и благодарностью luitzen и formatC'vt ?
luitzen не против .
Вам тоже спасибо: пойду думать, кто и когда выставил мой signed.applets.codebase_principal_support в true.
Отсутствует
formatC'vt тоже не против
Не плохо было бы еще сам ресурс упомянуть, без него помощь не удалась бы.
"Software is like SEX - it's better when it's FREE" (C) Linus Torvalds
Отсутствует
Еще раз большое спасибо ответившим. Пост на natahaus.info -
Отредактировано Kramar (23-12-2009 12:22:44)
Отсутствует
Вариант, для которого требуется меньше привилегий:
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, простите, я продублировал это сообщение на тамошнем форуме .
Почему это вдруг "простите", наоборот спасибо Вам за это, только там про привилегии слегка по-другому сказано.
Отредактировано Kramar (26-12-2009 00:28:50)
Отсутствует
Доброго времени суток всем! Дабы не плодить темы, то решил написать здесь. Моему знакомому понадобилось расширение для 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 = ""; } } }
Отредактировано Timofejj (21-05-2015 19:55:11)
Отсутствует
Timofejj
Как минимум, лишнее обрамление:
К тому же «"disqus.com" & "*.disqus.com"» превратится в 0, & – это побитовое И, строки приведет к числам и попытается посчитать.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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. Благодарю!
Отредактировано Timofejj (22-05-2015 00:42:15)
Отсутствует
Страницы: 1