2013-08-26 125 views
8

如何在Angular 1.1.5的輸入中執行「粘貼」事件的功能?我知道有一個ng-change指令的輸入。但每次輸入改變時都會觸發,我只需要在初始粘貼時進行一次。Angular [ngPaste]中的「粘貼」事件

用例:我有一個URL輸入。我想在用戶粘貼URL後執行一個函數。用戶也可以手動輸入URL並按Enter鍵執行該功能。

-

更新:由於角1.2.0,ngPaste是土生土長的指令。

+0

爲什麼不創建一個偵聽當輸入被粘貼到一個自定義指令? –

+0

你可以用這樣的一些jquery技巧創建一個指令http://stackoverflow.com/questions/686995/jquery-catch-paste-input – zsong

回答

27

由於Angular 1.2.0有一個ngPaste指令。請使用以下方式:

<input type='text' ng-paste='handlePaste($event)'> 

要通過價值通俗易懂,使用:

<input type='text' ng-paste='handlePaste($event.clipboardData.getData('text/plain'))'> 
+1

僅供參考,沒有'$ event.clipboardData',但有'$ event.originalEvent ' –

9

在功能上,你應該使用originalEvent

<input type="text" ng-paste="paste($event)" /> 

功能:

$scope.paste = function (e) { 
    console.log(e.originalEvent.clipboardData.getData('text/plain')); 
} 
+1

這一個實際上工作。 –

4

想要共享我的解決方案來支持不使用剪貼板API的瀏覽器。這應該適用於角度支持的任何瀏覽器。

HTML:

<input type="text" ng-paste="copyPasted($event)"> 

JS:

$scope.copyPasted = function ($event){ 
    if(typeof $event.originalEvent.clipboardData !== "undefined"){ 
     $scope.handlePastedData($event.originalEvent.clipboardData.getData('text/plain')); 
    } else { // To support browsers without clipboard API (IE and older browsers) 
     $timeout(function(){ 
      $scope.handlePastedData(angular.element($event.currentTarget).val()); 
     }); 
    } 
}; 
+0

這可能是正確的(或更完整的)答案! –

1

我已經實現這種解決方案來淨化用自定義過濾器所粘貼的文本相對於當前的輸入選擇(也由IE11支持)的

JS:

vm.pasteInput = pasteInput; 

function pasteInput(ev){ 
    var pastedData =''; 
    var domElement = ev.currentTarget; 

    if(typeof ev.originalEvent.clipboardData !== "undefined"){ 
    pastedData = ev.originalEvent.clipboardData.getData('text/plain'); 
    } else if(window.clipboardData){ 
    pastedData = window.clipboardData.getData('Text'); 
    ev.returnValue = false; 
    } 

    pastedData = $filter('inputtext')(pastedData); 

    // inject in correct position between selection 
    if (document.selection) { // IE11 
    domElement.focus(); 
    var sel = document.selection.createRange(); 
    sel.text = pastedData; 
    domElement.focus(); 
    } else if (domElement.selectionStart || domElement.selectionStart === 0){ 
    var startPos = domElement.selectionStart; 
    var endPos = domElement.selectionEnd; 
    domElement.value = domElement.value.substring(0, startPos) + pastedData + domElement.value.substring(endPos, domElement.value.length); 
    domElement.focus(); 
    domElement.selectionStart = startPos + pastedData.length; 
    domElement.selectionEnd = startPos + pastedData.length; 
    } else { 
    domElement.value += pastedData; 
    domElement.focus(); 
    } 

    ev.stopPropagation(); 
    ev.preventDefault(); 

    // update model 
    vm.input.value = domElement.value; 

} 

HTML:

<input type="text" ng-model="vm.input.value" ng-paste="vm.pasteInput($event)" /> 
+0

var pastedData = $ window.clipboardData.getData('Text');正在爲IE 11工作。它節省了我的時間 –