Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Редирект и автоматический клик на кнопку (https://javascript.ru/forum/dom-window/36449-redirekt-i-avtomaticheskijj-klik-na-knopku.html)

Godwar 15.03.2013 12:42

Редирект и автоматический клик на кнопку
 
Добрый день!
Нужна ваша помощь в реализации следующей задачи.
Задача: есть кнопка, при нажатии на которую происходит переход (или редирект) на определенную страницу, и на этой странице происходит автоматический клик на определенную кнопку.

Есть варианты?

danik.js 15.03.2013 12:56

document.querySelector('button').click()

Godwar 15.03.2013 13:17

danik.js, просьба, напиши подробнее, пожалуйста. Я новичок в JS, и многих вещей пока не понимаю.

Например, есть кнопка:
<input class="btn-success btn_checkout" type="submit" name="checkout" value="{"str_checkout"|translate}" />

Есть страница, на которую нужно перейти:
www.radioexpert.ru/checkout/

Там есть ссылка-адрес в виде кнопки, которая должна автоматически нажаться:
<a class="standart-order" onclick=""> <!-- <button > --> Стандартный заказ <!-- </button> --> </a>

danik.js 15.03.2013 13:42

radioexpert.ru - вы имеете возможность вставить на этот сайт скрипт?
Или может быть вам нужно написать userscript, устанавливаемый в браузер, То есть это не для пользователей, а для именно для вас ?

Godwar 15.03.2013 14:07

Да, я могу вставить на сайт скрипт, и он предназначен абсолютно для всех пользователей.

danik.js 15.03.2013 14:17

document.querySelector('.standart-order').click()

Godwar 15.03.2013 15:06

<script type= "text/javascript">
function buttonCheckout()
{
var url = document.getElementById('id_buttonCheckout');
document.location.href = 'http://bekaa.tmweb.ru/checkout/';
document.querySelector('standart-order').click();
};
</script>

и кнопка:
<a href="javascript: buttonCheckout();" class="btn btn-large btn-success btn_checkout" id="buttonCheckout">Перейти</a>

Теперь перенаправление происходит, но не нажимает на кнопку "standart-order"

Godwar 15.03.2013 17:42

Нет вариантов?

danik.js 15.03.2013 19:39

так код "нажатия" на кнопку нужно вставлять на страницу, на которую переходим. Одна страница не может управлять другой страницей - это аксиома. Иначе и представить страшно.

Godwar 18.03.2013 11:31

Хорошо, пусть так. Но какой код нужно вставить? Потому что кнопок с перенаправлением может быть несколько. И при нажатию на каждую из них происходит перенаправление на одну и туже страницу, но при этом на ней автоматически нажимается только нужная кнопка, соответсвующая той, что была нажата ранее.

danik.js 18.03.2013 11:43

Страница, на которую идет перенаправления находится на том же домене? Тогда можно через куки/sessionStorage. Иначе - через get-параметр в строке запроса ( /page?button=x к примеру)

Godwar 18.03.2013 13:40

Опишу задачу еще раз, но упрощенее и понятнее.

Есть кнопка на странице index.html
<a href="javascript: buttonCheckout();" class="buttonQuick" id="buttonCheckout">Стандартный заказ</a>

При нажатии на кнопку, должен произойти переход на страницу outside.html, и, на этой странце, АВТОМАТИЧЕСКИ, т.е. без участия человека, произойти клик на кнопке
<a class="standart-order" onclick=""> <!-- <button > --> Стандартный заказ <!-- </button> --> </a>

Соответсвенно, JS код
<script type= "text/javascript">
function buttonCheckout()
{
var url = document.getElementById('id_buttonCheckout');
document.location.href = 'outside.html';
document.querySelector('standart-order').click();
};
</script>

Т.е. переход происходит, тут все ок. Но вот кнопка автоматически не нажимается. Вот в чем проблема.

А если вставлять JS код на странице outside.html, то как отследить, какая кнопка была нажата на index.html?

И - да, все страницы находятся на одном домене.

Godwar 18.03.2013 13:44

а код document.querySelector('standart-order').click(); отрабатывает, если обе кнопки находятся на одной странице.

danik.js 18.03.2013 13:46

Цитата:

Сообщение от Godwar
И - да, все страницы находятся на одном домене.

Ну тогда можно записывать метку в sessionStorage, на целевой странице проверять эту метку (и стирать ее) и делать нужные действия.

Как альтернативный вариант, я уже предлагал выше, добавляем ссылке query-параметр, проверяем его либо на сервере, вставляя некий код, либо на самой странице вытягивая через location.href и опять же, производя нужные действия.

Godwar 18.03.2013 13:56

Уверен, что это бы сработало, но для меня очень сложно - я новичек в JS. И, я так понимаю, более простого способа нет?
Типа - тут нажал, там вызвалась нужная функция js и нажала на кнопку.

Godwar 18.03.2013 14:54

Хорошо, просто не получится. Это понятно.

Итак, если мы передаем на index.html значение таким образом:

<script type= "text/javascript">
function buttonCheckout()
{
document.location.href = 'outside.html/?standart-order';
}
</script>


то на outside.html ловим скриптом:

<script type= "text/javascript">
function buttonCheckout()
{
var standart-order=location.search.substring(1);
document.querySelector('.standart-order').click();
}
</script>

Вот тут я уже плаваю. Есть варианты?

danik.js 18.03.2013 16:43

Godwar, на верном пути. Только имя переменной не может содержать знак дефис. И наверно лучше не query-строкой передавать, а через хэш-составляющую.
location.href = 'outside.html/#standart-order';


...

<script>
(function(){
    var hash = location.hash.substring(1);
    if (hash) {
        var element = document.querySelector('.' + hash);
        if (element) {
            element.click();
        }
    }
})();
</script>


Этот скрипт разместить ниже кнопки, чтобы на момент его выполнения кнопка уже присутствовала в документе. querySelector не работает в IE7 если что. Если нужна его поддержка, то либо может на странице подключена jquery, либо подключить polyfill, либо использовать выборку по id.

Godwar 19.03.2013 14:31

Увы, пока не работает.
JS код на index.html:

<script type= "text/javascript">
function buttonCheckout()
{	
    location.href = 'http://bekaa.tmweb.ru/checkout/#standart_order';
}
</script>

и кнопка, которую нажимает пользователь:
<a href="javascript: buttonCheckout();" class="btn btn-large btn-success buttonCheckout" id="buttonCheckout">Стандартный заказ</a>


Код JS на outside.html
{literal}
<script>
	(function(){
	    var hash = location.hash.substring(1);
	    if (hash) {
	        var element = document.querySelector('.' + hash);
	        if (element) {
	            element.click();
	        }
	    }
	})();
</script>
{/literal}

и кнопка, которая должна автоматически нажиматься:
<a class="standart-order btn btn-large btn-success pull-right standart_order" onclick="" id="standart_order" name="standart_order"> 
    <!-- <button > --> Стандартный заказ <!-- </button> -->
  </a>


не понимаю.

danik.js 19.03.2013 16:56

кнопка выше, чем скрипт, точно?
Если в консоли выполнить document.querySelector('.standart_order').click() , то результат имеется?

Godwar 19.03.2013 17:33

Кнопка выше, чем скрипт - все верно.

document.querySelector('.standart_order').click() через консоль нормально отрабатывается - кнопка нажимается.

danik.js 19.03.2013 18:58

Значит нужно поставить точку останова, выполнять пошагово и поглядеть что в скрипте происходит и что идет не так.

Godwar 20.03.2013 13:10

Прошел скрипт по каждой строке.

итог выполнения скрипта:

this -> Window #standart_order
arguments -> []
element -> a.standart_order
hash -> "standart_order"
toString -> function()

Т.е. хеш распознал, но на строке element.click(); клик не происходит

Godwar 20.03.2013 13:56

Есть варианты?

dmitriymar 20.03.2013 14:35

Цитата:

Сообщение от Godwar
Есть варианты?

т.е вы хотите запустить обработчик события клика(какой у вас отсутсвует), но не выполнив клик перейти по ссылке?

1 Переходы по ссылкам, возможны только после клика пользователем на ссылке -политика безопасности браузера
2 Вызов функции обработчика клика , и программная эмуляция клика вещи разные

Godwar 20.03.2013 15:15

Обнаружил любопытную деталь.
когда выполняется скрипт
<script>
	    (function(){
        var hash = location.hash.substring(1);
	        if (hash) {
	            var element = document.querySelector('.' + hash);
	            if (element) {
	                element.click();
	            }
	        }
	    })();
</script>


то уже на строке <if (element)> дебаггер показывает в строке <element.click();> инициализированную переменную "element" как "a.standart_order"
а скрипт a.standart_order.click() через консоль, естесственно, не работает. А вот document.querySelector('.standart_order').click() через консоль работает.

Поэтому я пределал скрипт на такой:
<script type="text/javascript">
	(function(){
	    var hash = location.hash.substring(1);
	    if (hash) {
	        var element = ('.' + hash);
	        if (element) {
	            document.querySelector('element').click();
	        }
	    }
	})();
</script>


Тогда в строке <document.querySelector('element').click();> переменная "element" выглядит как ".standart_order"

Но при этом вываливается ошибка:

TypeError: document.querySelector(...) is null
(?) /checkout/ (строка 782)
() /checkout/ (строка 777)
document.querySelector('element').click(); /checkout/ (строка 782)

Godwar 20.03.2013 15:21

Цитата:

Сообщение от dmitriymar (Сообщение 241689)
т.е вы хотите запустить обработчик события клика(какой у вас отсутсвует), но не выполнив клик перейти по ссылке?

1 Переходы по ссылкам, возможны только после клика пользователем на ссылке -политика безопасности браузера
2 Вызов функции обработчика клика , и программная эмуляция клика вещи разные

document.querySelector('.standart_order').click() отрабатывается, т.е. клик пользователя не требуется.

Godwar 20.03.2013 15:30

Возможно, вы правы, dmitriymar. Даже в этом варианте
<script type="text/javascript">
	(function(){
	    var hash = location.hash.substring(1);
	    if (hash) {
	        var element = document.querySelector('.' + hash);
	        if (element) {
	            document.querySelector('.standart_order').click();
	        }
	    }
	})();
</script>

кнопка не нажимается.
хотя сама по себе строка document.querySelector('.standart_order').click(); через консоль отрабатывается

Godwar 20.03.2013 15:46

<script type="text/javascript">
	(function(){
	    var hash = location.hash.substring(1);
	    if (hash) {
	        var element = document.querySelector('.' + hash);
	        if (element) {
	             alert(hash);
	        }
	    }
	})();
</script>

отрабатывает и показывает текущий хеш

danik.js 20.03.2013 15:47

Странная история. Если элемент был найден, то условие if (element) просто обязано выполниться. Попробуйте убрать условие и всегда вызывать element.click(). Ваши варианты неверные.

Godwar 20.03.2013 16:19

Быть может дело в том, что событие на клик этой кнопки отрабатывает другой скрипт?
<script type="text/javascript">
$(document).ready(function(){
		 $('.standart_order').click(function(){
		 $('#standart-order-block').css("display","block");
		 $('#quick-order-prev').css("display","none");
		 $('#standart-order-prev').css("display","none");
		 $('#credit-order-prev').css("display","none");

                  });

dmitriymar 20.03.2013 16:26

Цитата:

Сообщение от Godwar
document.querySelector('.standart_order').click() отрабатывается, т.е. клик пользователя не требуется

Цитата:

Сообщение от Godwar
Возможно, вы правы, dmitriymar. Даже в этом варианте
01 <script type="text/javascript">
02 (function(){
03 var hash = location.hash.substring(1);
04 if (hash) {
05 var element = document.querySelector('.' + hash);
06 if (element) {
07 document.querySelector('.standart_order').click();
08 }
09 }
10 })();
11 </script>

кнопка не нажимается.
хотя сама по себе строка document.querySelector('.standart_order').click(); через консоль отрабатывается

что значит возможно? Причём консоль к безопасности браузера?
Есть вызов обработчика нажатия -если он есть . JavaScript прописанный выполняется и ничего больше.
Есть человеческое нажатие на кнопку -поражающее череду событий браузера - запуск скриптов обработчиков нажатия, всплытие события, переход по ссылке...
Есть программное эмулирование нажатия http://www.js-doc.ru/documentation/d...ocs#mfireevent

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


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