Разница между кнопкой onclick и href

Я пытаюсь интегрировать корзину покупок SendOwl в свое приложение (подробная информация о приложении находится в конце).

Чтобы продемонстрировать проблему, я создал простой фрагмент, используя чистый HTML/Javascript. В разделе заголовка HTML у меня есть это:

<script type="text/javascript">
    function SendOwl(url) {                 
        window.location.href=url;
    }
</script>
<script type="text/javascript" src="https://transactions.sendowl.com/assets/sendowl.js" ></script>

В теле у меня это:

Пример 1. Форма оформления заказа открывается в отдельном окне (нежелательное поведение):

<input type="button" onclick="SendOwl('https://transactions.sendowl.com/products/8/5C080C0F/purchase');" value="On Click" />

Снимок экрана 1. Обратите внимание, что URL-адрес изменился, и это не наложение (по сравнению со вторым).

введите здесь описание изображения

Пример 2: Открывает форму оформления заказа в модальном окне в виде наложения (Желаемое поведение):

<a href='https://transactions.sendowl.com/products/8/5C080C0F/purchase'>a href</a>

Снимок экрана 2. URL-адрес остается прежним, но форма открывается в виде наложения.

введите здесь описание изображения

Вы также можете увидеть живую демонстрацию на демонстрационной странице SendOwl.

Мое приложение основано на GWT (точнее, на SmartGWT). В моем приложении я вызываю обработчик кнопки onclick, чтобы вызвать Javascript, который вызывает ссылку «Купить сейчас» с помощью вызова JSNI (показан ниже). Но ссылка «Купить сейчас» всегда открывается в полном окне, как в примере 1 выше.

public static native void onBuyNowClick(String url) /*-{
  $wnd.SendOwl(url);
}-*/;

Я пробовал $wnd.open(url), но у него такое же поведение.

Как заставить первый пример вести себя как второй, но все еще использовать кнопку при нажатии?

ОБНОВЛЕНИЕ:

Магия кроется в сценарии sendowl.js. Если я удалю этот скрипт, оба примера будут работать одинаково. Если бы я мог понять, как работает этот сценарий, это могло бы дать некоторые подсказки, чтобы заставить пример 1 работать так же, как пример 2.

Спасибо.


person DFB    schedule 01.03.2016    source источник
comment
чтобы открыть классический href в новом окне, вы можете использовать target= "_blank"   -  person NiKoLaPrO    schedule 01.03.2016
comment
Дело не в этом. Я знаю, как открыть ссылку в новом окне. Пример href (#2) — это желаемое поведение. Требование состоит в том, чтобы оставаться в том же окне и показывать форму оформления заказа в наложении на текущее окно. Если я могу попросить вас перейти на демонстрационную страницу SendOwl (sendowl.com/demo) и нажать на кнопку Демо кредитной карты, чтобы увидеть, как это работает. Надеюсь, это сделает требование более ясным.   -  person DFB    schedule 01.03.2016
comment
Я добавил ответ, который может вам помочь   -  person NiKoLaPrO    schedule 01.03.2016
comment
подождите, я отредактирую свой ответ   -  person NiKoLaPrO    schedule 01.03.2016
comment
Всем привет! Я просто хотел спросить, как дела у GWT сейчас? Могу ли я начать новый проект, используя его, или он станет устаревшим?   -  person sinedsem    schedule 01.03.2016
comment
@KaPaHgaIII Я думаю, вам следует опубликовать новый вопрос для этого. Это не относится к этой теме.   -  person DFB    schedule 03.03.2016


Ответы (3)


Я сам решил проблему, изучив sendowl.js . Это сценарий, который делает всю магию.

Это мой модифицированный скрипт, благодаря которому пример 1 работает точно так же, как пример 2:

<script>
    function SendOwl(url) { 
        sendOwl.addLoadingImage();
        sendOwl.loadIframe ('https://transactions.sendowl.com/products/8/5C080C0F/purchase');
    }
</script>
<script src="https://transactions.sendowl.com/assets/sendowl.js"></script>  

Спасибо всем, кто ответил и попытался помочь.

person DFB    schedule 01.03.2016

Все что тебе нужно это:

<script type="text/javascript" src="https://transactions.sendowl.com/assets/sendowl.js" ></script>
<a href="https://transactions.sendowl.com/products/8/5C080C0F/purchase" rel="nofollow"><input type="button" value="Purchase" /></a>

https://help.sendowl.com/help/article/link/button-codes-to-sell-your-product

У меня работает нормально.
введите здесь описание изображения

person NiKoLaPrO    schedule 01.03.2016
comment
На самом деле я уже пробовал этот подход. Это не имеет значения. Форма просто отображается в том же окне, но не в виде наложения, как в примере 2, а также на демонстрационной странице sendowl, на которую я ссылался в своих комментариях выше. Я добавлю пару скриншотов, чтобы показать проблему. Спасибо за вашу помощь. - person DFB; 01.03.2016
comment
@DFB понял это, сейчас я опубликую ответ - person NiKoLaPrO; 01.03.2016
comment
Я проверил ваш jsfiddle и думаю, что вы все еще не понимаете проблему. Пример a href отлично работает без rel=nofollow и target=_blank. Я спрашиваю, почему onclick (пример 1) не работает так же. Мне нужно использовать кнопку onclick в моем приложении. Я не могу использовать здесь ‹a href='...' ›. Надеюсь, теперь стало понятнее. - person DFB; 01.03.2016
comment
rel='nofollow' не имеет ничего общего с этой проблемой, насколько мне известно. Но спасибо за вашу помощь. - person DFB; 01.03.2016
comment
@DFB Я пришлю вам скриншот, он не будет работать на jsfiddle - person NiKoLaPrO; 01.03.2016
comment
Давайте продолжим обсуждение в чате. - person NiKoLaPrO; 01.03.2016
comment
Да, я знаю, что это не работает на jsfiddle в любом случае. Но если вы создадите простую HTML-страницу на своем локальном компьютере и откроете ее в браузере, вы увидите проблему. В опубликованном вами коде по-прежнему используется «a href». Мне нужно заставить его работать с функцией javascript onclick. - person DFB; 01.03.2016
comment
@DFB я думаю, что нет способа сделать это, даже сайт SendOwl использует только ‹a› и css (класс). вы можете сделать так, чтобы a выглядело как кнопка, поэтому единственный способ сделать это — с помощью ‹a›, потому что javascript изменит местоположение. - person NiKoLaPrO; 01.03.2016
comment
Дело не во внешнем виде кнопки. Но внутри SmartGWT даже ссылки href ведут себя как пример onclick. Я пытаюсь найти способ заставить его работать в оверлее. Еще раз спасибо. - person DFB; 01.03.2016
comment
@DFB Тогда я не знаю :/ - person NiKoLaPrO; 01.03.2016

В GWT вы можете использовать PopupPanel для отображения оверлея. Лично я никогда не пытался встроить страницу во всплывающее окно, но вы можете попробовать добавить Frame внутри всплывающей панели, примерно так:

PopupPanel popup = new PopupPanel();
Frame frame = new Frame("http://www.yourlink.com/");
popup.setWidget(frame);
popup.setGlassEnabled(true);
popup.center();

Что касается URL-адреса, см. документацию и этот поток

person Youssef Lahoud    schedule 01.03.2016
comment
Спасибо. На самом деле я попробовал этот подход в SmartGWT, и он работает до некоторой степени, но с некоторыми сбоями. Я использовал модальное окно SGWT, которое похоже на то, что вы предложили. Некоторые действия внутри формы оформления заказа приводят к ошибке JavaScript при выполнении в модальном окне SGWT. Я все равно должен пойти с этим подходом, если я не найду более чистое решение. Я действительно пытаюсь понять разницу в моих примерах 1 и 2 в терминах чистого HTML/Javascript, оставляя в стороне GWT. - person DFB; 01.03.2016