Я не понял, в чём смысл этой ихней паранойи? Почему они боятся, что кто-то вставит обычную ссылку, но не боятся, что кто-то сделает тоже самое, только через addEventListener?
В том, что со страницы нельзя получить ссылку на обработчик, добавленный через addEventListener.
А если со страницы можно узнать ссылку на объект, созданный с более высокими привилегиями, есть вероятность получения и самих привилегий.
Вообще, в Firefox 3 и выше повышенные привилегии просто так не получить. Но, с другой стороны, не просто же так оставили XPCNativeWrapper.
Так что, если очень хочется, можно делать вот так:
document.getElementById('Div1').innerHTML = '<a href=javascript:MyFunc()>My Function</a>'; unsafeWindow.MyFunc = function() {alert('Okey')};
Или как-то так:
После этого все ссылки на скрипты которые были в Div1 перестают работать. Что мне делать?
Смотря что изначально находилось внутри Div1.
Ссылки на узлы DOM-дерева, которые были внутри Div1, будут в любом случае потеряны. Вернее, будут ссылаться на уже удаленные из документа объекты.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
В том, что со страницы нельзя получить ссылку на обработчик, добавленный через addEventListener.
А если со страницы можно узнать ссылку на объект, созданный с более высокими привилегиями, есть вероятность получения и самих привилегий.
Что вообще за привилегии такие? Зачем они нужны?
Вообще это мой скрипт, мой браузер. Всё моё. Какое вообще их дело, чего я со своей страничкой делаю? Если у них мания преследования, то я здесь причём?
Как это отключить?
Alert я привёл только для примера. Чтобы показать, что не работает.
Смотря что изначально находилось внутри Div1.
Ссылки на узлы DOM-дерева, которые были внутри Div1, будут в любом случае потеряны. Вернее, будут ссылаться на уже удаленные из документа объекты.
Мне надо не конкретную функцию вручную вписывать. А универсальную функцию, которая бы перебирала все теги, искала все их события, и всё, что в их событиях вписано и перестало работать, и активировала бы обратно через addEventListener или каким угодно другим способом. Можно так сделать?
То есть:
// StartTag - стартовый тег, от которого и ниже надо восстановить все события. function AntiParanoics(StartTag) { var AllTags = StartTag.getElementsByTagName('*'); // 1) Далее надо перебрать все события которые к тегу привязаны. // 2) Потом перепривязать все эти события через addEventListener. }
Как мне перебрать все события которые к тегу привязаны?
Если такую функцию написать - будет большое благо, для всех кто пишет свои скрипты под Greasemonkey. Можно будет вставить вызов одной функции и не заниматься каждый раз геморроем.
Отсутствует
Что вообще за привилегии такие? Зачем они нужны?
У расширений и той части интерфейса, что написана на JavaScript, больше привилегий, чем у скриптов с посещаемых страниц, для них и нужны.
Вообще это мой скрипт, мой браузер. Всё моё. Какое вообще их дело, чего я со своей страничкой делаю? Если у них мания преследования, то я здесь причём?
При том, что у браузера много пользователей. Можно написать самому себе небезопасное расширение, но нельзя делать так, чтобы оно было у всех/многих.
Alert я привёл только для примера. Чтобы показать, что не работает.
Во-первых, там обертка вида
Во-вторых, просто так нельзя добавлять свои поля глобальному объекту страницы (который window) – только через прямое добавление полей к unsafeWindow.
Мне надо не конкретную функцию вручную вписывать. А универсальную функцию, которая бы перебирала все теги, искала все их события, и всё, что в их событиях вписано и перестало работать, и активировала бы обратно через addEventListener или каким угодно другим способом. Можно так сделать?
По-моему, это проблема подхода. В том смысле, что проще изменить подход, чем делать универсальный велосипед.
И хотелось бы конкретный пример.
В любом случае, если не нужны GM-функции (и, скорее всего, поддержка других браузеров, которые могут не уметь E4X, который в данном случае упрощает написание строковых данных), достаточно делать вот так:
location.href = "javascript: " + <![CDATA[ function xxx() { alert(0); } document.body.setAttribute("onclick", "xxx();"); ]]>.toString();
Тогда скрипт будет выполняться полностью в контексте страницы.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
При том, что у браузера много пользователей. Можно написать самому себе небезопасное расширение, но нельзя делать так, чтобы оно было у всех/многих.
В чём оно небезопасное то? То, что на страничке матерное слово напишет? Текст он и есть текст.
По-моему, это проблема подхода. В том смысле, что проще изменить подход, чем делать универсальный велосипед.
Удобство в том, чтобы не менять своих привычек.
В любом случае, если не нужны GM-функции (и, скорее всего, поддержка других браузеров, которые могут не уметь E4X, который в данном случае упрощает написание строковых данных), достаточно делать вот так:
Как я уже говорил в прошлом постинге, мне нужен не alert, а функция, которая бы нашла ВСЁ, что поотключали эти больные манией преследования, и сама бы это включила бы обратно, через addEventListener, или любым другим способом.
Отсутствует
Обнаружил, что если вызвать addEventListener несколько раз, то она добавит несколько вызовов на одну и туже функцию. Это как если бы при клике на ссылку, у вас бы открылось не одно, а сразу 10 одинаковых ссылок.
Прям маразм крепчает. Всё через ... сделано.
Существует ли фунция addEventListenerIfNeedit? Или addEventListenerOnce ? Или SetEventListener? Или FindAllEvents? Или RemoveAllEvents?
Или что-нибудь, что даст простое решение этой проблемы.
Отсутствует
Как я уже говорил в прошлом постинге, мне нужен не alert, а функция, которая бы нашла ВСЁ, что поотключали эти больные манией преследования, и сама бы это включила бы обратно, через addEventListener, или любым другим способом.
Я привел код, запускающий скрипты так, как если бы они находились на странице. В таком случае нету ограничений, накладываемых обертками, потому как их нету за отсутствием взаимодействия кода с разными привилегиями.
А без конкретного неработающего примера что-то сказать проблемно.
Прям маразм крепчает. Всё через ... сделано.
Так во всех браузерах сделано. Даже в IE, но там методы иначе называются и аргументы чуть другие.
Существует ли фунция addEventListenerIfNeedit? Или addEventListenerOnce ? Или SetEventListener? Или FindAllEvents? Или RemoveAllEvents?
Не существует, но можно написать.
А для перебирания добавленных обработчиков нужны привилегии отдельного расширения и Firefox 3.6 и выше. Eventbug вот работает.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Не существует, но можно написать.
Я вот мучаюсь, никак не могу написать. Как мне сделать SetEventListener вместо AddEventListener?
Мой код:
function SetEventListener(MyTag1, Event1, Func1) { // Сначала надо удалить ВСЕ старые события. Как это сделать? MyTag1.removeEventListener(Event1, MyTag1.handle, true); // Дальше надо установить новое событие. ATag.addEventListener(Event1, Func1, false); } // Вызов: MyTag1.addEventListener(MyTag1, "click", function() {MyFunc1()});
Не работает. Чего не так? Как исправить?
А для перебирания добавленных обработчиков нужны привилегии отдельного расширения и Firefox 3.6 и выше.
То есть, чтобы МНОЮ же добавленные строчкой кода выше обработчики перебрать нужны ещё какие-то дополнительные привилегии?
Отсутствует
Например, так:
var p = "__listeners"; function removeListener(node) { if(p in node) { var evt = node[p]; node.removeEventListener(evt.type, evt.func, evt.useCapture); } } function addSingleListener(node, type, func, useCapture) { removeListener(node); node.addEventListener(type, func, useCapture); node[p] = { type: type, func: type, useCapture: useCapture }; }
Добавляемый обработчик запоминается в свойстве "__listeners", перед повторным добавлением сначала снимается старый обработчик.
При желании можно скрыть «хранилище» уже добавленных обработчиков, переместив его в отдельный массив, но тогда будет теряться производительность на проверку наличия узла, к которому требуется добавить обработчик, в этом массиве.
То есть, чтобы МНОЮ же добавленные строчкой кода выше обработчики перебрать нужны ещё какие-то дополнительные привилегии?
Чтобы перебирать все обработчики, нужен доступ к nsIEventListenerService, получить который могут только расширения.
Свои обработчики можно запоминать при добавлении самостоятельно.
Добавлено 20-01-2010 02:58:30
Не работает. Чего не так? Как исправить?
ATag нигде не объявлено.
К тому же, для снятия обработчика нужно совпадение всех аргументов addEventListener/removeEventListener – должна быть ссылка на ту же самую функцию и должен совпадать третий аргумент, отвечающий за момент перехвата события.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Например, так:
Заменил везде addEventListener на addSingleListener , но ничего не изменилось. Как появлялось несколько вызовов одной и той же функции при клике мышью, так и появляется.
При желании можно скрыть «хранилище» уже добавленных обработчиков, переместив его в отдельный массив
То есть функция addSingleListener одноразовая? Ну addEventListener - не одноразовая функция, и мне тоже нужна не одноразовая.
ATag нигде не объявлено.
К тому же, для снятия обработчика нужно совпадение всех аргументов addEventListener/removeEventListener – должна быть ссылка на ту же самую функцию и должен совпадать третий аргумент, отвечающий за момент перехвата события.
Вот как просто было написать a href=javascript:MyFunc() и никакого геморроя ...
тогда будет теряться производительность
Об этом надо забыть, пока не расстреляют всех этих разработчиков, которые высыпали такую кучу ... на простых скриптописателей.
Отсутствует
Как появлялось несколько вызовов одной и той же функции при клике мышью, так и появляется.
Или там нельзя свои свойства добавлять...
Это помимо опечатки в «func: type» (должно быть func: func).
Вот как просто было написать a href=javascript:MyFunc() и никакого геморроя ...
Я же сразу предложил попробовать засунуть весь код вовнутрь конструкции
Вот, вроде, работает:
var _nodes = []; var _realNodes = []; var _handlers = []; function removeListener(node) { var indx = _realNodes.indexOf(node); if(indx != -1) { var evt = _handlers[indx]; _nodes[indx].removeEventListener(evt.type, evt.func, evt.useCapture); _nodes.splice(indx, 1); _realNodes.splice(indx, 1); _handlers.splice(indx, 1); } } function addSingleListener(node, type, func, useCapture) { node.addEventListener(type, func, useCapture); var realNode = node.wrappedJSObject || node; removeListener(realNode); _nodes.push(node); _realNodes.push(realNode); _handlers.push({ type: type, func: func, useCapture: useCapture }); } addSingleListener(document.body, "click", function(e) { alert(e.target); }, true); addSingleListener(document.body, "click", function(e) { alert(e.target); }, true); addSingleListener(document.body, "click", function(e) { alert(e.target); }, true);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Вот, вроде, работает:
Спасибо! Потестирую.
А есть какая-нибудь функция, чтобы можно было загрузить произвольную страничку в переменную? Чего-то никак найти не могу. Что-нибудь типа:
Отсутствует
А есть какая-нибудь функция, чтобы можно было загрузить произвольную страничку в переменную?
Если произвольную, то только GM_xmlhttpRequest.
А для страниц с того же домена можно использовать XMLHttpRequest (примеры).
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Если произвольную, то только GM_xmlhttpRequest.
А для страниц с того же домена можно использовать XMLHttpRequest (примеры).
Спасибо!
Почему-то удаётся получить responseText, но responseXML равен null.
Там по ссылке написано:
Note: If the server doesn't apply the text/xml Content-Type header, you can use overrideMimeType() to force XMLHttpRequest to parse it as XML anyway.
А как это сделать?
Отсутствует
Minor
Примерно так:
var req = new XMLHttpRequest(); req.open("GET", "http://...", false); req.overrideMimeType("text/xml"); ...
А для GM_xmlhttpRequest есть пример:
// Inject responseXML into existing Object if not present if (!response.responseXML) response.responseXML = new DOMParser().parseFromString(response.responseText, "text/xml");
Отредактировано Infocatcher (22-01-2010 19:55:07)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Кто-нибудь может написать или сказать, где попросить, чтоб написали скрпит для history.qip.ru? Хочется иметь возможность просматривать большее количество сообщений на странице, сохранять всю историю себе в txt.
Отсутствует
Infocatcher
Спасибо!
А можно сделать так, чтобы сначала загружался скрипт, а потом грузилась страничка?
Чтобы не надо было ждать пока страничка полностью загрузится. А чтобы по мере её загрузки скрипт выполнял свою работу.
Отсутствует
А можно сделать так, чтобы сначала загружался скрипт, а потом грузилась страничка?
Чтобы не надо было ждать пока страничка полностью загрузится. А чтобы по мере её загрузки скрипт выполнял свою работу.
Greasemonkey срабатывает по событию DOMContentLoaded – то есть когда DOM-дерево полностью построено (но какие-нибудь картинки еще грузятся).
С очередностью сложно, не знаю. А для одновременности придется писать свое расширение и слушать какой-нибудь onProgressChange.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Здравствуйте. А не поможете решить вопрос http://forum.mozilla-russia.org/viewtop … 11#p409111 Я просто сам в скриптах ни грамма не понимаю.
Соответственно сам написать не смогу. Да и вообще не понимаю что и куда писать. Расширение поставил поставил, а что делать не знаю.
Отсутствует
Infocatcher
А для одновременности придется писать свое расширение и слушать какой-нибудь onProgressChange.
А существует простой способ переделать скрипт в расширение, которое запускает скрипт по onProgressChange?
Отсутствует
А существует простой способ переделать скрипт в расширение, которое запускает скрипт по onProgressChange?
http://forum.mozilla-russia.org/viewtopic.php?id=39496
Готового нету, вроде как. Так что сначала нужно сделать сам механизм, позволяющий узнать момент начала загрузки. А запускать скрипты по какому-то событию легко (ну, если обойтись без интерфейса настроек) – сложность только в том, чтобы узнать момент наступления события.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Но ведь AdBlock как-то блокирует элементы сразу, а не после загрузки страницы.
Там другой механизм. Перед загрузкой любого объекта сначала опрашиваются все «слушатели» и если ни один из них не отменил запрос, то начинается загрузка. То есть, по идее, на этом этапе нельзя сказать, будет ли это что-то загружено.
Например, в BetterCache вот так:
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); observerService.addObserver(httpObserver, "http-on-examine-response", false);
и
var httpObserver = { ... observe: function(subject, topic, data) { if (topic == "http-on-examine-response") { ... } } };
Только при этом еще нет объекта window страницы, чтобы выполнить код в его контексте.
P.S. А в Adblock Plus, насколько я понимаю,
// // nsIContentPolicy interface implementation // shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra) { ...
Добавлено 06-02-2010 19:00:53
Ещё вопрос, можно руссифицировать скрипт без UTF-8?
Можно.
После \u – hex-код символа.
Только это сомнительное удобство.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует