2012-07-12 39 views
16

Tôi muốn vô hiệu hóa sự kiện onclick bằng CSS. Khả thi?Tắt onclick với CSS :: Có thể?

Hãy nói rằng tôi có

<div id="btnCopy" class="button" onclick="btnCopy(this);"><img src="copy.png"></div> 

và bằng cách thêm lớp "tàn tật"

document.getElementById("btnCopy").className += " disabled"; 

Tôi muốn tắt sự kiện onclick cho các phần tử này, vì vậy onclick="btnCopy(this);" sẽ không hoạt động.

Và bằng cách loại bỏ "tàn tật" lớp

document.getElementById("btnCopy").className = 
    document.getElementById("btnCopy").className.replace(/(?:^|\s)disabled(?!\S)/, ''); 

nó sẽ trở lại bình thường, vì vậy onclick Sự kiện này sẽ được kích hoạt.

+0

CSS được forstyling yếu tố, không phải cho phản ứng (hoặc không) với các sự kiện (trừ: hover thứ). –

+0

Bạn có thể sử dụng thuộc tính html 'disabled' –

+0

': hover' không phải là sự kiện. – BoltClock

Trả lời

9

Thêm một số Javascript vào hàm btnCopy của bạn để kiểm tra xem phần tử tham số có thuộc lớp disabled hay không.

Sử dụng CSS để thay đổi hành vi của JavaScript là không thể. CSS là để tạo kiểu cho các phần tử HTML, JavaScript là để xử lý hành vi của các sự kiện và trang web. CSS và JavaScript là hai điều rất khác nhau. Điều duy nhất có thể với CSS là ngăn người dùng nhấp vào một đầu vào (ví dụ: nút). Với giải pháp CSS, bạn không vô hiệu hóa mã trong sự kiện onclick. Bạn chỉ vô hiệu hóa khả năng của người dùng kích hoạt sự kiện onclick.

Tuy nhiên, có nhiều cách để thay đổi nội dung trên một trang (sử dụng JavaScript nhiều hơn hoặc với một số plugin cho trình duyệt của bạn), có thể nhấp vào nút này mặc dù phần tử giả CSS của bạn. Đó là lý do tại sao sử dụng CSS cho này không được khuyến nghị.

+0

Đó là những gì tôi đang làm bây giờ, nhưng ... sẽ là tốt đẹp để có một cái gì đó gọn gàng với CSS .. –

+2

Như MarcB cho biết như là một bình luận cho câu hỏi của bạn: CSS là cho các yếu tố tạo kiểu tóc, không phải để xử lý các sự kiện. Bạn không thể có được nó nhiều hơn với CSS hơn thế, trừ khi bạn sử dụng giải pháp hackish mua Guy Fawkes để thêm một phần tử giả không thể nhấp vào nút (mà tôi nghĩ không ai trong chúng ta muốn giới thiệu). –

+0

@ Ωmega Tại sao bạn muốn làm điều đó với CSS khi nó có nghĩa là để xử lý những thứ như thế này với JavaScript? Có tốt hơn không khi sử dụng CSS theo cách nó được sử dụng và JavaScript theo cách nó được sử dụng? –

2

Nếu bạn đang sử dụng javascript để thêm và xóa lớp thì tại sao không chỉ sử dụng nó để bật tắt sự kiện nhấp?

+0

Bởi vì một khi tôi đặt 'onclick =" "', sau đó tôi không biết cái gì đã có trước đây ... Tôi muốn bật/tắt các nút với số lượng lớn ... –

+0

@ Ωmega Chỉ cần có một lá cờ trong javascript và trong onclick các sự kiện trong javascript kiểm tra xem biến có đúng/sai không. Nếu không, chỉ cần sử dụng thuộc tính css bị vô hiệu hóa. –

5

Đó là hackish, nhưng tôi sẽ đề nghị sử dụng pseudo-yếu tố:

Trên một nút với một lớp bị tắt, bạn có thể tạo ra một giả yếu tố bao gồm các nút do đó, nó không nhấp được.

Nhưng nó sẽ có ý nghĩa hơn để sử dụng javascript kể từ khi bạn đã sử dụng đó để thêm và loại bỏ các lớp học ...

EDIT: Không được đề xuất ở tất cả, nhưng ở đây bạn đi:

#btnCopy {position:relative;z-index:1;} 

.disabled:before { 
    content:" "; 
    display:block; 
    position:absolute; 
    top:0;left:0;right:0;bottom:0; 
    z-index:10; 
} 
+0

Đã chỉnh sửa câu trả lời của tôi, điều này sẽ hoạt động; – Krimo

+1

Nó không có ý nghĩa gì khi thêm một phần tử giả nơi bạn chỉ có thể sử dụng JavaScript để làm điều đó (nó là mục đích của nó, để xử lý * hành vi *) – Krimo

+0

@ Ωmega Nó không được hỗ trợ chính xác, nó chỉ một hiệu ứng phụ từ những thứ mà CSS hỗ trợ. Tôi đã cập nhật câu trả lời của mình với một ít chi tiết hơn về giải pháp JavaScript vs CSS. –

0

Nếu bạn muốn thêm hoặc xóa lớp "đã tắt", bạn cũng có thể kiểm tra lớp này trong trình xử lý sự kiện của mình và hơn là không có phần tử nào bị vô hiệu hóa lớp.

+0

Đó là những gì tôi đang làm bây giờ ... –

-2
<div id="btnCopy" class="button" 
    onClick="if(this.className.indexOf('disabled') == -1){btnCopy(this);}"> 
    <img src="copy.png"> 
</div> 

nó sẽ phải được thực hiện bằng Javascript. An if(indexOf('disabled') == -1) nên thực hiện thủ thuật.

+1

Chỉ muốn thêm, nó không đẹp. Nó sẽ là tốt hơn để làm điều đó bên trong xử lý sự kiện hoặc có một chức năng ở giữa làm kiểm tra. – Dpolehonski

+3

Ngoài ra, chỉ cần sử dụng indexof trên tên lớp sẽ khớp với lớp "notdisabled", nếu nó tồn tại trên phần tử. –

-3

Một cách để thực hiện nó hoàn toàn thông qua CSS đang hiển thị lớp phủ ẩn không thể nhấp được khi di chuột qua.

Demo: http://jsfiddle.net/FNVmh/1/

+0

Bất cứ điều gì sai trái với cách tiếp cận này? Nó chỉ sử dụng CSS giả cho các mục đích .. Không JS thậm chí .. – techfoobar

+0

Cảm ơn, nhưng tôi không muốn sử dụng các yếu tố 'đầu vào' bên trong vì nhiều lý do hơn, một trong số đó là trọng tâm ... –

+1

Ok. nhưng đầu vào bị tắt, vì vậy nó sẽ không bao giờ lấy nét. bất kỳ lý do nào khác? (trong tò mò, để tôi có thể học được điều gì đó mới .. :) – techfoobar

16

Trong một số trình duyệt bạn có thể đặt pointer-events: none, nhưng điều đó sẽ vô hiệu hóa tất cả các sự kiện chuột không chỉ nhấp chuột. Xem: https://developer.mozilla.org/en/CSS/pointer-events/

+1

+1 :: giải pháp gọn gàng, nhưng (hiện tại) thiếu sự hỗ trợ. –

0

Bạn có thể sử dụng javascript để tắt các nút onclick sự kiện bằng cách thêm dòng javascript này.

Tùy chọn tốt nhất có thể là sử dụng jQuery và kiểm tra xem btnCopy có lớp 'bị tắt' hay không.

if(!$('btnCopy').hasClass('disabled')){ 
    //Add code to copy text here 
} 

Chúc may mắn!

+1

Làm cách nào bạn đảo ngược 'element.onclick = null;' quay lại bản gốc, khi 'bị vô hiệu hóa' bị xóa? Tôi cần bật/tắt hàng loạt bị vô hiệu hóa, để có nhiều yếu tố hơn. Tôi không muốn đặt 'onclick' cho mỗi phần tử trong dòng riêng biệt ... –

13

Bạn có thể thực hiện việc này.

pointer-events: none; 
cursor: default; 

hơn here

+5

Con trỏ bị bỏ qua khi' pointer-events' được đặt thành 'none' –

1

Đây là cách Bootstrap làm điều đó.

.btn.disabled, .btn[disabled] { 
    cursor: not-allowed; 
    opacity: 0.65; 
    filter: alpha(opacity=65); 
    box-shadow: none; 
} 

Bạn chỉ có thể giữ cursor: not-allowed; và nếu bạn không cần phải thiết lập lại trong những phong cách sau đó bạn loại bỏ chúng opacity: 0.65; filter: alpha(opacity=65); box-shadow: none;

Các vấn đề liên quan