Làm cách nào để tắt HREF nếu onclick được thực thi?


95

Tôi có một mỏ neo với cả hai HREFONCLICKthuộc tính được đặt. Nếu được nhấp và Javascript được bật, tôi muốn nó chỉ thực thi ONCLICKvà bỏ qua HREF. Tương tự như vậy, nếu Javascript bị vô hiệu hóa hoặc không được hỗ trợ, tôi muốn nó đi theo HREFURL và bỏ qua ONCLICK. Dưới đây là một ví dụ về những gì tôi đang làm, sẽ thực thi JS và theo liên kết đồng thời (thường JS được thực thi và sau đó trang thay đổi):

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

cách tốt nhất để làm điều này là gì?

Tôi hy vọng một câu trả lời về Javascript, nhưng tôi sẽ chấp nhận bất kỳ phương pháp nào miễn là nó hoạt động, đặc biệt nếu điều này có thể được thực hiện với PHP. Tôi đã đọc " trang thực thi và chuyển hướng liên kết a href trước khi hàm onclick của javascript có thể kết thúc " rồi, nhưng nó chỉ trì hoãn HREFchứ không vô hiệu hóa hoàn toàn. Tôi cũng đang tìm kiếm thứ gì đó đơn giản hơn nhiều.


4
Tôi sẽ sử dụng để neo một cái có href và một cái không có. Khi tải trang, hãy kiểm tra xem javascript đã được bật chưa, nếu nó hiển thị đúng ký tự neo khác thì hiển thị cái khác.
ewein

1
@ewein Tại sao? Điều đó nghe có vẻ như rất nhiều đánh dấu cho một tính năng đơn giản.
Supuhstar

Câu trả lời:


58

Bạn có thể sử dụng giải pháp chưa được chỉnh sửa đầu tiên, nếu bạn đặt return đầu tiên trong onclickthuộc tính:

<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;
}

Ví dụ: https://jsfiddle.net/FXkgV/289/


1
Tôi thích nó sạch sẽ như thế nào! Tuy nhiên, giải pháp được chấp nhận cung cấp cho tôi nhiều quyền kiểm soát hơn về việc liệu HREF có bị bỏ qua hay không
Supuhstar

Trong vài năm qua, tôi đã thay đổi suy nghĩ của mình; đây là một giải pháp tốt hơn
Supuhstar

Thật là bổ ích!
DrunkDevKek

Nhưng điều này không hoạt động với JSX react. Điều này sẽ hoạt động?
Coder

1
điều này đã tiết kiệm rất nhiều thời gian.
Mark Lozano

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

Nếu bạn trả về false, nó sẽ ngăn hành động mặc định (chuyển đến href).

Chỉnh sửa: Rất tiếc, cách này dường như không hiệu quả, bạn có thể làm như sau:

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

1
Câu trả lời đã chỉnh sửa không trả lời câu hỏi, vì nó xóa liên kết thực tế.
Itai Bar-Haim

12
cách khác sử dụng onclick="return yes_js_login();"với yes_js_loginquay trở lạifalse
Uwe Kleine-König

1
@cgogolin xem câu trả lời của tôi.
Gabe Rogan

cho những ai vẫn còn bị mắc kẹt, có thể thêm dòng nàyevent.stopImmediatePropagation()
didxga

34

Chỉ cần vô hiệu hóa hành vi mặc định của trình duyệt bằng cách sử dụng preventDefaultvà chuyển vào eventtrong HTML của bạn.

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

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

1
trở lại sai không làm việc trong polymer ... trên giải pháp đã làm việc ... Cảm ơn
Paras Sachapara

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

với jQuery:

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

với 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>

Bạn chỉ định lớp .ignore-clickcho bao nhiêu phần tử bạn thích và nhấp chuột vào những phần tử đó sẽ bị bỏ qua


Đây là một giải pháp tuyệt vời! Tôi đã sử dụng nó cho các nút mà tôi có mà khi nhấp vào, một lớp giả .btn-loadingđược thêm vào liên kết được nhấp, sau đó nếu thành công, một dấu kiểm (trên lỗi X) sẽ thay thế hoạt ảnh đang tải. Tôi không muốn nút có thể được nhấp lại trong một số trường hợp (đối với cả thành công và lỗi), bằng cách sử dụng này, tôi có thể đơn giản $(elemnent).addClass('disabled')và dễ dàng đạt được chức năng mà tôi đang tìm kiếm một cách thanh lịch!
Matthew Mathieson

14

Bạn có thể sử dụng mã đơn giản này:

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

5

Sẽ đơn giản hơn nếu bạn truyền một tham số sự kiện như sau:

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

1
Điều đó không hiệu quả với tôi. Tôi phải sử dụng e.preventDefault ()
Milan Simek

2

Điều này có thể giúp. Không cần JQuery

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

Mã này thực hiện những việc sau: Chuyển liên kết tương đối đến Trình xem Google Tài liệu

  1. Nhận phiên bản liên kết đầy đủ của anchor bằng cách this.href
  2. mở liên kết cửa sổ mới.

Vì vậy, trong trường hợp của bạn, điều này có thể hoạt động:

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

1

Tôi đã giải quyết một tình huống trong đó tôi cần một mẫu cho phần tử sẽ xử lý thay thế URL thông thường hoặc lệnh gọi javascript, trong đó hàm js cần tham chiếu đến phần tử đang gọi. Trong javascript, "this" hoạt động như một tự tham chiếu chỉ trong ngữ cảnh của một phần tử biểu mẫu, ví dụ: một nút. Tôi không muốn có một nút, chỉ là sự xuất hiện của một liên kết thông thường.

Ví dụ:

<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>

Thuộc tính href và onClick có cùng giá trị, tôi nên thêm "return false" vào onClick khi đó là một lệnh gọi javascript. Có "return false" trong hàm được gọi không hoạt động.


tại sao có hai? Tại sao bạn lại đặt JS vào HREF?
Supuhstar

Supuhstar, Mã thực tế là động, javascript và sẽ tạo ra một phần tử <a> cho vài trăm mục được xác định bên ngoài. Mỗi mục sẽ chỉ định một địa chỉ liên kết tĩnh và đó là nơi mà phần tử <a> được tạo sẽ sử dụng "hành vi href" thông thường. Hoặc, một lệnh gọi hàm javascript được chỉ định cho mục, trong trường hợp đó, hành vi của phần tử <a> được tính toán, dựa trên ngữ cảnh của phần tử. Và trong mã cho trình tạo <a>, tôi chỉ muốn sao chép bất cứ thứ gì được chỉ định cho từng phần tử, không kiểm tra xem đó là địa chỉ liên kết hay lệnh gọi javascript funtion.
Bo Johanson

Tôi không hiểu làm thế nào điều này trả lời câu hỏi của tôi. Ai nói tôi muốn có vài trăm liên kết? Tôi thực sự không hiểu điểm của tất cả những điều này, hoặc thậm chí một nửa những gì bạn vừa nói.
Supuhstar

0

Điều này đã làm việc cho tôi:

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

Cảm ơn bạn đã trả lời và chào mừng bạn đến với Stack Exchange! Thật không may, điều này dường như không bổ sung thêm bất kỳ kiến ​​thức mới nào, vì có vẻ như các câu trả lời trước đây đã gợi ý điều này. Nếu bạn đồng ý, thì tốt hơn là hãy ủng hộ chúng. Nếu bạn không đồng ý, vui lòng chỉnh sửa câu trả lời của bạn để kiến ​​thức mới của bạn được đưa ra ánh sáng!
Supuhstar

0

Trong trường hợp của tôi, tôi gặp điều kiện khi người dùng nhấp vào phần tử "a". Điều kiện là:

Nếu phần khác có nhiều hơn mười mục, thì người dùng sẽ không được chuyển hướng đến trang khác.

Nếu phần khác có ít hơn mười mục, thì người dùng sẽ được chuyển hướng đến trang khác.

Chức năng của các phần tử "a" phụ thuộc vào thành phần khác. Mã trong sự kiện nhấp chuột như sau:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.