PageSourceSearch

https://online.lec-jp.com/js/selectbox.js

js lec-jp.com collected 2026-10-02 03:30:49 UTC 17,355 bytes, 539 lines download raw bytes

1/*!
2 * jQuery Selectbox plugin 0.2
3 *
4 * Copyright 2011-2012, Dimitar Ivanov (http://www.bulgaria-web-developers.com/projects/javascript/selectbox/)
5 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
6 *
7 * Date: Tue Jul 17 19:58:36 2012 +0300
8 */
9
10
11(function select_box($, undefined) {
12  var PROP_NAME = 'selectbox',
13    FALSE = false,
14    TRUE = true;
15
16  function Selectbox() {
17    this._state = [];
18    this._defaults = {
19      classHolder: "sbHolder",
20      classHolderDisabled: "sbHolderDisabled",
21      classSelector: "sbSelector",
22      classOptions: "sbOptions",
23      classGroup: "sbGroup",
24      classSub: "sbSub",
25      classDisabled: "sbDisabled",
26      classToggleOpen: "sbToggleOpen",
27      classToggle: "sbToggle",
28      classFocus: "sbFocus",
29      speed: 300,
30      effect: "slide",
31      onChange: null,
32      onOpen: null,
33      onClose: null
34    };
35  }
36
37  $.extend(Selectbox.prototype, {
38    /**
39     * Is the first field in a jQuery collection open as a selectbox
40     *
41     * @param {Object} target
42     * @return {Boolean}
43     */
44    _isOpenSelectbox: function (target) {
45      if (!target) {
46        return FALSE;
47      }
48      var inst = this._getInst(target);
49      return inst.isOpen;
50    },
51    /**
52     * Is the first field in a jQuery collection disabled as a selectbox
53     *
54     * @param {HTMLElement} target
55     * @return {Boolean}
56     */
57    _isDisabledSelectbox: function (target) {
58      if (!target) {
59        return FALSE;
60      }
61      var inst = this._getInst(target);
62      return inst.isDisabled;
63    },
64    /**
65     * Attach the select box to a jQuery selection.
66     *
67     * @param {HTMLElement} target
68     * @param {Object} settings
69     */
70    _attachSelectbox: function (target, settings) {
71      if (this._getInst(target)) {
72        return FALSE;
73      }
74      var $target = $(target),
75        self = this,
76        inst = self._newInst($target),
77        sbHolder, sbSelector, sbToggle, sbOptions,
78        s = FALSE, optGroup = $target.find("optgroup"), opts = $target.find("option"), olen = opts.length;
79
80      $target.attr("sb", inst.uid);
81
82      $.extend(inst.settings, self._defaults, settings);
83      self._state[inst.uid] = FALSE;
84      $target.hide();
85
86      function closeOthers() {
87        var key, sel,
88          uid = this.attr("id").split("_")[1];
89        for (key in self._state) {
90          if (key !== uid) {
91            if (self._state.hasOwnProperty(key)) {
92              sel = $("select[sb='" + key + "']")[0];
93              if (sel) {
94                self._closeSelectbox(sel);
95              }
96            }
97          }
98        }
99      }
100
101      sbHolder = $("<div>", {
102        "id": "sbHolder_" + inst.uid,
103        "class": inst.settings.classHolder,
104        "tabindex": $target.attr("tabindex")
105      });
106
107      sbSelector = $("<a>", {
108        "id": "sbSelector_" + inst.uid,
109        "href": "#",
110        "class": inst.settings.classSelector,
111        "click": function (e) {
112          e.preventDefault();
113          closeOthers.apply($(this), []);
114          var uid = $(this).attr("id").split("_")[1];
115          if (self._state[uid]) {
116            self._closeSelectbox(target);
117          } else {
118            self._openSelectbox(target);
119          }
120        }
121      });
122
123      sbToggle = $("<a>", {
124        "id": "sbToggle_" + inst.uid,
125        "href": "#",
126        "class": inst.settings.classToggle,
127        "click": function (e) {
128          e.preventDefault();
129          closeOthers.apply($(this), []);
130          var uid = $(this).attr("id").split("_")[1];
131          if (self._state[uid]) {
132            self._closeSelectbox(target);
133          } else {
134            self._openSelectbox(target);
135          }
136        }
137      });
138      sbToggle.appendTo(sbHolder);
139
140      sbOptions = $("<ul>", {
141        "id": "sbOptions_" + inst.uid,
142        "class": inst.settings.classOptions,
143        "css": {
144          "display": "none"
145        }
146      });
147
148      $target.children().each(function(i) {
149        var that = $(this), li, config = {};
150        if (that.is("option")) {
151          getOptions(i, that);
152        } else if (that.is("optgroup")) {
153          li = $("<li>");
154          $("<span>", {
155            "text": that.attr("label")
156          }
156).addClass(inst.settings.classGroup).appendTo(li);
157          li.appendTo(sbOptions);
158          if (that.is(":disabled")) {
159            config.disabled = true;
160          }
161          config.sub = true;
162          getOptions(i, that.find("option"), config);
163        }
164      });
165
166      function getOptions () {
167        var sub = arguments[2] && arguments[2].sub ? true : false,
168          disabled = arguments[2] && arguments[2].disabled ? true : false,
169          i = arguments[0];
170        arguments[1].each(function () {
171          var that = $(this),
172            li = $("<li>"),
173            child,
174            bgcolor = (i === 0)?"#ffff":"#ffffa0";
175
176          if (that.is(":selected")) {
177            sbSelector.text(that.text());
178            sbHolder.css({'background':bgcolor});
179            s = TRUE;
180          }
181          if (i === olen - 1) {
182            li.addClass("last");
183          }
184          if (!that.is(":disabled") && !disabled) {
185            // 2014/04/24 k.takeda Ž‘Ši–¼ƒvƒ‹ƒ_ƒEƒ“€–ڂ̃Cƒ“ƒfƒ“ƒg‘Ήž start.
186            className = "";
187
188
189            // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž start.
190            onClick = "$('#sbHolder_" + inst.uid + "').css('background', '').css({'background':'"+bgcolor+"'});";
191            // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž end.
192            // "012001"‚©‚çŠJŽn‚³‚ê‚é“Wަ”ԍ†‚ªval‚ɐݒ肳‚ê‚Ä‚¢‚éƒIƒvƒVƒ‡ƒ“‚݂̂ð‘ΏۂƂ·‚é
193            if (that.val().substr(0, "012001".length) === "012001") {
194                if (that.val().length == 9) {
195                    className = "dispDepth1";
196                }
197                else if (that.val().length == 12) {
198                    className = "dispDepth2";
199                    // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž start.
200                    onClick += "ga_et('2', '" + that.val().substr(6, 6) + "', this.href); return false;"
201                    // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž end.
202                }
203            }
204            // 2014/04/24 k.takeda Ž‘Ši–¼ƒvƒ‹ƒ_ƒEƒ“€–ڂ̃Cƒ“ƒfƒ“ƒg‘Ήž end.
205            child = $("<a>", {
206              "href": "#" + that.val(),
207              "class": className,
208              // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž start.
209              "onClick": onClick,
210              // 2016/07/12 k.nakayama Ž‘Ši–¼ƒNƒŠƒbƒNƒJƒEƒ“ƒg‘Ήž end.
211              "rel": that.val()
212            }).text(that.text()).bind("click.sb", function (e) {
213              if (e && e.preventDefault) {
214                e.preventDefault();
215              }
216              var t = sbToggle,
217                 $this = $(this),
218                uid = t.attr("id").split("_")[1];
219              self._changeSelectbox(target, $this.attr("rel"), $this.text());
220              self._closeSelectbox(target);
221            }).bind("mouseover.sb", function () {
222              var $this = $(this);
223              $this.parent().siblings().find("a").removeClass(inst.settings.classFocus);
224              $this.addClass(inst.settings.classFocus);
225            }).bind("mouseout.sb", function () {
226              $(this).removeClass(inst.settings.classFocus);
227            });
228            if (sub) {
229              child.addClass(inst.settings.classSub);
230            }
231            if (that.is(":selected")) {
232              child.addClass(inst.settings.classFocus);
233            }
234            child.appendTo(li);
235          } else {
236            child = $("<span>", {
237              "text": that.text()
238            }).addClass(inst.settings.classDisabled);
239            if (sub) {
240              child.addClass(inst.settings.classSub);
241            }
242            child.appendTo(li);
243          }
244          li.appendTo(sbOptions);
245        });
246      }
247
248      if (!s) {
249        sbSelector.text(opts.first().text());
250      }
251
252      $.data(target, PROP_NAME, inst);
253
254      sbHolder.data("uid", inst.uid).bind("keydown.sb", function (e) {
255        var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0,
256          $this = $(this),
257          uid = $this.data("uid"),
258          inst = $this.siblings("select[sb='"+uid+"']").data(PROP_NAME),
259          trgt = $this.siblings(["select[sb='", uid, "']"].join("")).get(0),
260          $f = $this.find("ul").find("a." + inst.settings.classFocus);
261        switch (key) {
262          case 37: //Arrow Left
263          case 38: //Arrow Up
264            if ($f.length > 0) {
265              var $next;
266              $("a", $this).removeClass(inst.settings.classFocus);
267              $next = $f.parent().prevAll("li:has(a)").eq(0).find("a");
268              if ($next.length > 0) {
269                $next.addClass(inst.settings.classFocus).focus();
270                $("#sbSelector_" + uid).text($next.text());
271              }
272            }
273            break;
274          case 39: //Arrow Right
275          case 40: //Arrow Down
276            var $next;
277            $("a", $this).removeClass(inst.settings.classFocus);
278            if ($f.length > 0) {
279              $next = $f.parent().nextAll("li:has(a)").eq(0).find("a");
280            } else {
281              $next = $this.find("ul").find("a").eq(0);
282            }
283            if ($next.length > 0) {
284              $next.addClass(inst.settings.classFocus).focus();
285              $("#sbSelector_" + uid).text($next.text());
286            }
287            break;
288          case 13: //Enter
289            if ($f.length > 0) {
290              self._changeSelectbox(trgt, $f.attr("rel"), $f.text());
291            }
292            self._closeSelectbox(trgt);
293            break;
294          case 9: //Tab
295            if (trgt) {
296              var inst = self._getInst(trgt);
297              if (inst/* && inst.isOpen*/) {
298                if ($f.length > 0) {
299                  self._changeSelectbox(trgt, $f.attr("rel"), $f.text());
300                }
301                self._closeSelectbox(trgt);
302              }
303            }
304            var i = parseInt($this.attr("tabindex"), 10);
305            if (!e.shiftKey) {
306              i++;
307            } else {
308              i--;
309            }
310            $("*[tabindex='" + i + "']").focus();
311            break;
312          case 27: //Escape
313            self._closeSelectbox(trgt);
314            break;
315        }
316        e.stopPropagation();
317        return false;
318      }).delegate("a", "mouseover", function (e) {
319        $(this).addClass(inst.settings.classFocus);
320      }).delegate("a", "mouseout", function (e) {
321        $(this).removeClass(inst.settings.classFocus);
322      });
323
324      sbSelector.appendTo(sbHolder);
325      sbOptions.appendTo(sbHolder);
326      sbHolder.insertAfter($target);
327
328      $("html").live('mousedown', function(e) {
329        e.stopPropagation();
330        $("select").selectbox('close');
331      });
332      $([".", inst.settings.classHolder, ", .", inst.settings.classSelector].join("")).mousedown(function(e) {
333        e.stopPropagation();
334      });
335    },
336    /**
337     * Remove the selectbox functionality completely. This will return the element back to its pre-init state.
338     *
339     * @param {HTMLElement} target
340     */
341    _detachSelectbox: function (target) {
342      var inst = this._getInst(target);
343      if (!inst) {
344        return FALSE;
345      }
346      $("#sbHolder_" + inst.uid).remove();
347      $.data(target, PROP_NAME, null);
348      $(target).show();
349    },
350    /**
351     * Change selected attribute of the selectbox.
352     *
353     * @param {HTMLElement} target
354     * @param {String} value
355     * @param {String} text
356     */
357    _changeSelectbox: function (target, value, text) {
358      var onChange,
359        inst = this._getInst(target);
360      if (inst) {
361        onChange = this._get(inst, 'onChange');
362        $("#sbSelector_" + inst.uid).text(text);
363      }
364      value = value.replace(/\'/g, "\\'");
365      $(target).find("option[value='" + value + "']").attr("selected", TRUE);
366      if (inst && onChange) {
367        onChange.apply((inst.input ? inst.input[0] : null), [value, inst]);
368      } else if (inst && inst.input) {
369        inst.input.trigger('change');
370      }
371    },
372    /**
373     * Enable the selectbox.
374     *
375     * @param {HTMLElement} target
376     */
377    _enableSelectbox: function (target) {
378      var inst = this._getInst(target);
379      if (!inst || !inst.isDisabled) {
380        return FALSE;
381      }
382      $("#sbHolder_" + inst.uid).removeClass(inst.settings.classHolderDisabled);
383      inst.isDisabled = FALSE;
384      $.data(target, PROP_NAME, inst);
385    },
386    /**
387     * Disable the selectbox.
388     *
389     * @param {HTMLElement} target
390     */
391    _disableSelectbox: function (target) {
392      var inst = this._getInst(target);
393      if (!inst || inst.isDisabled) {
394        return FALSE;
395      }
396      $("#sbHolder_" + inst.uid).addClass(inst.settings.classHolderDisabled);
397      inst.isDisabled = TRUE;
398      $.data(target, PROP_NAME, inst);
399    },
400    /**
401     * Get or set any selectbox option. If no value is specified, will act as a getter.
402     *
403     * @param {HTMLElement} target
404     * @param {String} name
405     * @param {Object} value
406     */
407    _optionSelectbox: function (target, name, value) {
408      var inst = this._getInst(target);
409      if (!inst) {
410        return FALSE;
411      }
412      //TODO check name
413      inst[name] = value;
414      $.data(target, PROP_NAME, inst);
415    },
416    /**
417     * Call up attached selectbox
418     *
419     * @param {HTMLElement} target
420     */
421    _openSelectbox: function (target) {
422      var inst = this._getInst(target);
423      //if (!inst || this._state[inst.uid] || inst.isDisabled) {
424      if (!inst || inst.isOpen || inst.isDisabled) {
425        return;
426      }
427      var  el = $("#sbOptions_" + inst.uid),
428        viewportHeight = parseInt($(window).height(), 10),
429        offset = $("#sbHolder_" + inst.uid).offset(),
430        scrollTop = $(window).scrollTop(),
431        height = el.prev().height(),
432        diff = viewportHeight - (offset.top - scrollTop) - height / 2,
433        onOpen = this._get(inst, 'onOpen');
434      el.css({
435        "top": height + "px",
436        "maxHeight": (diff - height) + "px"
437      });
438      inst.settings.effect === "fade" ? el.fadeIn(inst.settings.speed) : el.slideDown(inst.settings.speed);
439      $("#sbToggle_" + inst.uid).addClass(inst.settings.classToggleOpen);
440      this._state[inst.uid] = TRUE;
441      inst.isOpen = TRUE;
442      if (onOpen) {
443        onOpen.apply((inst.input ? inst.input[0] : null), [inst]);
444      }
445      $.data(target, PROP_NAME, inst);
446    },
447    /**
448     * Close opened selectbox
449     *
450     * @param {HTMLElement} target
451     */
452    _closeSelectbox: function (target) {
453      var inst = this._getInst(target);
454      //if (!inst || !this._state[inst.uid]) {
455      if (!inst || !inst.isOpen) {
456        return;
457      }
458      var onClose = this._get(inst, 'onClose');
459      inst.settings.effect === "fade" ? $("#sbOptions_" + inst.uid).fadeOut(inst.settings.speed) : $("#sbOptions_" + inst.uid).slideUp(inst.settings.speed);
460      $("#sbToggle_" + inst.uid).removeClass(inst.settings.classToggleOpen);
461      this._state[inst.uid] = FALSE;
462      inst.isOpen = FALSE;
463      if (onClose) {
464        onClose.apply((inst.input ? inst.input[0] : null), [inst]);
465      }
466      $.data(target, PROP_NAME, inst);
467    },
468    /**
469     * Create a new instance object
470     *
471     * @param {HTMLElement} target
472     * @return {Object}
473     */
474    _newInst: function(target) {
475      var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1');
476      return {
477        id: id,
478        input: target,
479        uid: Math.floor(Math.random() * 99999999),
480        isOpen: FALSE,
481        isDisabled: FALSE,
482        settings: {}
483      };
484    },
485    /**
486     * Retrieve the instance data for the target control.
487     *
488     * @param {HTMLElement} target
489     * @return {Object} - the associated instance data
490     * @throws error if a jQuery problem getting data
491     */
492    _getInst: function(target) {
493      try {
494        return $.data(target, PROP_NAME);
495      }
496      catch (err) {
497        throw 'Missing instance data for this selectbox';
498      }
499    },
500    /**
501     * Get a setting value, defaulting if necessary
502     *
503     * @param {Object} inst
504     * @param {String} name
505     * @return {Mixed}
506     */
507    _get: function(inst, name) {
508      return inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name];
509    }
510  });
511
512  /**
513   * Invoke the selectbox functionality.
514   *
515   * @param {Object|String} options
516   * @return {Object}
517   */
518  $.fn.selectbox = function (options) {
519
520    var otherArgs = Array.prototype.slice.call(arguments, 1);
521    if (typeof options == 'string' && options == 'isDisabled') {
522      return $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this[0]].concat(otherArgs));
523    }
524
525    if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') {
526      return $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this[0]].concat(otherArgs));
527    }
528
529    return this.each(function() {
530      typeof options == 'string' ?
531        $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this].concat(otherArgs)) :
532        $.selectbox._attachSelectbox(this, options);
533    });
534  };
535
536  $.selectbox = new Selectbox(); // singleton instance
537  $.selectbox.version = "0.2";
538
539})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.