Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Эмулировать клик мышью (https://javascript.ru/forum/events/13986-ehmulirovat-klik-myshyu.html)

Toxa 22.12.2010 23:27

Эмулировать клик мышью
 
Доброго времени суток! Передо мной встала не совсем простая задача.
Пишу скрипт под грейсманки для автоматического сбора подарков с одного сайта. Речь о сервисе http://findpresent.net/. Если вы не знакомы с ним, можете посмотреть примеры реализации там же.
Ну так, собственно, код

var images = document.getElementsByTagName("img")
				for(var i=0;i<=images.length;i++) {
					if(images[i].src.indexOf("http://findpresent.net/uploads/") !== -1) {
						//alert(images[i].parentNode.tagName)
						//alert("success!")
						try{
							clickevent=document.createEvent("MouseEvents")
							clickevent.initEvent("click", true, true)
							images[i].dispatchEvent(onclick)
							//images[i].parentNode.onclick()
						} catch(e) {
						alert(e)
						}
					}
				}

В общем, как вы уже поняли, не удается организовать клик мышью по картинке ни одним из нагугленных способов.
срабатывает исключение с текстом

[Exception... "Component is not available"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: file:///C:/Documents%20and%20Settings/%D0%9F%D0%B0%D0%BF%D0%B0/Application%20Data/Mozilla/Firefox/Profiles/o0e7txnf.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js :: anonymous :: line 385"  data: no]


Еще могу добавить, что изображения генерируются в дивах скриптом, подгруженным с сайта findpresent
Получить ссылку на картинку и на див не составляет труда, а вот кликнуть по нему...

пробовал варианты
images[i].onclick()

images[i].dispatchEvent(onclick)

Gvozd 22.12.2010 23:52

FF вроде позволяет сделать .click()
и не стоит испытвать сразу ВСЕ способы в одном try-catch
первый же не сработанный НЕ позволит выполнится всем остальным

Toxa 23.12.2010 00:15

Цитата:

Сообщение от Gvozd (Сообщение 84826)
FF вроде позволяет сделать .click()

пробовал, не работает!

Цитата:

Сообщение от Gvozd (Сообщение 84826)
и не стоит испытвать сразу ВСЕ способы в одном try-catch
первый же не сработанный НЕ позволит выполнится всем остальным

Ну конечно же я делал по-отдельности! Там же лишние строки закомментированны.
Вопрос остается открытым.

Gvozd 23.12.2010 00:25

значит не пытайтесь эмулировать клик.
делайте сразу то, что должно происходить во время клика

Toxa 23.12.2010 12:25

попробовал разобраться в скрипте

http://pastebin.com/2nzdgT0a

не понимаю, почему классы именуются буквами a,b,c,d,ect. ?

Hron 23.12.2010 12:35

Я видел пару таких скриптов, но они были в одну строчку записаны. Возможно это результат компрессии.

Toxa 23.12.2010 13:12

да, именно так скрипт

Цитата:

Сообщение от Toxa (Сообщение 84890)

был записан в строчку, я так понимаю это набор классов для работы сервиса findpresent.net
Кстати, greasemonkey позволяет видеть глобальные переменные? если на сайте присутствует jquery, а из моего скрипта (следуя) вызов
alert(typeof window.$) // undefined :(

Toxa 23.12.2010 18:08

И еще, возможно ли подключить внешний скрипт из greasemonkey? что значат следующие строки?

(function() {
	var host = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'findpresent.net';
	document.write('<sc'+'ript type="text/javascript" src="'+host+'/js/p.load.js?t='+(new Date()).getTime()+'"></sc'+'ript>');
})();

Toxa 27.12.2010 11:07

дабы не плодить новых тем задам вопрос здесь
Что значат следующие строки?
Function.prototype.bind = function (a)
{
    var b = this;
    return function ()
    {
        return b.apply(a, arguments);
    }
};

exec 27.12.2010 13:02

Эта функция делает так, что все последующие вызовы будут относиться к другому контексту:

<script type='text/javascript'>
Function.prototype.bind = function (a)
{
    var b = this;
    return function ()
    {
        return b.apply(a, arguments);
    }
};

var foo = function () {
	alert(this);
};

foo(); // window
foo = foo.bind("test");
foo(); // "test"
</script>


Часовой пояс GMT +3, время: 05:48.