⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsdraganddrop.js

📁 用javascript实现拖拽功能的类
💻 JS
📖 第 1 页 / 共 2 页
字号:
//@line 39 "/d/desktopx/mozilla/toolkit/content/nsDragAndDrop.js"/**  *  nsTransferable - a wrapper for nsITransferable that simplifies *                   javascript clipboard and drag&drop. for use in *                   these situations you should use the nsClipboard *                   and nsDragAndDrop wrappers for more convenience **/  var nsTransferable = {  /**   * nsITransferable set (TransferData aTransferData) ;   *   * Creates a transferable with data for a list of supported types ("flavours")   *    * @param TransferData aTransferData   *        a javascript object in the format described above    **/   set: function (aTransferDataSet)    {      var trans = this.createTransferable();      for (var i = 0; i < aTransferDataSet.dataList.length; ++i)         {          var currData = aTransferDataSet.dataList[i];          var currFlavour = currData.flavour.contentType;          trans.addDataFlavor(currFlavour);          var supports = null; // nsISupports data          var length = 0;          if (currData.flavour.dataIIDKey == "nsISupportsString")            {              supports = Components.classes["@mozilla.org/supports-string;1"]                                   .createInstance(Components.interfaces.nsISupportsString);              supports.data = currData.supports;              length = supports.data.length;            }          else             {              // non-string data.              supports = currData.supports;              length = 0; // kFlavorHasDataProvider            }          trans.setTransferData(currFlavour, supports, length * 2);        }      return trans;    },    /**   * TransferData/TransferDataSet get (FlavourSet aFlavourSet,    *                                   Function aRetrievalFunc, Boolean aAnyFlag) ;   *   * Retrieves data from the transferable provided in aRetrievalFunc, formatted   * for more convenient access.   *   * @param FlavourSet aFlavourSet   *        a FlavourSet object that contains a list of supported flavours.   * @param Function aRetrievalFunc   *        a reference to a function that returns a nsISupportsArray of nsITransferables   *        for each item from the specified source (clipboard/drag&drop etc)   * @param Boolean aAnyFlag   *        a flag specifying whether or not a specific flavour is requested. If false,   *        data of the type of the first flavour in the flavourlist parameter is returned,   *        otherwise the best flavour supported will be returned.   **/  get: function (aFlavourSet, aRetrievalFunc, aAnyFlag)    {      if (!aRetrievalFunc)         throw "No data retrieval handler provided!";            var supportsArray = aRetrievalFunc(aFlavourSet);      var dataArray = [];      var count = supportsArray.Count();            // Iterate over the number of items returned from aRetrievalFunc. For      // clipboard operations, this is 1, for drag and drop (where multiple      // items may have been dragged) this could be >1.      for (var i = 0; i < count; i++)        {          var trans = supportsArray.GetElementAt(i);          if (!trans) continue;          trans = trans.QueryInterface(Components.interfaces.nsITransferable);                      var data = { };          var length = { };                    var currData = null;          if (aAnyFlag)            {               var flavour = { };              trans.getAnyTransferData(flavour, data, length);              if (data && flavour)                {                  var selectedFlavour = aFlavourSet.flavourTable[flavour.value];                  if (selectedFlavour)                     dataArray[i] = FlavourToXfer(data.value, length.value, selectedFlavour);                }            }          else            {              var firstFlavour = aFlavourSet.flavours[0];              trans.getTransferData(firstFlavour, data, length);              if (data && firstFlavour)                dataArray[i] = FlavourToXfer(data.value, length.value, firstFlavour);            }        }      return new TransferDataSet(dataArray);    },  /**    * nsITransferable createTransferable (void) ;   *   * Creates and returns a transferable object.   **/      createTransferable: function ()    {      const kXferableContractID = "@mozilla.org/widget/transferable;1";      const kXferableIID = Components.interfaces.nsITransferable;      return Components.classes[kXferableContractID].createInstance(kXferableIID);    }};  /**  * A FlavourSet is a simple type that represents a collection of Flavour objects. * FlavourSet is constructed from an array of Flavours, and stores this list as * an array and a hashtable. The rationale for the dual storage is as follows: *  * Array: Ordering is important when adding data flavours to a transferable.  *        Flavours added first are deemed to be 'preferred' by the client.  * Hash:  Convenient lookup of flavour data using the content type (MIME type) *        of data as a key.  */function FlavourSet(aFlavourList){  this.flavours = aFlavourList || [];  this.flavourTable = { };  this._XferID = "FlavourSet";    for (var i = 0; i < this.flavours.length; ++i)    this.flavourTable[this.flavours[i].contentType] = this.flavours[i];}FlavourSet.prototype = {  appendFlavour: function (aFlavour, aFlavourIIDKey)  {    var flavour = new Flavour (aFlavour, aFlavourIIDKey);    this.flavours.push(flavour);    this.flavourTable[flavour.contentType] = flavour;  }};/**  * A Flavour is a simple type that represents a data type that can be handled.  * It takes a content type (MIME type) which is used when storing data on the * system clipboard/drag and drop, and an IIDKey (string interface name * which is used to QI data to an appropriate form. The default interface is * assumed to be wide-string. */ function Flavour(aContentType, aDataIIDKey){  this.contentType = aContentType;  this.dataIIDKey = aDataIIDKey || "nsISupportsString";  this._XferID = "Flavour";}function TransferDataBase() {}TransferDataBase.prototype = {  push: function (aItems)  {    this.dataList.push(aItems);  },  get first ()  {    return "dataList" in this && this.dataList.length ? this.dataList: null;  }};/**  * TransferDataSet is a list (array) of TransferData objects, which represents * data dragged from one or more elements.  */function TransferDataSet(aTransferDataList){  this.dataList = aTransferDataList || [];  this._XferID = "TransferDataSet";}TransferDataSet.prototype = TransferDataBase.prototype;/**  * TransferData is a list (array) of FlavourData for all the applicable content * types associated with a drag from a single item.  */function TransferData(aFlavourDataList){  this.dataList = aFlavourDataList || [];  this._XferID = "TransferData";}TransferData.prototype = {  __proto__: TransferDataBase.prototype,    addDataForFlavour: function (aFlavourString, aData, aLength, aDataIIDKey)  {    this.dataList.push(new FlavourData(aData, aLength,                        new Flavour(aFlavourString, aDataIIDKey)));  }};/**  * FlavourData is a type that represents data retrieved from the system  * clipboard or drag and drop. It is constructed internally by the Transferable * using the raw (nsISupports) data from the clipboard, the length of the data, * and an object of type Flavour representing the type. Clients implementing * IDragDropObserver receive an object of this type in their implementation of * onDrop. They access the 'data' property to retrieve data, which is either data  * QI'ed to a usable form, or unicode string.  */function FlavourData(aData, aLength, aFlavour) {  this.supports = aData;  this.contentLength = aLength;  this.flavour = aFlavour || null;    this._XferID = "FlavourData";}FlavourData.prototype = {  get data ()  {    if (this.flavour &&         this.flavour.dataIIDKey != "nsISupportsString" )      return this.supports.QueryInterface(Components.interfaces[this.flavour.dataIIDKey]);     else {      var unicode = this.supports.QueryInterface(Components.interfaces.nsISupportsString);      if (unicode)         return unicode.data.substring(0, this.contentLength/2);           return this.supports;    }    return "";  }}/**  * Create a TransferData object with a single FlavourData entry. Used when  * unwrapping data of a specific flavour from the drag service.  */function FlavourToXfer(aData, aLength, aFlavour) {  return new TransferData([new FlavourData(aData, aLength, aFlavour)]);}var transferUtils = {  retrieveURLFromData: function (aData, flavour)  {    switch (flavour) {      case "text/unicode":        return aData.replace(/^\s+|\s+$/g, "");      case "text/x-moz-url":        return aData.toString().split("\n")[0];      case "application/x-moz-file":        var ioService = Components.classes["@mozilla.org/network/io-service;1"]                                  .getService(Components.interfaces.nsIIOService);        var fileHandler = ioService.getProtocolHandler("file")                                   .QueryInterface(Components.interfaces.nsIFileProtocolHandler);        return fileHandler.getURLSpecFromFile(aData);    }    return null;                                                     }}/** * nsDragAndDrop - a convenience wrapper for nsTransferable, nsITransferable *                 and nsIDragService/nsIDragSession.  * * Use: map the handler functions to the 'ondraggesture', 'ondragover' and *   'ondragdrop' event handlers on your XML element, e.g.                    *   <xmlelement ondraggesture="nsDragAndDrop.startDrag(event, observer);"    *               ondragover="nsDragAndDrop.dragOver(event, observer);"       *               ondragdrop="nsDragAndDrop.drop(event, observer);"/>          *                                                                            *   You need to create an observer js object with the following member       *   functions:                                                               *     Object onDragStart (event)        // called when drag initiated,       *                                       // returns flavour list with data    *                                       // to stuff into transferable       *     void onDragOver (Object flavour)  // called when element is dragged    *                                       // over, so that it can perform      *                                       // any drag-over feedback for provided *                                       // flavour                           *     void onDrop (Object data)         // formatted data object dropped.    *     Object getSupportedFlavours ()    // returns a flavour list so that    *                                       // nsTransferable can determine *                                       // whether or not to accept drop.  **/   var nsDragAndDrop = {    _mDS: null,  get mDragService()    {      if (!this._mDS)         {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -