jQuery vô hiệu hóa một liên kết


284

Bất cứ ai cũng biết làm thế nào để vô hiệu hóa một liên kết trong jquery mà KHÔNG sử dụng return false;?

Cụ thể, những gì tôi đang cố gắng là vô hiệu hóa liên kết của một mục, thực hiện nhấp chuột vào nó bằng cách sử dụng jquery để kích hoạt một số nội dung, sau đó bật lại liên kết đó để nếu nó được nhấp lại, nó sẽ hoạt động như mặc định.

Cảm ơn. Dave

CẬP NHẬT Đây là mã. Những gì nó cần làm sau khi .expandedlớp đã được áp dụng là để kích hoạt lại liên kết bị vô hiệu hóa.

$('ul li').click(function(e) {
    e.preventDefault();
    $('ul').addClass('expanded');
    $('ul.expanded').fadeIn(300);
    //return false;
});

7
Tại sao yêu cầu không sử dụng trả lại sai? Sử dụng nó, và sau đó xóa trình xử lý sự kiện khi nó không còn áp dụng (hoặc đặt một điều kiện trong đó để trả về các giá trị khác nhau tùy thuộc vào trạng thái của "một số nội dung" được đề cập).
Quentin

Bạn chỉ đang cố gắng thực hiện một số tiền xử lý trước khi liên kết được theo dõi trên cùng một hành động nhấp chuột? tức là bạn không đề xuất hai lần nhấp mà là liên kết nhấp chuột của người dùng, một số hành động xảy ra, liên kết có được thực hiện không?
Lazarus

Mặt khác, bạn có thể giải thích lý do tại sao bạn thực hiện phương pháp này như một sự hiểu biết tốt hơn về không gian vấn đề sẽ cải thiện các câu trả lời.
Lazarus

@lazarus, tôi đang đề xuất 2 lần nhấp vào cùng một liên kết. 1 để làm một số thứ đầu tiên, sau đó thứ 2 để coi liên kết là một liên kết.
davebowker

@daviddorward, Cho đến nay tôi đã thử trả về false và nó tiếp tục đến phần thứ hai của mục tiêu của tôi, tức là không cho phép lần nhấp thứ 2 đi qua. Nếu bạn có thể viết một ví dụ ngắn tôi sẽ rất biết ơn.
davebowker

Câu trả lời:


364
$('#myLink').click(function(e) {
    e.preventDefault();
    //do other stuff when a click happens
});

Điều đó sẽ ngăn hành vi mặc định của một siêu liên kết, đó là truy cập vào href href.

Từ hướng dẫn jQuery :

Đối với nhấp chuột và hầu hết các sự kiện khác, bạn có thể ngăn chặn hành vi mặc định - tại đây, theo liên kết đến jquery.com - bằng cách gọi event.preventDefault () trong trình xử lý sự kiện

Nếu bạn chỉ muốn preventDefault()nếu một điều kiện nhất định được đáp ứng (ví dụ như một cái gì đó bị ẩn), bạn có thể kiểm tra mức độ hiển thị của ul với lớp được mở rộng . Nếu nó hiển thị (nghĩa là không bị ẩn), liên kết sẽ kích hoạt như bình thường, vì câu lệnh if sẽ không được nhập và do đó hành vi mặc định sẽ không bị ngăn chặn:

$('ul li').click(function(e) {
    if($('ul.expanded').is(':hidden')) {
        e.preventDefault();
        $('ul').addClass('expanded');
        $('ul.expanded').fadeIn(300);
    } 
});

3
Với jQuery 1.7+, bạn có thể sử dụng bật / tắt: stackoverflow.com/questions/209029/NH
Lance Cleveland

nếu nó có href và onclick thì nó sẽ hoạt động $ ("# myLink"). attr ('onclick', '') .click (function (e) {e.preventDefault ();});
Ronald McDonald

nhận ra thông qua ajax và jquery Tôi có thể ẩn a href mua có cuộc gọi lại để giữ cho người dọn dẹp không nhận được các liên kết này. Thật sự cảm ơn!
Cesar Bielich 7/07/2015

này bài có cách đơn giản nhất sử dụng bootstrap , hy vọng giúp.
shaijut

107

Thử cái này:

$("a").removeAttr('href');

BIÊN TẬP-

Từ mã cập nhật của bạn:

 var location= $('#link1').attr("href");
 $("#link1").removeAttr('href');
 $('ul').addClass('expanded');
 $('ul.expanded').fadeIn(300);
 $("#link1").attr("href", location);

3
Chơi với href rất hay vì đây là cách nhanh chóng để liên kết một liên kết hoạt động thông qua một sự kiện onclick. Rất rất thông minh!
daitangio

phương pháp tuyệt vời để giữ cho trình duyệt không thêm # trong URI khi thực hiệnhref="#"
Abela

65

Đối với những người khác đến đây thông qua google như tôi - đây là một cách tiếp cận khác:

css:
.disabled {
  color: grey; // ...whatever
}

jQuery:
$('#myLink').click(function (e) {
  e.preventDefault();
  if ($(this).hasClass('disabled'))
    return false; // Do something else in here if required
  else
    window.location.href = $(this).attr('href');
});

// Elsewhere in your code
if (disabledCondition == true)
  $('#myLink').addClass('disabled')
else
  $('#myLink').removeClass('disabled')

Hãy nhớ rằng: không chỉ đây là một lớp css

lớp = "kiểu nút"

nhưng cả hai

class = "vô hiệu hóa nút"

để bạn có thể dễ dàng thêm và xóa các lớp khác với jQuery. Không cần phải chạm ...

Tôi yêu jQuery! ;-)


2
điều này giả định rằng liên kết không có mục tiêu :)
dstarh

2
Thay vì thực hiện tất cả những điều thú vị này, tại sao bạn không giải quyết vấn đề onclick cao hơn trong dom, sử dụng on()để lọc tất cả các a.disabledliên kết và ngăn chặn mặc định. Sau đó, tất cả những gì bạn phải làm là bật / tắt lớp bị vô hiệu hóa và liên kết sẽ tự xử lý khi "bật".
CodeChimp

Không cần "== true" - addClass ('bị vô hiệu hóa') sẽ chạy bất kể. if(disabledCondition)
Fox Wilson

1
@fwilson, trong khi bạn hoàn toàn chính xác, đối với một lập trình viên mới bắt đầu, sẽ dễ hiểu hơn với == true. :)
carmenism

Bất kỳ lý do cụ thể không để đơn giản hóa nó để if ($(this).hasClass('disabled')) { e.preventDefault(); }?
Mir

58

Đây là một giải pháp css / jQuery thay thế mà tôi thích vì độ chặt chẽ và kịch bản tối thiểu hóa của nó:

css:

a.disabled {
  opacity: 0.5;
  pointer-events: none;
  cursor: default;
}

jQuery:

$('.disableAfterClick').click(function (e) {
   $(this).addClass('disabled');
});

7
Từ Mozilla : "Cảnh báo: Việc sử dụng các sự kiện con trỏ trong CSS cho các phần tử không phải là SVG là thử nghiệm. Tính năng được sử dụng là một phần của đặc tả dự thảo UI CSS3, nhưng do nhiều vấn đề mở, đã bị hoãn lại đối với CSS4."
đánh dấu duelin

1
Đó là một sự cân nhắc tốt, nhưng nó hoạt động tốt trong hầu hết các trình duyệt hiện đại.
Peter De Weese

Bạn có thể muốn xem xét việc xâu chuỗi .prop("tabindex", "-1");sauaddClass
Oleg Grishko

19

Bạn có thể loại bỏ nhấp để liên kết bằng cách làm theo;

$('#link-id').unbind('click');

Bạn có thể kích hoạt lại liên kết bằng cách làm theo,

$('#link-id').bind('click');

Bạn không thể sử dụng thuộc tính 'khuyết tật' cho các liên kết.


1
Dễ dàng bật và tắt so với những người khác.
python1981

2
"Bạn không thể sử dụng tài sản 'bị vô hiệu hóa' cho các liên kết." Tự hỏi tại sao không có sự thống nhất giữa một nút và liên kết để vô hiệu hóa. "Vô hiệu hóa" cũng hoạt động cho một liên kết. Nó giống như nói về một chiếc xe Chevy bạn phải nhấn bàn đạp phanh để dừng lại, nhưng đối với nhà sản xuất xe hơi khác này, bạn phải sử dụng đòn bẩy này nằm trên mái nhà.
Eaglei22

14

Nếu bạn đi theo tuyến đường, bạn có thể lưu nó

Để tắt:

$('a').each(function(){
    $(this).data("href", $(this).attr("href")).removeAttr("href");
});

Sau đó kích hoạt lại bằng cách sử dụng:

$('a').each(function(){
    $(this).attr("href", $(this).data("href"));
});

Trong một trường hợp, tôi đã phải làm theo cách này vì các sự kiện nhấp đã bị ràng buộc ở một nơi khác và tôi không kiểm soát được nó.


12

Tôi luôn sử dụng điều này trong jQuery để vô hiệu hóa các liên kết

$("form a").attr("disabled", "disabled");

Bạn cũng có thể sử dụng $("form a").attr("disabled", false);để kích hoạt lại
Alexander Ryhlitsky

9

ví dụ liên kết html:

        <!-- boostrap button + fontawesome icon -->
        <a class="btn btn-primary" id="BT_Download" target="blank" href="DownloadDoc?Id=32">
        <i class="icon-file-text icon-large"></i>
        Download Document
        </a>

sử dụng cái này trong jQuery

    $('#BT_Download').attr('disabled',true);

thêm cái này vào css:

    a[disabled="disabled"] {
        pointer-events: none;
    }

1
Tôi chưa bao giờ bắt gặp thuộc tính CSS này trước đây, nhưng đối với tôi, đây là phương pháp đơn giản nhất để vô hiệu hóa một siêu liên kết. Cái hay của nó là khi bạn loại bỏ lớp chứa thuộc pointer-events: nonetính khỏi các phần tử neo, chúng sẽ quay trở lại làm bất cứ điều gì chúng đã làm trước đây khi nhấp vào. Vì vậy, nếu chúng là các siêu liên kết cơ bản, chúng sẽ quay trở lại điều hướng đến URL trong hrefthuộc tính của chúng và nếu chúng có bộ xử lý sự kiện nhấp chuột, điều đó sẽ hoạt động trở lại. Đơn giản hơn nhiều so với việc lưu hrefcác giá trị và xử lý nhấp chuột.
Philip Stratford

Tôi thích giải pháp này, nó là đơn giản nhất.
louis

Trong số ít "giải pháp" khi không có gì hiệu quả (và gần như từ bỏ con đường này), đã đến với viên ngọc này . Đó là một giải pháp không quá cầu kỳ. Và người duy nhất THỰC SỰ LÀM VIỆC. Thanh danh.
dùng12379095

5

Fav của tôi trong "thanh toán để chỉnh sửa một mặt hàng và ngăn chặn - nhấp chuột tây hoang dã đến bất cứ nơi nào - trong khi thanh toán"

$('a').click(function(e) {
    var = $(this).attr('disabled');
    if (var === 'disabled') {
        e.preventDefault();
    }
});

Vì vậy, nếu tôi muốn rằng tất cả các liên kết bên ngoài trong thanh công cụ hành động thứ hai sẽ bị vô hiệu hóa trong khi ở "chế độ chỉnh sửa" như được mô tả ở trên, tôi sẽ thêm vào chức năng chỉnh sửa

$('#actionToolbar .external').attr('disabled', true);

Liên kết ví dụ sau khi cháy:

<a href="http://goo.gl" target="elsewhere" class="external" disabled="disabled">Google</a>

Và bây giờ bạn CÓ THỂ sử dụng tài sản bị vô hiệu hóa cho các liên kết

Chúc mừng!


3

Bạn nên tìm bạn trả lời ở đây .

Cảm ơn @Will và @Matt cho giải pháp thanh lịch này.

jQuery('#path .to .your a').each(function(){
    var $t = jQuery(this);
    $t.after($t.text());
    $t.remove();
});

3

bạn chỉ có thể ẩn và hiển thị các liên kết như bạn muốn

$(link).hide();
$(link).show();

2

Chỉ cần kích hoạt công cụ, thiết lập một số cờ, trả lại sai. Nếu cờ được đặt - không làm gì cả.


Đã thử điều đó bằng cách thiết lập một lớp, sau đó gọi lớp đó sau nhưng trả về mang sai và ngăn liên kết được gọi.
davebowker

1

unbind()không được dùng nữa jQuery 3, sử dụng off()phương thức thay thế:

$("a").off("click");

0

Tôi biết điều này không phải với jQuery nhưng bạn có thể vô hiệu hóa một liên kết với một số css đơn giản:

a[disabled] {
  z-index: -1;
}

HTML sẽ trông như thế nào

<a disabled="disabled" href="/start">Take Survey</a>

0

Điều này hoạt động cho các liên kết có thuộc tính onclick được đặt nội tuyến. Điều này cũng cho phép bạn sau đó loại bỏ "return false" để kích hoạt nó.

        //disable all links matching class
        $('.yourLinkClass').each(function(index) {
            var link = $(this);
            var OnClickValue = link.attr("onclick");
            link.attr("onclick", "return false; " + OnClickValue);
        });

        //enable all edit links
        $('.yourLinkClass').each(function (index) {
            var link = $(this);
            var OnClickValue = link.attr("onclick");
            link.attr("onclick", OnClickValue.replace("return false; ", ""));
        });

-2

Chỉ cần sử dụng $("a").prop("disabled", true);. Điều này thực sự sẽ vô hiệu hóa phần tử liên kết. Cần phải có prop("disabled", true). Đừng dùngattr("disabled", true)

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.