avalon-rails 1.4.6.0.20150915133100 → 1.4.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@
5
5
  http://weibo.com/jslouvre/
6
6
 
7
7
  Released under the MIT license
8
- avalon.shim.js(无加载器版本) 1.46 built in 2015.9.11
8
+ avalon.shim.js(无加载器版本) 1.4.7 built in 2015.10.13
9
9
  support IE6+ and other browsers
10
10
  ==================================================*/
11
11
  (function(global, factory) {
@@ -51,9 +51,6 @@ function log() {
51
51
 
52
52
 
53
53
  var subscribers = "$" + expose
54
- var otherRequire = window.require
55
- var otherDefine = window.define
56
- var innerRequire
57
54
  var stopRepeatAssign = false
58
55
  var rword = /[^, ]+/g //切割字符串为一个个小块,以空格或豆号分开它们,结合replace实现字符串的forEach
59
56
  var rcomplexType = /^(?:object|array)$/
@@ -301,10 +298,11 @@ function _number(a, len) { //用于模拟slice, splice的效果
301
298
  a = Math.floor(a) || 0
302
299
  return a < 0 ? Math.max(len + a, 0) : Math.min(a, len);
303
300
  }
301
+
304
302
  avalon.mix({
305
303
  rword: rword,
306
304
  subscribers: subscribers,
307
- version: 1.46,
305
+ version: 1.47,
308
306
  ui: {},
309
307
  log: log,
310
308
  slice: W3C ? function (nodes, start, end) {
@@ -357,38 +355,35 @@ avalon.mix({
357
355
  },
358
356
  eventHooks: [],
359
357
  /*绑定事件*/
360
- bind: function(el, type, fn, phase) {
358
+ bind: function (el, type, fn, phase) {
361
359
  var hooks = avalon.eventHooks
362
360
  var hook = hooks[type]
363
361
  if (typeof hook === "object") {
364
- type = hook.type
365
- if (hook.deel) {
366
- fn = hook.deel(el, type, fn, phase)
367
- }
362
+ type = hook.type || type
363
+ phase = hook.phase || !!phase
364
+ fn = hook.fn ? hook.fn(el,fn): fn
368
365
  }
369
- var callback = W3C ? fn : function(e) {
366
+ var callback = W3C ? fn : function (e) {
370
367
  fn.call(el, fixEvent(e));
371
368
  }
372
369
  if (W3C) {
373
- el.addEventListener(type, callback, !!phase)
370
+ el.addEventListener(type, callback, phase)
374
371
  } else {
375
372
  el.attachEvent("on" + type, callback)
376
373
  }
377
374
  return callback
378
375
  },
379
376
  /*卸载事件*/
380
- unbind: function(el, type, fn, phase) {
377
+ unbind: function (el, type, fn, phase) {
381
378
  var hooks = avalon.eventHooks
382
379
  var hook = hooks[type]
383
380
  var callback = fn || noop
384
381
  if (typeof hook === "object") {
385
- type = hook.type
386
- if (hook.deel) {
387
- fn = hook.deel(el, type, fn, false)
388
- }
382
+ type = hook.type || type
383
+ phase = hook.phase || !!phase
389
384
  }
390
385
  if (W3C) {
391
- el.removeEventListener(type, callback, !!phase)
386
+ el.removeEventListener(type, callback, phase)
392
387
  } else {
393
388
  el.detachEvent("on" + type, callback)
394
389
  }
@@ -830,7 +825,7 @@ if (!("onmouseenter" in root)) {
830
825
  }, function (origType, fixType) {
831
826
  eventHooks[origType] = {
832
827
  type: fixType,
833
- deel: function (elem, _, fn) {
828
+ fn: function (elem, fn) {
834
829
  return function (e) {
835
830
  var t = e.relatedTarget
836
831
  if (!t || (t !== elem && !(elem.compareDocumentPosition(t) & 16))) {
@@ -858,7 +853,7 @@ avalon.each({
858
853
  if (!("oninput" in DOC.createElement("input"))) {
859
854
  eventHooks.input = {
860
855
  type: "propertychange",
861
- deel: function (elem, _, fn) {
856
+ fn: function (elem, fn) {
862
857
  return function (e) {
863
858
  if (e.propertyName === "value") {
864
859
  e.type = "input"
@@ -878,7 +873,7 @@ if (DOC.onmousewheel === void 0) {
878
873
  var fixWheelDelta = fixWheelType === "wheel" ? "deltaY" : "detail"
879
874
  eventHooks.mousewheel = {
880
875
  type: fixWheelType,
881
- deel: function (elem, _, fn) {
876
+ fn: function (elem, fn) {
882
877
  return function (e) {
883
878
  e.wheelDeltaY = e.wheelDelta = e[fixWheelDelta] > 0 ? -120 : 120
884
879
  e.wheelDeltaX = 0
@@ -923,11 +918,7 @@ function escapeRegExp(target) {
923
918
  }
924
919
 
925
920
  var plugins = {
926
- loader: function (builtin) {
927
- var flag = innerRequire && builtin
928
- window.require = flag ? innerRequire : otherRequire
929
- window.define = flag ? innerRequire.define : otherDefine
930
- },
921
+
931
922
  interpolate: function (array) {
932
923
  openTag = array[0]
933
924
  closeTag = array[1]
@@ -1909,7 +1900,7 @@ function injectDisposeQueue(data, list) {
1909
1900
  var elem = data.element
1910
1901
  if (!data.uuid) {
1911
1902
  if (elem.nodeType !== 1) {
1912
- data.uuid = data.type + (data.pos || 0) + "-" + getUid(elem.parentNode)
1903
+ data.uuid = data.type + getUid(elem.parentNode)+ "-"+ (++disposeCount)
1913
1904
  } else {
1914
1905
  data.uuid = data.name + "-" + getUid(elem)
1915
1906
  }
@@ -2567,7 +2558,8 @@ var rdisplayswap = /^(none|table(?!-c[ea]).+)/
2567
2558
  var node = this[0]
2568
2559
  if (arguments.length === 0) {
2569
2560
  if (node.setTimeout) { //取得窗口尺寸,IE9后可以用node.innerWidth /innerHeight代替
2570
- return node["inner" + name] || node.document.documentElement[clientProp]
2561
+ return node["inner" + name] || node.document.documentElement[clientProp] ||
2562
+ node.document.body[clientProp]//IE6下前两个分别为undefine,0
2571
2563
  }
2572
2564
  if (node.nodeType === 9) { //取得页面尺寸
2573
2565
  var doc = node.documentElement
@@ -3277,7 +3269,7 @@ function scanExpr(str) {
3277
3269
  }
3278
3270
  value = str.slice(start, stop)
3279
3271
  if (value) { //处理{{ }}插值表达式
3280
- tokens.push(getToken(value, start))
3272
+ tokens.push(getToken(value))
3281
3273
  }
3282
3274
  start = stop + closeTag.length
3283
3275
  } while (1)
@@ -3292,11 +3284,10 @@ function scanExpr(str) {
3292
3284
  return tokens
3293
3285
  }
3294
3286
 
3295
- function scanText(textNode, vmodels, index) {
3296
- var bindings = []
3297
- tokens = scanExpr(textNode.data)
3287
+ function scanText(textNode, vmodels) {
3288
+ var bindings = [], tokens = scanExpr(textNode.data)
3298
3289
  if (tokens.length) {
3299
- for (var i = 0; token = tokens[i++]; ) {
3290
+ for (var i = 0, token; token = tokens[i++]; ) {
3300
3291
  var node = DOC.createTextNode(token.value) //将文本转换为文本节点,并替换原来的文本节点
3301
3292
  if (token.expr) {
3302
3293
  token.value = token.value.replace(roneTime, function () {
@@ -3309,7 +3300,6 @@ function scanText(textNode, vmodels, index) {
3309
3300
  token.type = "html"
3310
3301
  return ""
3311
3302
  })// jshint ignore:line
3312
- token.pos = index * 1000 + i
3313
3303
  bindings.push(token) //收集带有插值表达式的文本
3314
3304
  }
3315
3305
  avalonFragment.appendChild(node)
@@ -3773,7 +3763,6 @@ var TimerID, ribbon = []
3773
3763
  }
3774
3764
 
3775
3765
  var watchValueInTimer = noop
3776
- var rmsinput = /text|password|hidden/
3777
3766
  new function() { // jshint ignore:line
3778
3767
  try { //#272 IE9-IE11, firefox
3779
3768
  var setters = {}
@@ -3781,7 +3770,7 @@ new function() { // jshint ignore:line
3781
3770
  var bproto = HTMLTextAreaElement.prototype
3782
3771
  function newSetter(value) { // jshint ignore:line
3783
3772
  setters[this.tagName].call(this, value)
3784
- if (rmsinput.test(this.type) && !this.msFocus && this.avalonSetter) {
3773
+ if (!this.msFocus && this.avalonSetter && this.oldValue !== value) {
3785
3774
  this.avalonSetter()
3786
3775
  }
3787
3776
  }
@@ -3804,7 +3793,7 @@ new function() { // jshint ignore:line
3804
3793
  }
3805
3794
  } // jshint ignore:line
3806
3795
  if (IEVersion) {
3807
- avalon.bind(DOC, "selectionchange", function(e) {
3796
+ avalon.bind(DOC, "selectionchange", function (e) {
3808
3797
  var el = DOC.activeElement
3809
3798
  if (el && typeof el.avalonSetter === "function") {
3810
3799
  el.avalonSetter()
@@ -3813,25 +3802,25 @@ if (IEVersion) {
3813
3802
  }
3814
3803
 
3815
3804
  //处理radio, checkbox, text, textarea, password
3816
- duplexBinding.INPUT = function(element, evaluator, data) {
3805
+ duplexBinding.INPUT = function (element, evaluator, data) {
3817
3806
  var $type = element.type,
3818
- bound = data.bound,
3819
- $elem = avalon(element),
3820
- composing = false
3807
+ bound = data.bound,
3808
+ $elem = avalon(element),
3809
+ composing = false
3821
3810
 
3822
- function callback(value) {
3823
- data.changed.call(this, value, data)
3824
- }
3811
+ function callback(value) {
3812
+ data.changed.call(this, value, data)
3813
+ }
3825
3814
 
3826
- function compositionStart() {
3827
- composing = true
3828
- }
3815
+ function compositionStart() {
3816
+ composing = true
3817
+ }
3829
3818
 
3830
- function compositionEnd() {
3831
- composing = false
3832
- }
3833
- //当value变化时改变model的值
3834
- var updateVModel = function() {
3819
+ function compositionEnd() {
3820
+ composing = false
3821
+ }
3822
+ //当value变化时改变model的值
3823
+ var updateVModel = function () {
3835
3824
  var val = element.value //防止递归调用形成死循环
3836
3825
  if (composing || val === element.oldValue) //处理中文输入法在minlengh下引发的BUG
3837
3826
  return
@@ -3842,27 +3831,27 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3842
3831
  }
3843
3832
  }
3844
3833
  //当model变化时,它就会改变value的值
3845
- data.handler = function() {
3846
- var val = data.pipe(evaluator(), data, "set") +"" //fix #673
3834
+ data.handler = function () {
3835
+ var val = data.pipe(evaluator(), data, "set") //fix #673
3847
3836
  if (val !== element.oldValue) {
3848
- element.value = element.oldValue = val
3837
+ element.value = element.oldValue = val
3849
3838
  }
3850
3839
  }
3851
3840
  if (data.isChecked || $type === "radio") {
3852
3841
  var IE6 = IEVersion === 6
3853
- updateVModel = function() {
3842
+ updateVModel = function () {
3854
3843
  if ($elem.data("duplexObserve") !== false) {
3855
3844
  var lastValue = data.pipe(element.value, data, "get")
3856
3845
  evaluator(lastValue)
3857
3846
  callback.call(element, lastValue)
3858
3847
  }
3859
3848
  }
3860
- data.handler = function() {
3849
+ data.handler = function () {
3861
3850
  var val = evaluator()
3862
- var checked = data.isChecked ? !! val : val + "" === element.value
3851
+ var checked = data.isChecked ? !!val : val + "" === element.value
3863
3852
  element.oldValue = checked
3864
3853
  if (IE6) {
3865
- setTimeout(function() {
3854
+ setTimeout(function () {
3866
3855
  //IE8 checkbox, radio是使用defaultChecked控制选中状态,
3867
3856
  //并且要先设置defaultChecked后设置checked
3868
3857
  //并且必须设置延迟
@@ -3875,7 +3864,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3875
3864
  }
3876
3865
  bound("click", updateVModel)
3877
3866
  } else if ($type === "checkbox") {
3878
- updateVModel = function() {
3867
+ updateVModel = function () {
3879
3868
  if ($elem.data("duplexObserve") !== false) {
3880
3869
  var method = element.checked ? "ensure" : "remove"
3881
3870
  var array = evaluator()
@@ -3889,7 +3878,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3889
3878
  }
3890
3879
  }
3891
3880
 
3892
- data.handler = function() {
3881
+ data.handler = function () {
3893
3882
  var array = [].concat(evaluator()) //强制转换为数组
3894
3883
  var val = data.pipe(element.value, data, "get")
3895
3884
  element.checked = array.indexOf(val) > -1
@@ -3902,11 +3891,11 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3902
3891
  }
3903
3892
 
3904
3893
  function delay(e) { // jshint ignore:line
3905
- setTimeout(function() {
3894
+ setTimeout(function () {
3906
3895
  updateVModel(e)
3907
3896
  })
3908
3897
  }
3909
- events.replace(rword, function(name) {
3898
+ events.replace(rword, function (name) {
3910
3899
  switch (name) {
3911
3900
  case "input":
3912
3901
  if (!IEVersion) { // W3C
@@ -3920,7 +3909,7 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3920
3909
  if (IEVersion > 8) {
3921
3910
  bound("input", updateVModel) //IE9使用propertychange无法监听中文输入改动
3922
3911
  } else {
3923
- bound("propertychange", function(e) { //IE6-8下第一次修改时不会触发,需要使用keydown或selectionchange修正
3912
+ bound("propertychange", function (e) { //IE6-8下第一次修改时不会触发,需要使用keydown或selectionchange修正
3924
3913
  if (e.propertyName === "value") {
3925
3914
  updateVModel()
3926
3915
  }
@@ -3936,15 +3925,16 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3936
3925
  break
3937
3926
  }
3938
3927
  })
3939
- bound("focus", function() {
3928
+ bound("focus", function () {
3940
3929
  element.msFocus = true
3941
3930
  })
3942
- bound("blur", function() {
3931
+ bound("blur", function () {
3943
3932
  element.msFocus = false
3944
3933
  })
3945
3934
 
3946
- if (rmsinput.test($type)) {
3947
- watchValueInTimer(function() {
3935
+ if (!/^(file|button|reset|submit|checkbox|radio)$/.test(element.type)) {
3936
+ element.avalonSetter = updateVModel //#765
3937
+ watchValueInTimer(function () {
3948
3938
  if (root.contains(element)) {
3949
3939
  if (!element.msFocus && element.oldValue !== element.value) {
3950
3940
  updateVModel()
@@ -3954,11 +3944,9 @@ duplexBinding.INPUT = function(element, evaluator, data) {
3954
3944
  }
3955
3945
  })
3956
3946
  }
3957
-
3958
- element.avalonSetter = updateVModel //#765
3947
+
3959
3948
  }
3960
3949
 
3961
- element.oldValue = element.value
3962
3950
  avalon.injectBinding(data)
3963
3951
  callback.call(element, element.value)
3964
3952
  }
@@ -4170,6 +4158,9 @@ bindingHandlers.repeat = function (data, vmodels) {
4170
4158
  }
4171
4159
  }
4172
4160
 
4161
+ data.handler = noop
4162
+ avalon.injectBinding(data)
4163
+
4173
4164
  var elem = data.element
4174
4165
  if (elem.nodeType === 1) {
4175
4166
  elem.removeAttribute(data.name)
@@ -4238,7 +4229,12 @@ bindingExecutors.repeat = function (method, pos, el) {
4238
4229
 
4239
4230
  if (data.xtype === "array") {
4240
4231
  if (old.length === neo.length) {
4241
- return
4232
+ if (old !== neo && old.length > 0) {
4233
+ bindingExecutors.repeat.call(this, 'clear', pos, el)
4234
+ }
4235
+ else {
4236
+ return
4237
+ }
4242
4238
  }
4243
4239
  method = "add"
4244
4240
  pos = 0
@@ -4750,9 +4746,9 @@ var filters = avalon.filters = {
4750
4746
  $filter: function(val) {
4751
4747
  for (var i = 1, n = arguments.length; i < n; i++) {
4752
4748
  var array = arguments[i]
4753
- var fn = avalon.filters[array.shift()]
4749
+ var fn = avalon.filters[array[0]]
4754
4750
  if (typeof fn === "function") {
4755
- var arr = [val].concat(array)
4751
+ var arr = [val].concat(array.slice(1))
4756
4752
  val = fn.apply(null, arr)
4757
4753
  }
4758
4754
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avalon-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.6.0.20150915133100
4
+ version: 1.4.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - zj0713001
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This gem provides javascript framework Avalon for your Rails 3+ application.
14
14
  email:
@@ -17,8 +17,8 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - .DS_Store
21
- - .gitignore
20
+ - ".DS_Store"
21
+ - ".gitignore"
22
22
  - Gemfile
23
23
  - LICENSE.txt
24
24
  - README.md
@@ -48,17 +48,17 @@ require_paths:
48
48
  - lib
49
49
  required_ruby_version: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ! '>='
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  required_rubygems_version: !ruby/object:Gem::Requirement
55
55
  requirements:
56
- - - ! '>='
56
+ - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
60
  rubyforge_project:
61
- rubygems_version: 2.4.4
61
+ rubygems_version: 2.4.8
62
62
  signing_key:
63
63
  specification_version: 4
64
64
  summary: Use javascript framework Avalon with Rails 3+