【问题标题】:jQuery UI selectable - making multiple select defaultjQuery UI 可选 - 使多选成为默认
【发布时间】:2011-03-13 07:36:42
【问题描述】:

我需要默认提供多项选择,因此用户不必按住 ctrl。希望能得到一些帮助,谢谢。

【问题讨论】:

    标签: jquery jquery-ui selectable


    【解决方案1】:
    $("#selectable").selectable();
        $("#selectable").on("selectablestart", function (event, ui) {
            event.originalEvent.ctrlKey = true;
        });
    

    【讨论】:

    • 请提供详细信息
    • api.jqueryui.com/selectable/#event-start 此事件在任何选择之前触发,所以我只需修改原始事件对象,使其看起来像是从开始按下 CTRL 键:)
    • 谢谢,我已经确认这很好用;无需破解 jQueryUI 代码,或使用替代方法。 (我同时使用 jQuery 和 jQueryUI 的 1.10.x,但 IIUC 这将比这更早兼容。)
    【解决方案2】:

    如果你想使用 selectable ,你可能想使用绑定元键和 mousedown 事件。已经有一场辩论正在进行 here ,我只是在谷歌搜索时发现的。

    【讨论】:

      【解决方案3】:

      我曾经需要类似的东西。

      这是一个很好的例子,说明如何做到这一点。我想它可能会给你一些想法。

      http://www.joelanman.com/static/examples/multiple_selection/

      这里也是教程链接

      http://www.joelanman.com/2009/03/simple-multiple-selection-with-checkbox-lists-and-jquery/

      【讨论】:

      • 我想这意味着构建你自己的东西,我希望使用jqueryui.com/demos/selectable,以便我可以利用该功能。我只需要将 CTRL 行为设为默认行为。
      【解决方案4】:

      好吧,如果你想修改可选择的代码,在顶部的选项对象中添加一个选项(我的叫multi_no_key,默认为false)。

      然后,查找 var doSelect 声明的位置,它最初看起来像这样

      var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
      

      然后改成这个

      var doSelect;
      if(!options.multi_no_key)
          doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
      else
          doSelect = !selectee.$element.hasClass('ui-selected');
      

      在同一个 _mouseStart 方法中,查找以下代码

      this.selectees.filter('.ui-selected').each(function() {
              var selectee = $.data(this, "selectable-item");
              selectee.startselected = true;
              if (!event.metaKey) {
                  selectee.$element.removeClass('ui-selected');
                  selectee.selected = false;
                  selectee.$element.addClass('ui-unselecting');
                  selectee.unselecting = true;
                  // selectable UNSELECTING callback
                  self._trigger("unselecting", event, {
                      unselecting: selectee.element
                  });
              }
          });
      

      并更改条件以检查 multi_no_key 的选项

      this.selectees.filter('.ui-selected').each(function() {
              var selectee = $.data(this, "selectable-item");
              selectee.startselected = true;
              if (!event.metaKey && options.multi_no_key == false) {
                  selectee.$element.removeClass('ui-selected');
                  selectee.selected = false;
                  selectee.$element.addClass('ui-unselecting');
                  selectee.unselecting = true;
                  // selectable UNSELECTING callback
                  self._trigger("unselecting", event, {
                      unselecting: selectee.element
                  });
              }
          });
      

      我对此进行了测试,它对我来说效果很好。下面是可选择的js文件(1.8.12版本)的全部内容

      /*
      * jQuery UI Selectable 1.8.12
      *
      * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
      * Dual licensed under the MIT or GPL Version 2 licenses.
      * http://jquery.org/license
      *
      * http://docs.jquery.com/UI/Selectables
      *
      * Depends:
      *   jquery.ui.core.js
      *   jquery.ui.mouse.js
      *   jquery.ui.widget.js
      */
      (function( $, undefined ) {
      
      $.widget("ui.selectable", $.ui.mouse, {
      options: {
          appendTo: 'body',
          autoRefresh: true,
          distance: 0,
          filter: '*',
          tolerance: 'touch',
                  multi_no_key: false
      },
      _create: function() {
          var self = this;
      
          this.element.addClass("ui-selectable");
      
          this.dragged = false;
      
          // cache selectee children based on filter
          var selectees;
          this.refresh = function() {
              selectees = $(self.options.filter, self.element[0]);
              selectees.each(function() {
                  var $this = $(this);
                  var pos = $this.offset();
                  $.data(this, "selectable-item", {
                      element: this,
                      $element: $this,
                      left: pos.left,
                      top: pos.top,
                      right: pos.left + $this.outerWidth(),
                      bottom: pos.top + $this.outerHeight(),
                      startselected: false,
                      selected: $this.hasClass('ui-selected'),
                      selecting: $this.hasClass('ui-selecting'),
                      unselecting: $this.hasClass('ui-unselecting')
                  });
              });
          };
          this.refresh();
      
          this.selectees = selectees.addClass("ui-selectee");
      
          this._mouseInit();
      
          this.helper = $("<div class='ui-selectable-helper'></div>");
      },
      
      destroy: function() {
          this.selectees
              .removeClass("ui-selectee")
              .removeData("selectable-item");
          this.element
              .removeClass("ui-selectable ui-selectable-disabled")
              .removeData("selectable")
              .unbind(".selectable");
          this._mouseDestroy();
      
          return this;
      },
      
      _mouseStart: function(event) {
          var self = this;
      
          this.opos = [event.pageX, event.pageY];
      
          if (this.options.disabled)
              return;
      
          var options = this.options;
      
          this.selectees = $(options.filter, this.element[0]);
      
          this._trigger("start", event);
      
          $(options.appendTo).append(this.helper);
          // position helper (lasso)
          this.helper.css({
              "left": event.clientX,
              "top": event.clientY,
              "width": 0,
              "height": 0
          });
      
          if (options.autoRefresh) {
              this.refresh();
          }
      
          this.selectees.filter('.ui-selected').each(function() {
              var selectee = $.data(this, "selectable-item");
              selectee.startselected = true;
              if (!event.metaKey && options.multi_no_key == false) {
                  selectee.$element.removeClass('ui-selected');
                  selectee.selected = false;
                  selectee.$element.addClass('ui-unselecting');
                  selectee.unselecting = true;
                  // selectable UNSELECTING callback
                  self._trigger("unselecting", event, {
                      unselecting: selectee.element
                  });
              }
          });
      
          $(event.target).parents().andSelf().each(function() {
              var selectee = $.data(this, "selectable-item");
              if (selectee) {                            
                                  var doSelect;
                                  if(!options.multi_no_key)
                                      doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
                                  else
                                      doSelect = !selectee.$element.hasClass('ui-selected');
      
                  selectee.$element
                      .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
                      .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
                  selectee.unselecting = !doSelect;
                  selectee.selecting = doSelect;
                  selectee.selected = doSelect;
                  // selectable (UN)SELECTING callback
                  if (doSelect) {
                      self._trigger("selecting", event, {
                          selecting: selectee.element
                      });
                  } else {
                      self._trigger("unselecting", event, {
                          unselecting: selectee.element
                      });
                  }
                  return false;
              }
          });
      
      },
      
      _mouseDrag: function(event) {
          var self = this;
          this.dragged = true;
      
          if (this.options.disabled)
              return;
      
          var options = this.options;
      
          var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
          if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
          if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
          this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
      
          this.selectees.each(function() {
              var selectee = $.data(this, "selectable-item");
              //prevent helper from being selected if appendTo: selectable
              if (!selectee || selectee.element == self.element[0])
                  return;
              var hit = false;
              if (options.tolerance == 'touch') {
                  hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
              } else if (options.tolerance == 'fit') {
                  hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
              }
      
              if (hit) {
                  // SELECT
                  if (selectee.selected) {
                      selectee.$element.removeClass('ui-selected');
                      selectee.selected = false;
                  }
                  if (selectee.unselecting) {
                      selectee.$element.removeClass('ui-unselecting');
                      selectee.unselecting = false;
                  }
                  if (!selectee.selecting) {
                      selectee.$element.addClass('ui-selecting');
                      selectee.selecting = true;
                      // selectable SELECTING callback
                      self._trigger("selecting", event, {
                          selecting: selectee.element
                      });
                  }
              } else {
                  // UNSELECT
                  if (selectee.selecting) {
                      if (event.metaKey && selectee.startselected) {
                          selectee.$element.removeClass('ui-selecting');
                          selectee.selecting = false;
                          selectee.$element.addClass('ui-selected');
                          selectee.selected = true;
                      } else {
                          selectee.$element.removeClass('ui-selecting');
                          selectee.selecting = false;
                          if (selectee.startselected) {
                              selectee.$element.addClass('ui-unselecting');
                              selectee.unselecting = true;
                          }
                          // selectable UNSELECTING callback
                          self._trigger("unselecting", event, {
                              unselecting: selectee.element
                          });
                      }
                  }
                  if (selectee.selected) {
                      if (!event.metaKey && !selectee.startselected) {
                          selectee.$element.removeClass('ui-selected');
                          selectee.selected = false;
      
                          selectee.$element.addClass('ui-unselecting');
                          selectee.unselecting = true;
                          // selectable UNSELECTING callback
                          self._trigger("unselecting", event, {
                              unselecting: selectee.element
                          });
                      }
                  }
              }
          });
      
          return false;
      },
      
      _mouseStop: function(event) {
          var self = this;
      
          this.dragged = false;
      
          var options = this.options;
      
          $('.ui-unselecting', this.element[0]).each(function() {
              var selectee = $.data(this, "selectable-item");
              selectee.$element.removeClass('ui-unselecting');
              selectee.unselecting = false;
              selectee.startselected = false;
              self._trigger("unselected", event, {
                  unselected: selectee.element
              });
          });
          $('.ui-selecting', this.element[0]).each(function() {
              var selectee = $.data(this, "selectable-item");
              selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
              selectee.selecting = false;
              selectee.selected = true;
              selectee.startselected = true;
              self._trigger("selected", event, {
                  selected: selectee.element
              });
          });
          this._trigger("stop", event);
      
          this.helper.remove();
      
          return false;
      }
      });
      $.extend($.ui.selectable, {
      version: "1.8.12"
      });
      })(jQuery);
      

      【讨论】:

        【解决方案5】:

        老实说,我只是对 'c.metaKey' 进行了查找/替换,并在 jqui 脚本上将其替换为 'true /* edit */'... 很脏,但很有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 2011-04-19
          • 2015-09-05
          相关资源
          最近更新 更多