it('index works', function () { var div = Dom.create('<ul class="index-ul">' + '<li class="index-li">0</li>' + '<li class="index-li">1</li>' + '<li class="index-li">2</li>' + '</ul>'); Dom.append(div, 'body'); // 单个节点 expect(Dom.index('.index-li', Dom.query('.index-li')[1])).to.be(1); // 取第一个节点 expect(Dom.index('.index-li', Dom.query('.index-li'))).to.be(0); // 第一个节点在 parent 中找 expect(Dom.index('.index-li')).to.be(0); expect(Dom.index(Dom.query('.index-li')[1])).to.be(1); // selector 集合中找当前第一个节点 expect(Dom.index(Dom.query('.index-li')[1], '.index-li')).to.be(1); expect(Dom.index(Dom.get('body'), '.index-li')).to.be(-1); Dom.remove(div); });
tearDown: function() { _$jscoverage['/ie/submit.js'].functionData[2]++; _$jscoverage['/ie/submit.js'].lineData[25]++; var self = this; _$jscoverage['/ie/submit.js'].lineData[27]++; if (visit15_27_1(getNodeName(self) === 'form')) { _$jscoverage['/ie/submit.js'].lineData[28]++; return false; } _$jscoverage['/ie/submit.js'].lineData[30]++; DomEvent.remove(self, 'click keypress', detector); _$jscoverage['/ie/submit.js'].lineData[31]++; Dom.query('form', self).each(function(form) { _$jscoverage['/ie/submit.js'].functionData[3]++; _$jscoverage['/ie/submit.js'].lineData[32]++; if (visit16_32_1(form.__submitFix)) { _$jscoverage['/ie/submit.js'].lineData[33]++; form.__submitFix = 0; _$jscoverage['/ie/submit.js'].lineData[34]++; DomEvent.remove(form, 'submit', { fn: submitBubble, last: 1}); } }); }};
}, getFormData:function(forms) { var elements = [], data = {}; S.each(Dom.query(forms), function(el) { var subs = el.elements ? elementsToArray(el.elements) : [el]; elements.push.apply(elements, subs) }); elements = S.filter(elements, function(el) { return el.name && !el.disabled && (el.checked || rselectTextarea.test(el.nodeName) || rinput.test(el.type)) }); S.each(elements, function(el) { var val = Dom.val(el), vs; if(val === null) { return } if(S.isArray(val)) { val = S.map(val, normalizeCRLF) }else { val = normalizeCRLF(val) } vs = data[el.name]; if(!vs) { data[el.name] = val; return } if(vs && !S.isArray(vs)) { vs = data[el.name] = [vs] } vs.push.apply(vs, S.makeArray(val)) }); return data }};
tearDown: function() { _$jscoverage['/ie/change.js'].functionData[4]++; _$jscoverage['/ie/change.js'].lineData[45]++; var self = this; _$jscoverage['/ie/change.js'].lineData[46]++; if (visit6_46_1(isFormElement(self))) { _$jscoverage['/ie/change.js'].lineData[47]++; if (visit7_47_1(isCheckBoxOrRadio(self))) { _$jscoverage['/ie/change.js'].lineData[48]++; DomEvent.remove(self, 'propertychange', propertyChange); _$jscoverage['/ie/change.js'].lineData[49]++; DomEvent.remove(self, 'click', onClick); } else { _$jscoverage['/ie/change.js'].lineData[51]++; return false; } } else { _$jscoverage['/ie/change.js'].lineData[54]++; DomEvent.remove(self, 'beforeactivate', beforeActivate); _$jscoverage['/ie/change.js'].lineData[55]++; Dom.query('textarea,input,select', self).each(function(fel) { _$jscoverage['/ie/change.js'].functionData[5]++; _$jscoverage['/ie/change.js'].lineData[56]++; if (visit8_56_1(fel.__changeHandler)) { _$jscoverage['/ie/change.js'].lineData[57]++; fel.__changeHandler = 0; _$jscoverage['/ie/change.js'].lineData[58]++; DomEvent.remove(fel, 'change', { fn: changeHandler, last: 1}); } }); } }};
detach: function (targets, type, fn, context) { targets = Dom.query(targets); BaseUtils.batchForType(function (targets, singleType, fn, context) { var cfg = BaseUtils.normalizeParam(singleType, fn, context), i, j, elChildren, t; singleType = cfg.type; for (i = targets.length - 1; i >= 0; i--) { t = targets[i]; removeInternal(t, singleType, cfg); // deep remove if (cfg.deep && t.getElementsByTagName) { elChildren = t.getElementsByTagName('*'); for (j = elChildren.length - 1; j >= 0; j--) { removeInternal(elChildren[j], singleType, cfg); } } } }, 1, targets, type, fn, context); return targets; },
detach: function(targets, type, fn, context) { _$jscoverage['/base/dom-event.js'].functionData[7]++; _$jscoverage['/base/dom-event.js'].lineData[169]++; targets = Dom.query(targets); _$jscoverage['/base/dom-event.js'].lineData[171]++; BaseUtils.batchForType(function(targets, singleType, fn, context) { _$jscoverage['/base/dom-event.js'].functionData[8]++; _$jscoverage['/base/dom-event.js'].lineData[173]++; var cfg = BaseUtils.normalizeParam(singleType, fn, context), i, j, elChildren, t; _$jscoverage['/base/dom-event.js'].lineData[179]++; singleType = cfg.type; _$jscoverage['/base/dom-event.js'].lineData[181]++; for (i = targets.length - 1; visit15_181_1(i >= 0); i--) { _$jscoverage['/base/dom-event.js'].lineData[182]++; t = targets[i]; _$jscoverage['/base/dom-event.js'].lineData[183]++; removeInternal(t, singleType, cfg); _$jscoverage['/base/dom-event.js'].lineData[185]++; if (visit16_185_1(cfg.deep && t.getElementsByTagName)) { _$jscoverage['/base/dom-event.js'].lineData[186]++; elChildren = t.getElementsByTagName('*'); _$jscoverage['/base/dom-event.js'].lineData[187]++; for (j = elChildren.length - 1; visit17_187_1(j >= 0); j--) { _$jscoverage['/base/dom-event.js'].lineData[188]++; removeInternal(elChildren[j], singleType, cfg); } } } }, 1, targets, type, fn, context); _$jscoverage['/base/dom-event.js'].lineData[195]++; return targets; },
preDomReady: function (node) { node.itemTemplate = dom.query(node, 'template'); if (node.itemTemplate) { node.itemTemplate.parentNode.removeChild(node.itemTemplate); node.itemTemplate = BaseComponent.clone(node.itemTemplate); node.itemTemplate.itemRefs = updateItemTemplate(node.itemTemplate); } }
getFormData: function(forms) { _$jscoverage['/io/form-serializer.js'].functionData[3]++; _$jscoverage['/io/form-serializer.js'].lineData[34]++; var elements = [], data = {}; _$jscoverage['/io/form-serializer.js'].lineData[35]++; S.each(Dom.query(forms), function(el) { _$jscoverage['/io/form-serializer.js'].functionData[4]++; _$jscoverage['/io/form-serializer.js'].lineData[38]++; var subs = el.elements ? elementsToArray(el.elements) : [el]; _$jscoverage['/io/form-serializer.js'].lineData[39]++; elements.push.apply(elements, subs); }); _$jscoverage['/io/form-serializer.js'].lineData[42]++; elements = S.filter(elements, function(el) { _$jscoverage['/io/form-serializer.js'].functionData[5]++; _$jscoverage['/io/form-serializer.js'].lineData[44]++; return visit26_44_1(el.name && visit27_46_1(!el.disabled && (visit28_49_1(el.checked || visit29_51_1(rselectTextarea.test(el.nodeName) || rinput.test(el.type)))))); }); _$jscoverage['/io/form-serializer.js'].lineData[58]++; S.each(elements, function(el) { _$jscoverage['/io/form-serializer.js'].functionData[6]++; _$jscoverage['/io/form-serializer.js'].lineData[59]++; var val = Dom.val(el), vs; _$jscoverage['/io/form-serializer.js'].lineData[63]++; if (visit30_63_1(val === null)) { _$jscoverage['/io/form-serializer.js'].lineData[64]++; return; } _$jscoverage['/io/form-serializer.js'].lineData[68]++; if (visit31_68_1(S.isArray(val))) { _$jscoverage['/io/form-serializer.js'].lineData[69]++; val = S.map(val, normalizeCRLF); } else { _$jscoverage['/io/form-serializer.js'].lineData[71]++; val = normalizeCRLF(val); } _$jscoverage['/io/form-serializer.js'].lineData[74]++; vs = data[el.name]; _$jscoverage['/io/form-serializer.js'].lineData[75]++; if (visit32_75_1(!vs)) { _$jscoverage['/io/form-serializer.js'].lineData[76]++; data[el.name] = val; _$jscoverage['/io/form-serializer.js'].lineData[77]++; return; } _$jscoverage['/io/form-serializer.js'].lineData[79]++; if (visit33_79_1(vs && !S.isArray(vs))) { _$jscoverage['/io/form-serializer.js'].lineData[81]++; vs = data[el.name] = [vs]; } _$jscoverage['/io/form-serializer.js'].lineData[83]++; vs.push.apply(vs, S.makeArray(val)); }); _$jscoverage['/io/form-serializer.js'].lineData[85]++; return data; }};
it('should batch execute correctly', function () { // batch 测试: expect(Dom.attr('#test-data input', 'id')).toBe('hidepass'); Dom.attr('#test-data div', 'data-test', 'test'); Dom.query('#test-data div').each(function (el) { expect(Dom.attr(el, 'data-test')).toBe('test'); }); Dom.attr([td], 'style', 'color:green;'); expect(trimCssText(Dom.attr([td], 'style'))) .toBe('color:green'); });
it('option.attr(\'value\')', function () { var s = Dom.create('<select><option value="1">一</option>' + '<option value="">二</option><option>三</option></select>'); Dom.append(s, 'body'); var ret = []; util.each(Dom.query('option', s), function (o) { ret.push(Dom.attr(o, 'value')); }); expect(ret).toEqual(['1', '', undefined]); Dom.remove(s); });
getFormData: function (forms) { var elements = [], data = {}; S.each(Dom.query(forms), function (el) { // form 取其表单元素集合 // 其他直接取自身 var subs = el.elements ? elementsToArray(el.elements) : [el]; elements.push.apply(elements, subs); }); // 对表单元素进行过滤,具备有效值的才保留 elements = S.filter(elements, function (el) { // 有名字 return el.name && // 不被禁用 !el.disabled && ( // radio,checkbox 被选择了 el.checked || // select 或者 textarea rselectTextarea.test(el.nodeName) || // input 类型 rinput.test(el.type) ); // 这样子才取值 }); S.each(elements, function (el) { var val = Dom.val(el), vs; // <select></select> select nothing! // #297 if (val === null) { return; } // 字符串换行平台归一化 if (S.isArray(val)) { val = S.map(val, normalizeCRLF); } else { val = normalizeCRLF(val); } vs = data[el.name]; if (!vs) { data[el.name] = val; return; } if (vs && !S.isArray(vs)) { // 多个元素重名时搞成数组 vs = data[el.name] = [vs]; } vs.push.apply(vs, S.makeArray(val)); }); return data; }
it("should append/prepend correctly on nodelist", function () { var body = $(document.body); $("<div id='testDiv7' class='test-div'>ok7</div>" + "<div id='testDiv8' class='test-div'>ok8</div>").appendTo(body); expect(Dom.get("#testDiv7")).not.toBe(null); expect(Dom.get("#testDiv8")).not.toBe(null); var newNode = $("<div class='test-nodelist'>test-nodelist</div>" + "<div class='test-nodelist'>test-nodelist2</div>"); var testDivs = $(".test-div"); testDivs = testDivs.append(newNode); expect(testDivs.length * 2).toBe(Dom.query(".test-nodelist").length); testDivs.append("<div class='test-nodelist2'>test-nodelist3</div>" + "<div class='test-nodelist2'>test-nodelist4</div>"); expect(testDivs.length * 2).toBe(Dom.query(".test-nodelist2").length); $("#testDiv7").append($("#testDiv8")); expect($("#testDiv8").parent().equals($('#testDiv7'))).toBe(true); testDivs.prepend("<div class='test-nodelist3-pre'>test-nodelist5-pre</div>" + "<div class='test-nodelist3-last'>test-nodelist6-last</div>"); expect(testDivs.length).toBe(Dom.query(".test-nodelist3-pre").length); expect(testDivs.length).toBe(Dom.query(".test-nodelist3-last").length); var pres = $(".test-nodelist3-pre"), lasts = $(".test-nodelist3-last"); expect(pres.length).toBe(lasts.length); for (var i = 0; i < pres.length; i++) { expect(pres.item(i).parent().attr("class")).toBe("test-div"); expect(pres.item(i).prev()).toBe(null); expect(lasts.item(i).prev().equals(pres.item(i))).toBe(true); } });
var DomEvent = {on:function(targets, type, fn, context) { targets = Dom.query(targets); BaseUtils.batchForType(function(targets, type, fn, context) { var cfg = BaseUtils.normalizeParam(type, fn, context), i, t; type = cfg.type; for(i = targets.length - 1;i >= 0;i--) { t = targets[i]; addInternal(t, type, cfg) } }, 1, targets, type, fn, context); return targets }, detach:function(targets, type, fn, context) {
S.mix(NodeList, {all:function(selector, context) { if(typeof selector === "string" && (selector = S.trim(selector)) && selector.length >= 3 && S.startsWith(selector, "<") && S.endsWith(selector, ">")) { if(context) { if(context.getDOMNode) { context = context[0] } context = context.ownerDocument || context } return new NodeList(selector, undefined, context) } return new NodeList(Dom.query(selector, context)) }, one:function(selector, context) {
it('hasClass works', function () { a.className = 'link link2\t' + 'link9 link3'; expect(Dom.hasClass(a, 'link')).toBe(true); expect(Dom.hasClass(a, '.link')).toBe(true); expect(Dom.hasClass(a, 'link4')).toBe(false); expect(Dom.hasClass(a, 'link link3')).toBe(true); expect(Dom.hasClass(a, '.link .link3')).toBe(true); expect(Dom.hasClass(a, 'link link4')).toBe(false); expect(Dom.hasClass(a, '.link .link4')).toBe(false); expect(Dom.hasClass(a, 'link9')).toBe(true); var test = '<div><a></a><a class="a"></a></div>'; var n; Dom.append(n = Dom.create(test), document.body); expect(Dom.hasClass(Dom.query('a', n), '.a')).toBeTruthy(); Dom.remove(n); test = '<div><a></a><a></a></div>'; Dom.append(n = Dom.create(test), document.body); expect(Dom.hasClass(Dom.query('a', n), '.a')).toBeFalsy(); Dom.remove(n); });
}, tearDown:function() { var el = this; if(getNodeName(el) === "form") { return false } DomEvent.remove(el, "click keypress", detector); Dom.query("form", el).each(function(form) { if(form.__submitFix) { form.__submitFix = 0; DomEvent.remove(form, "submit", {fn:submitBubble, last:1}) } }) }};
it("_4eMergeSiblings works", function () { var div = Dom.create("<div >" + "<span class='target'>" + //"1<b>2</b>" + "<span class='innerlast'>innerlast1</span>" + "</span>" + "<span id='s1' _ke_bookmark='1'></span>" + "<b id='b1'></b>" + "<span class='target'>" + "<span class='innerlast'>innerfirst2</span>" + "3<b>4</b>" + "<span class='innerlast'>innerlast2</span>" + "</span>" + "<span id='s2' _ke_bookmark='1'></span>" + "<b id='b2'></b>" + "<span class='target'>" + "<span class='innerlast'>innerfirst3</span>" + //"5<b>6</b>" + "</span>" + "</div>"); Dom.append(div, 'body'); var target = Dom.query('.target', div)[1]; Dom._4eMergeSiblings(target); expect(div.innerHTML.toLowerCase().replace(/=(\w+)/g, "=\"$1\"")) .to.be([ "<span class='target'>" , // "1<b>2</b>" , "<span class='innerlast'>" , "innerlast1" , "<span id='s1' _ke_bookmark='1'></span>" , "<b id='b1'></b>" , "innerfirst2" , "</span>" , "3<b>4</b>" , "<span class='innerlast'>" , "innerlast2" , "<span id='s2' _ke_bookmark='1'></span>" , "<b id='b2'></b>" , "innerfirst3" , "</span>" , // "5<b>6</b>" , "</span>" ].join("").replace(/'/g, '"')); Dom.remove(div); });
all: function (selector, context) { // are we dealing with html string ? // TextNode 仍需要自己 new Node if (typeof selector === 'string' && (selector = S.trim(selector)) && selector.length >= 3 && S.startsWith(selector, '<') && S.endsWith(selector, '>')) { if (context) { if (context.getDOMNode) { context = context[0]; } context = context.ownerDocument || context; } return new Node(selector, undefined, context); } return new Node(Dom.query(selector, context)); },
tearDown: function () { var self = this; if (canFireInput(self)) { unmonitored(self); } else { DomEvent.remove(self, 'focusin', beforeActivate); Dom.query('textarea,input', self).each(function (fel) { if (fel.__inputHandler) { fel.__inputHandler = 0; DomEvent.remove(fel, 'input', noop); } }); } }
}, tearDown:function() { var self = this; if(canFireInput(self)) { unmonitored(self) }else { DomEvent.remove(self, "focusin", beforeActivate); Dom.query("textarea,input", self).each(function(fel) { if(fel.__inputHandler) { fel.__inputHandler = 0; DomEvent.remove(fel, "input", noop) } }) } }};
IO.on("start", function(e) { var io = e.io, form, d, dataType, formParam, data, c = io.config, tmpForm = c.form; if(tmpForm) { form = Dom.get(tmpForm); data = c.data; var isUpload = false; var files = {}; var inputs = Dom.query("input", form); for(var i = 0, l = inputs.length;i < l;i++) { var input = inputs[i]; if(input.type.toLowerCase() === "file") { isUpload = true; if(!FormData) { break } var selected = slice.call(input.files, 0); files[Dom.attr(input, "name")] = selected.length > 1 ? selected : selected[0] || null } } if(isUpload && FormData) { c.files = c.files || {}; S.mix(c.files, files); delete c.contentType } if(!isUpload || FormData) { formParam = FormSerializer.getFormData(form); if(c.hasContent) { formParam = S.param(formParam, undefined, undefined, c.serializeArray); if(data) { c.data += "&" + formParam }else { c.data = formParam } }else { c.uri.query.add(formParam) } }else { dataType = c.dataType; d = dataType[0]; if(d === "*") { d = "text" } dataType.length = 2; dataType[0] = "iframe"; dataType[1] = d } } });
on: function (targets, type, fn, context) { // data : 附加在回调后面的数据,delegate 检查使用 // remove 时 data 相等(指向同一对象或者定义了 equals 比较函数) targets = Dom.query(targets); BaseUtils.batchForType(function (targets, type, fn, context) { var cfg = BaseUtils.normalizeParam(type, fn, context), i, t; type = cfg.type; for (i = targets.length - 1; i >= 0; i--) { t = targets[i]; addInternal(t, type, cfg); } }, 1, targets, type, fn, context); return targets; },
it('should support batch adding.', function () { var lis = Dom.query('#bar li'), total = lis.length, count = 0; Event.on(lis, 'click', function () { count++; }); // click all lis util.each(lis, function (li) { simulate(li, 'click'); }); waits(0); runs(function () { expect(count).toEqual(total); }); });
tearDown: function () { var self = this; // form use native if (getNodeName(self) === 'form') { return false; } DomEvent.remove(self, 'click keypress', detector); Dom.query('form', self).each(function (form) { if (form.__submitFix) { form.__submitFix = 0; DomEvent.remove(form, 'submit', { fn: submitBubble, last: 1 }); } }); }
all: function (selector, context) { // are we dealing with html string ? // TextNode 仍需要自己 new Node if (typeof selector === 'string' && (selector = util.trim(selector)) && selector.length >= 3 && util.startsWith(selector, '<') && util.endsWith(selector, '>')) { var attrs; if (context) { if (context.getDOMNode) { context = context[0]; } if (!context.nodeType) { attrs = context; context = arguments[2]; } } return new Node(selector, attrs, context); } return new Node(Dom.query(selector, context)); },
BaseUtils.splitAndRun(eventType, function(eventType) { _$jscoverage['/base/dom-event.js'].functionData[12]++; _$jscoverage['/base/dom-event.js'].lineData[257]++; var r, i, target, domEventObservable; _$jscoverage['/base/dom-event.js'].lineData[262]++; BaseUtils.fillGroupsForEvent(eventType, eventData); _$jscoverage['/base/dom-event.js'].lineData[265]++; eventType = eventData.type; _$jscoverage['/base/dom-event.js'].lineData[266]++; var s = Special[eventType]; _$jscoverage['/base/dom-event.js'].lineData[268]++; var originalType = eventType; _$jscoverage['/base/dom-event.js'].lineData[272]++; if (visit19_272_1(s && s.typeFix)) { _$jscoverage['/base/dom-event.js'].lineData[274]++; originalType = s.typeFix; } _$jscoverage['/base/dom-event.js'].lineData[277]++; targets = Dom.query(targets); _$jscoverage['/base/dom-event.js'].lineData[279]++; for (i = targets.length - 1; visit20_279_1(i >= 0); i--) { _$jscoverage['/base/dom-event.js'].lineData[280]++; target = targets[i]; _$jscoverage['/base/dom-event.js'].lineData[281]++; domEventObservable = DomEventObservable.getDomEventObservable(target, originalType); _$jscoverage['/base/dom-event.js'].lineData[284]++; if (visit21_284_1(!onlyHandlers && !domEventObservable)) { _$jscoverage['/base/dom-event.js'].lineData[285]++; domEventObservable = new DomEventObservable({ type: originalType, currentTarget: target}); } _$jscoverage['/base/dom-event.js'].lineData[290]++; if (visit22_290_1(domEventObservable)) { _$jscoverage['/base/dom-event.js'].lineData[291]++; r = domEventObservable.fire(eventData, onlyHandlers); _$jscoverage['/base/dom-event.js'].lineData[292]++; if (visit23_292_1(visit24_292_2(ret !== false) && visit25_292_3(r !== undefined))) { _$jscoverage['/base/dom-event.js'].lineData[293]++; ret = r; } } } });
BaseUtils.splitAndRun(eventType, function (eventType) { var r, i, target, domEventObservable; BaseUtils.fillGroupsForEvent(eventType, eventData); // mouseenter eventType = eventData.type; var s = Special[eventType]; var originalType = eventType; // where observers lie // mouseenter observer lies on mouseover if (s && s.typeFix) { // mousemove originalType = s.typeFix; } targets = Dom.query(targets); for (i = targets.length - 1; i >= 0; i--) { target = targets[i]; domEventObservable = DomEventObservable.getDomEventObservable(target, originalType); // bubbling // html dom event defaults to bubble if (!onlyHandlers && !domEventObservable) { domEventObservable = new DomEventObservable({ type: originalType, currentTarget: target }); } if (domEventObservable) { r = domEventObservable.fire(eventData, onlyHandlers); if (ret !== false && r !== undefined) { ret = r; } } } });
tearDown: function () { var self = this; if (isFormElement(self)) { if (isCheckBoxOrRadio(self)) { DomEvent.remove(self, 'propertychange', propertyChange); DomEvent.remove(self, 'click', onClick); } else { return false; } } else { DomEvent.remove(self, 'beforeactivate', beforeActivate); Dom.query('textarea,input,select', self).each(function (fel) { if (fel.__changeHandler) { fel.__changeHandler = 0; DomEvent.remove(fel, 'change', {fn: changeHandler, last: 1}); } }); } }
}, tearDown:function() { var el = this; if(isFormElement(el)) { if(isCheckBoxOrRadio(el)) { DomEvent.remove(el, "propertychange", propertyChange); DomEvent.remove(el, "click", onClick) }else { return false } }else { DomEvent.remove(el, "beforeactivate", beforeActivate); Dom.query("textarea,input,select", el).each(function(fel) { if(fel.__changeHandler) { fel.__changeHandler = 0; DomEvent.remove(fel, "change", {fn:changeHandler, last:1}) } }) } }};
beforeEach(function () { window.$('body').append(tpl); foo = Dom.get('#foo-class'); a = Dom.get('#foo-class a'); input = Dom.get('#foo-class input'); radio = Dom.get('#test-radio-class'); radio2 = Dom.get('#test-radio2-class'); button = Dom.get('#foo-class button'); label = Dom.get('#foo-class label'); table = Dom.get('#test-table'); td = Dom.get('#test-table td'); select = Dom.get('#test-select'); select2 = Dom.get('#test-select2'); select3 = Dom.get('#test-select3'); opt = Dom.get('#test-opt'); div = Dom.get('#test-div'); opt2 = Dom.query('#test-select option')[1]; area = Dom.get('#foo textarea'); });