2009-06-09 6 views
256

Bất kỳ ai biết cách vô hiệu hóa liên kết trong jquery KHÔNG sử dụng return false;? Cụ thể, những gì tôi đang cố gắng làm là vô hiệu hóa liên kết của một mục, thực hiện một cú nhấp chuột vào nó bằng cách sử dụng jquery, nó kích hoạt một số nội dung, sau đó kích hoạt lại liên kết đó để nếu nó được nhấp một lần nữa nó hoạt động như mặc định. Quay lại đầu trangjQuery tắt liên kết

Cảm ơn. Dave

CẬP NHẬT Đây là mã. Điều cần làm sau khi lớp .expanded được áp dụng là bậ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; 
}); 
+6

Tại sao yêu cầu không sử dụng trả về false? Sử dụng nó, và sau đó xóa xử lý sự kiện khi nó không còn áp dụng (hoặc đặt một điều kiện trong nó để 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

+0

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 nhấp chuột 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 theo dõi? – Lazarus

+0

Nếu không, bạn có thể giải thích tại sao bạn đang sử dụng cách tiếp cận này như là một sự hiểu biết tốt hơn về không gian vấn đề sẽ cải thiện câu trả lời. – Lazarus

Trả lời

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

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

Từ jQuery tutorial:

Đố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 các hành vi mặc định - đây, theo link dẫn tới jquery.com - bằng cách gọi event.preventDefault() trong xử lý sự kiện

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

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

Với jQuery 1.7+ bạn có thể sử dụng bật/tắt: http://stackoverflow.com/questions/209029/best-way-to-remove-an-event-handler-in-jquery –

+0

nếu có href và onclick điều này sẽ làm việc $ ("# myLink"). attr ('onclick', '') .click (function (e) { e.preventDefault(); }); –

+0

được thực hiện thông qua ajax và jquery Tôi có thể ẩn a href mua có cuộc gọi lại để giữ cho các mẩu tin lưu niệm khỏi các liên kết này. Thật sự cảm ơn! –

2

Chỉ kích hoạt nội dung, đặt một số cờ, trả về false. Nếu cờ được đặt - không làm gì cả.

+0

Đã cố gắng bằng cách thiết lập một lớp, sau đó gọi lớp đó sau đó nhưng trả về false thực hiện thông qua, và ngăn chặn các liên kết được gọi. – davebowker

95

Hãy thử điều này:

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

Edit-

Từ mã được cập nhật:

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à một cách nhanh chóng để loại bỏ liên kết thực hiện hành động thông qua sự kiện onclick. Rất rất thông minh! – daitangio

+0

phương pháp ngọt ngào để ngăn trình duyệt thêm # trong URI khi thực hiện 'href =" # "' – Abela

58

Đối với những người đến đây qua google như tôi - đây là 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

class = "buttonstyle"

mà còn hai số này

class = "buttonstyle disabled"

để 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 chạm vào href ...

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 kỳ diệu này, tại sao không trong dom, sử dụng 'on()' để lọc tất cả các liên kết 'a.disabled' 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

+0

Không cần "== true" - addClass ('disabled') sẽ chạy bất kể. 'if (disabledCondition)' –

44

Dưới đây là một giải pháp thay thế css/jQuery mà tôi thích cho terseness và kịch bản giảm thiểu:

css:

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

jQuery:

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

[Từ Mozilla] (https://developer.mozilla.org/en/CSS/pointer-events): "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 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 giao diện người dùng CSS3 nhưng, do nhiều vấn đề mở, đã bị hoãn lại với CSS4." –

+1

Thats là một xem xét tốt, nhưng nó sẽ xảy ra để làm việc tốt trong hầu hết các trình duyệt hiện đại. –

+1

Điều này là hoàn toàn tuyệt vời 1. Muốn tôi có thể sử dụng nó, nhưng tôi cần phải hỗ trợ IE ... – Ziggy

3

Bạn nên tìm bạn trả lời here.

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(); 
}); 
12

Bạn có thể xóa 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 sau,

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

Bạn không thể sử dụng 'disabled' bất động sản cho các liên kết.

+0

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

+1

"Bạn không thể sử dụng thuộc tính 'bị vô hiệu hóa' cho các liên kết." Tự hỏi tại sao không có sự nhất quán giữa nút và liên kết để tắt. " Nó cũng giống như nói cho 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, bạn phải sử dụng đòn bẩy này nằm trên mái nhà. – eaglei22

4

fav của tôi trong "thanh toán để chỉnh sửa một mục và ngăn chặn tây hoang dã -wild nhấp chuột để anywhere- trong khi ở một kiểm tra" các chức năng

$('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 một thanh công cụ hành động thứ hai nên bị vô hiệu hóa trong khi "chỉnh sửa chế độ" như mô tả ở trên, tôi sẽ thêm vào các chức năng chỉnh sửa

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

liên kết ví dụ sau vụ hỏa hoạn:

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

Và bây giờ bạn có thể dùng tài sản khuyết tật cho các liên kết

Cheers!

5

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

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

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

Để vô hiệu hóa:

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

Sau đó kích hoạt lại 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 bởi vì các sự kiện nhấp chuột đã bị ràng buộc ở một nơi khác và tôi không kiểm soát được nó.

1

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

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

Tôi biết điều này là 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 trông giống như

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

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