2013-03-31 38 views
61

Có cách nào để thiết lập phần tử sao cho nó thực hiện một thao tác trên nhấp chuột trái (nhấp chuột phải) và sau đó thực hiện một hành động khác khi nhấp chuột phải không?Làm cách nào để xử lý các sự kiện nhấp chuột phải trong angular.js?

Ngay bây giờ tôi có một cái gì đó như:

<span ng-click="increment()">{{getPointsSpent()}}</span> 

Và tôi muốn cũng có thể kích chuột phải vào khoảng để thực hiện chức năng giảm một();

Trả lời

125

Bạn có thể sử dụng một chỉ thị để ràng buộc hành động cụ thể trên click chuột phải, bằng cách sử dụng sự kiện contextmenu:

app.directive('ngRightClick', function($parse) { 
    return function(scope, element, attrs) { 
     var fn = $parse(attrs.ngRightClick); 
     element.bind('contextmenu', function(event) { 
      scope.$apply(function() { 
       event.preventDefault(); 
       fn(scope, {$event:event}); 
      }); 
     }); 
    }; 
}); 

Code example on fiddle

+0

Điều này làm việc tuyệt vời, nhưng nếu tôi cố gắng mở một cửa sổ mới từ trình xử lý, nó sẽ bị chặn khi được kích hoạt bằng nhấp chuột phải và không khi được kích hoạt bằng nhấp chuột trái. Tôi đang trên chrome. http://jsfiddle.net/aslakhellesoy/QLHUV/3/ –

+0

@ AslakHellesøy Có lẽ vì trình duyệt không nhận ra chỉ thị ng-right-click là sự kiện do người dùng khởi tạo. – Magne

+0

@ AslakHellesøy Làm việc cho tôi trong Chrome (phiên bản 34.0.1847.116 m) – Martin

7

Một cách là sử dụng một chỉ thị liên kết trình xử lý sự kiện với sự kiện contextmenu. Tôi đã có thời gian khó khăn để ngăn chặn sủi bọt để ngăn trình đơn mặc định hiển thị để thêm trình xử lý tập lệnh gốc cho document. Đã thử với e.stopPropagation(), e.preventDefault(), return false v.v. Kiểm tra các mục tiêu trong xử lý tài liệu dường như làm việc tốt

app.directive('rightClick',function(){ 
    document.oncontextmenu = function (e) { 
     if(e.target.hasAttribute('right-click')) { 
      return false; 
     } 
    }; 
    return function(scope,el,attrs){ 
     el.bind('contextmenu',function(e){ 
      alert(attrs.alert);    
     }) ; 
    } 
}); 
<button right-click alert="You right clciked me">Right click me</button> 

DEMO http://plnkr.co/edit/k0TF49GVdlhMuioSHW7i

1

Bạn có thể sử dụng số directive này.

<div ng-controller="demoCtrl" save-content="classic-html"> 
    <div contextmenu="{{lists}}" class="box" click-menu="clickMenu(item)" right-click="rightClick($event)"> 
    <span>normal dropmenu</span> 
    </div> 
</div> 

<script type="text/javascript"> 
angular.module('demo', ['ngContextMenu']) 

    .controller('demoCtrl', ['$scope', function($scope) { 
    $scope.lists = [{ 
     name: '11' 
    }, { 
     name: '22' 
    }] 

    $scope.clickMenu = function (item) { 
     console.log(item); 
    }; 

    $scope.rightClick = function (event) { 
     console.log(event); 
    }; 
    }]) 
</script> 
20

Xin chào, đây là một câu hỏi cũ nhưng tôi có một giải pháp mà tôi nghĩ có thể đơn giản hơn trong một số trường hợp. Các ngMousedown (và ngMouseup) chỉ được kích hoạt bởi nút chuột phải và có quyền truy cập vào các sự kiện chuột ban đầu thông qua $event vì vậy bạn có thể làm theo cách này:

<span ng-mousedown="handleClick($event)" 
     oncontextmenu="return false"> <!-- use this to prevent context menu --> 
      {{getPointsSpent()}} 
</span> 

Sau đó, trong bộ điều khiển, bạn có thể làm như sau:

$scope.handleClick(evt) { 
    switch(evt.which) { 
     case 1: 
      increment(); // this is left click 
      break; 
     case 2: 
      // in case you need some middle click things 
      break; 
     case 3: 
      decrement(); // this is right click 
      break; 
     default: 
      alert("you have a strange mouse!"); 
      break; 
    } 
} 

Đây là working fiddle. Nó hoạt động giống như câu trả lời được chấp nhận nhưng không yêu cầu tạo ra một chỉ thị hoàn toàn mới. Mặc dù chỉ thị có thể là giải pháp tốt hơn, đặc biệt nếu bạn định đính kèm các chức năng nhấp chuột phải vào nhiều thứ. Nhưng dù sao, một lựa chọn khác.

+0

Rất tuyệt, cảm ơn. Đối với bất kỳ ai gặp sự cố với nó, thuộc tính oncontextmenu phải chính xác trên phần tử được nhấp chuột phải. Đã có nó trên container và menu ngữ cảnh tiếp tục mở. (Chrome 51.0.2700.0 dev-m) –

+1

@ Termi2610 hoạt động đối với tôi bằng trình đơn oncontextmenu trên vùng chứa. phiên bản chrome: 54.0.2840.71 – yannick1976

+0

@ yannick1976 Chỉ cần thử nghiệm nó với phiên bản hiện tại của tôi (53.0.2785.143 m) với cùng một container tôi đã sử dụng trong tháng tư. Và có, nó hoạt động. Có vẻ như đó là một lỗi trong phiên bản tôi đã sử dụng trước đây. –

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