Advertisement
Guest User

Untitled

a guest
Sep 18th, 2014
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           LinkDragSelectionForChrome
  3. // @description    Opera like link selection for chrome.
  4. // @namespace      http://d.hatena.ne.jp/Griever/
  5. // @author         Griever
  6. // @license        MIT License
  7. // @match          http://*/*
  8. // @match          https://*/*
  9. // @version        0.0.1
  10. // ==/UserScript==
  11.  
  12. function LinkDragSelection(){
  13.     this.init.apply(this, arguments);
  14. }
  15. LinkDragSelection.prototype = {
  16.     moved_flag: false,
  17.     init: function(event) {
  18.         this.range = document.caretRangeFromPoint(event.pageX - scrollX, event.pageY - scrollY);
  19.         var sel = getSelection();
  20.         if (!sel.isCollapsed && sel.getRangeAt(0).isPointInRange(this.range.startContainer, this.range.startOffset))
  21.             return;
  22.         this.screenX = event.screenX;
  23.         this.screenY = event.screenY;
  24.         addEventListener("mousemove", this, false);
  25.         addEventListener("mouseup", this, false);
  26.     },
  27.     uninit: function() {
  28.         removeEventListener("mousemove", this, false);
  29.         removeEventListener("mouseup", this, false);
  30.         removeEventListener("dragstart", this, false);
  31.         setTimeout(function() {
  32.             removeEventListener("click", this, false);
  33.         }.bind(this), 100);
  34.     },
  35.     handleEvent: function(event) {
  36.         switch(event.type){
  37.             case "mousemove":
  38.                 if (this.moved_flag) {
  39.                     var range = document.caretRangeFromPoint(event.pageX - scrollX, event.pageY - scrollY);
  40.                     if (range)
  41.                         getSelection().extend(range.startContainer, range.startOffset);
  42.                 } else {
  43.                     this.moveX = event.screenX;
  44.                     this.moveY = event.screenY;
  45.                     this.checkXY();
  46.                 }
  47.                 break;
  48.             case "mouseup":
  49.                 this.uninit();
  50.                 break;
  51.             case "dragstart":
  52.                 event.currentTarget.removeEventListener(event.type, this, false);
  53.                 if (this.moved_flag) {
  54.                     event.preventDefault();
  55.                     event.stopPropagation();
  56.                 } else {
  57.                     this.checkXY();
  58.                 }
  59.                 break;
  60.             case "click":
  61.                 event.currentTarget.removeEventListener(event.type, this, false);
  62.                 if (!getSelection().isCollapsed) {
  63.                     event.preventDefault();
  64.                     event.stopPropagation();
  65.                 }
  66.                 break;
  67.         }
  68.     },
  69.     selectionStart: function() {
  70.         this.moved_flag = true;
  71.         getSelection().collapse(this.range.startContainer, this.range.startOffset);
  72.         addEventListener("dragstart", this, false);
  73.         addEventListener("click", this, false);
  74.     },
  75.     checkXY: function() {
  76.         var x = Math.abs(this.screenX - this.moveX);
  77.         var y = Math.abs(this.screenY - this.moveY);
  78.         if (x >= 5 && x > y) {
  79.             this.selectionStart();
  80.         } else if (y >= 5) {
  81.             this.uninit();
  82.         }
  83.     },
  84. };
  85.  
  86. addEventListener("mousedown", function(event) {
  87.     if (event.button != 0 || event.ctrlKey || event.altKey || event.shiftKey) return;
  88.     if (!event.target.webkitMatchesSelector('a[href], a[href] *')) return;
  89.     new LinkDragSelection(event);
  90. }, false);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement