Як я можу відключити HREF, якщо виконано onclick?


95

У мене є якір з як HREF і ONCLICKатрибути встановлені. Якщо клацнути і Javascript увімкнено, я хочу, щоб він лише виконувався ONCLICKта ігнорував HREF. Так само, якщо Javascript вимкнено або не підтримується, я хочу, щоб він переходив за HREFURL-адресою та ігнорував ONCLICK. Нижче наведено приклад того, що я роблю, який би виконував JS і переходив за посиланням одночасно (зазвичай JS виконується, а потім сторінка змінюється):

<A HREF="http://example.com/no-js-login" ONCLICK="yes_js_login()">Log in</A>

який найкращий спосіб це зробити?

Я сподіваюся на відповідь Javascript, але я прийму будь-який метод, якщо він працює, особливо якщо це можна зробити за допомогою PHP. Я вже читав " посилання href виконує та перенаправляє сторінку до того, як функція javascript onclick зможе закінчити ", але вона лише затримує HREF, але не повністю її відключає. Я також шукаю щось набагато простіше.


4
Я б використав для закріплення одного з href і одного без. Під час завантаження сторінки перевірте, чи увімкнено javascript, якщо він є, покажіть правильний якір, інакше покажіть інший.
ewein

1
@ewein Чому? Це звучить як надзвичайно багато розмітки для простої функції.
Супухстар

Відповіді:


58

Ви можете використовувати перше нередаговане рішення, якщо в onclickатрибуті ставите return першим :

<a href="https://example.com/no-js-login" onclick="return yes_js_login();">Log in</a>

yes_js_login = function() {
     // Your code here
     return false;
}

Приклад: https://jsfiddle.net/FXkgV/289/


1
Мені подобається, наскільки це чисто! Однак прийняте рішення дає мені більше контролю над тим, чи ігнорується HREF
Супухстар

За останні пару років я передумав; це краще рішення
Supuhstar

Як здорово!
DrunkDevKek

Але це не працює з JSX-реакцією. Чи вдасться це?
Кодер

1
це заощадило багато часу.
Марк Лозано

61
    yes_js_login = function() {
         // Your code here
         return false;
    }

Якщо ви повернете false, це повинно запобігти дії за замовчуванням (перехід до href).

Редагувати: Вибачте, що, здається, не працює, замість цього ви можете зробити наступне:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>

1
Відредагована відповідь не відповідає на питання, оскільки видаляє фактичне посилання.
Itai Bar-Haim

12
в якості альтернативи використання onclick="return yes_js_login();"з yes_js_loginповерненнямfalse
Уве Клейне-Кеніг

1
@cgogolin див. мою відповідь.
Гейб Роган,

для тих, хто все ще застряг, може додати цей рядокevent.stopImmediatePropagation()
didxga

33

Просто відключіть поведінку браузера за замовчуванням, використовуючи preventDefaultі передайте eventв свій HTML.

<a href=/foo onclick= yes_js_login(event)>Lorem ipsum</a>

yes_js_login = function(e) {
  e.preventDefault();
}

1
return false не спрацювало в полімері ... наведене вище рішення спрацювало ... Дякую
Парас Сачапара

16
<a href="http://www.google.com" class="ignore-click">Test</a>

з jQuery:

<script>
    $(".ignore-click").click(function(){
        return false;
    })
</script>

з JavaScript

<script>
        for (var i = 0; i < document.getElementsByClassName("ignore-click").length; i++) {
            document.getElementsByClassName("ignore-click")[i].addEventListener('click', function (event) {
                event.preventDefault();
                return false;
            });
        }
</script>

Ви призначаєте клас .ignore-clickстільки елементів, скільки вам подобається, і клацання по цих елементах буде проігноровано


Це чудове рішення! Я використовував його для кнопок, які у мене є, що при натисканні псевдо-клас .btn-loadingдодається до клацаного посилання, тоді в разі успіху галочка (при помилці X) замінює анімацію завантаження. Я не хочу, щоб у деяких випадках можна було натиснути кнопку знову (як для успіху, так і для помилки), використовуючи це, я можу просто $(elemnent).addClass('disabled')і легко досягти функціональності, яку я шукав, елегантно!
Метью Метьєсон,

14

Ви можете використовувати цей простий код:

<a href="" onclick="return false;">add new action</a><br>

5

Це простіше, якщо ви передаєте такий параметр події:

<a href="#" onclick="yes_js_login(event);">link</a>
function yes_js_login(e) {
    e.stopImmediatePropagation();
}

1
Це не працює для мене. Я повинен використовувати e.preventDefault ()
Мілан Сімек

2

Це може допомогти. JQuery не потрібен

<a href="../some-relative-link/file" 
onclick="this.href = 'https://docs.google.com/viewer?url='+this.href; this.onclick = '';" 
target="_blank">

Цей код робить наступне: Передайте відносне посилання в Google Docs Viewer

  1. Отримайте повну версію посилання на прив'язку до this.href
  2. відкрити посилання в новому вікні.

Отже, у вашому випадку це може спрацювати:

<a href="../some-relative-link/file" 
onclick="this.href = 'javascript:'+console.log('something has stopped the link'); " 
target="_blank">

1

Я вирішив ситуацію, коли мені потрібен шаблон для елемента, який би міг обробляти звичайну URL-адресу або виклик javascript, де функція js потребує посилання на викличний елемент. У javascript "this" працює як самовідсилання лише в контексті елемента форми, наприклад, кнопки. Я не хотів кнопки, просто поява звичайного посилання.

Приклади:

<a onclick="http://blahblah" href="http://blahblah" target="_blank">A regular link</a>
<a onclick="javascript:myFunc($(this));return false" href="javascript:myFunc($(this));"  target="_blank">javascript with self reference</a>

Атрибути href та onClick мають однакові значення, за винятком того, що я додаю "return false" на onClick, коли це виклик javascript. Наявність функції "return false" у викликаній функції не спрацювало.


чому їх два? Чому ви ставите JS в HREF?
Супухстар

Supuhstar, Фактичний код є динамічним, javascript, і буде генерувати елемент <a> для кількох сотень елементів, які визначені зовні. У кожному елементі буде вказана статична адреса посилання, і саме там сформований елемент <a> повинен використовувати звичайну "поведінку href". Або для елемента вказано виклик функції javascript, і в цьому випадку обчислюється поведінка елемента <a> на основі контексту елемента. І в коді для генератора <a> я просто хотів скопіювати все, що вказано для кожного елемента, не перевіряючи, чи це адреса посилання, чи виклик функції JavaScript.
Бо Йохансон,

Я не розумію, як це відповідає на моє запитання. Хто сказав, що я хочу кілька сотень посилань? Я справді не розумію сенсу всього цього, а то й половини того, що ви щойно сказали.
Супухстар

0

Це працювало для мене:

<a href="" onclick="return false;">Action</a>

Дякуємо за вашу відповідь та ласкаво просимо до Stack Exchange! На жаль, це, здається, не додає ніяких нових знань, оскільки, схоже, попередні відповіді вже натякають на це. Якщо ви погоджуєтеся, тоді краще підтримати їх. Якщо ви не згодні, будь ласка, відредагуйте свою відповідь, щоб з’явились ваші нові знання!
Супухстар

0

У моєму випадку у мене була умова, коли користувач натискав елемент "a". Умовою було:

Якщо інший розділ містив більше десяти пунктів, тоді користувача не слід перенаправляти на іншу сторінку.

Якщо в іншому розділі було менше десяти пунктів, тоді користувача слід перенаправити на іншу сторінку.

Функціональність елементів "а" залежить від іншого компонента. Код у події кліку є наступним:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.