- Jump To … +
  <<< back to documentation abstract.js defaults.js factory.js field.js form.js main.js multiple.js pubsub.js remote.js ui.js utils.js validator.js validator_registry.js

- # utils.js

- ¶

      import $ from 'jquery';

      var globalID = 1;
      var pastWarnings = {};

      var ParsleyUtils = {

- ¶

  Parsley DOM-API returns object from dom attributes and values

        attr: function ($element, namespace, obj) {
          var i;
          var attribute;
          var attributes;
          var regex = new RegExp('^' + namespace, 'i');

          if ('undefined' === typeof obj)
            obj = {};
          else {

- ¶

  Clear all own properties. This won’t affect prototype’s values

            for (i in obj) {
              if (obj.hasOwnProperty(i))
                delete obj[i];
            }
          }

          if ('undefined' === typeof $element || 'undefined' === typeof $element[0])
            return obj;

          attributes = $element[0].attributes;
          for (i = attributes.length; i--; ) {
            attribute = attributes[i];

            if (attribute && attribute.specified && regex.test(attribute.name)) {
              obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);
            }
          }

          return obj;
        },

        checkAttr: function ($element, namespace, checkAttr) {
          return $element.is('[' + namespace + checkAttr + ']');
        },

        setAttr: function ($element, namespace, attr, value) {
          $element[0].setAttribute(this.dasherize(namespace + attr), String(value));
        },

        generateID: function () {
          return '' + globalID++;
        },

        /** Third party functions **/

- ¶

  Zepto deserialize function

        deserializeValue: function (value) {
          var num;

          try {
            return value ?
              value == "true" ||
              (value == "false" ? false :
              value == "null" ? null :
              !isNaN(num = Number(value)) ? num :
              /^[\[\{]/.test(value) ? $.parseJSON(value) :
              value)
              : value;
          } catch (e) { return value; }
        },

- ¶

  Zepto camelize function

        camelize: function (str) {
          return str.replace(/-+(.)?/g, function (match, chr) {
            return chr ? chr.toUpperCase() : '';
          });
        },

- ¶

  Zepto dasherize function

        dasherize: function (str) {
          return str.replace(/::/g, '/')
            .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
            .replace(/([a-z\d])([A-Z])/g, '$1_$2')
            .replace(/_/g, '-')
            .toLowerCase();
        },

        warn: function () {
          if (window.console && 'function' === typeof window.console.warn)
            window.console.warn(...arguments);
        },

        warnOnce: function(msg) {
          if (!pastWarnings[msg]) {
            pastWarnings[msg] = true;
            this.warn(...arguments);
          }
        },

        _resetWarnings: function () {
          pastWarnings = {};
        },

        trimString: function(string) {
          return string.replace(/^\s+|\s+$/g, '');
        },

        namespaceEvents: function(events, namespace) {
          events = this.trimString(events || '').split(/\s+/);
          if (!events[0])
            return '';
          return $.map(events, evt => `${evt}.${namespace}`).join(' ');
        },

        difference: function(array, remove) {

- ¶

  This is O(N^2), should be optimized

          let result = [];
          $.each(array, (_, elem) => {
            if (remove.indexOf(elem) == -1)
              result.push(elem);
          });
          return result;
        },

- ¶

  Alter-ego to native Promise.all, but for jQuery

        all: function(promises) {

- ¶

  jQuery treats $.when() and $.when(singlePromise) differently; let’s avoid that and add spurious elements

          return $.when(...promises, 42, 42);
        },

- ¶

  Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill

        objectCreate: Object.create || (function () {
          var Object = function () {};
          return function (prototype) {
            if (arguments.length > 1) {
              throw Error('Second argument not supported');
            }
            if (typeof prototype != 'object') {
              throw TypeError('Argument must be an object');
            }
            Object.prototype = prototype;
            var result = new Object();
            Object.prototype = null;
            return result;
          };
        })(),

        _SubmitSelector: 'input[type="submit"], button:submit'
      };

      export default ParsleyUtils;