TQuery

我的仿jq库

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/11045/1572734/TQuery.js

  1. ;(function(win, doc, undefined) {
  2. var $ = (function() {
  3. //构造函数
  4. var TQuery = function(selectors){
  5. return TQuery.fn.init(selectors);
  6. };
  7. var vision = 1.02;
  8. TQuery.fn = TQuery.prototype = {
  9. "constructor": TQuery,
  10. "TQuery": vision,
  11. //初始化
  12. "init": function(selectors) {
  13. this.selectors = selectors;
  14. var eles = []; //所有选择的元素
  15. switch (typeof selectors) {
  16. case "undefined":
  17. return this;
  18. case "function":
  19. this.ready(function(e){
  20. selectors.call(this, e);
  21. });
  22. break;
  23. case "string":
  24. switch (selectors.charAt(0)) {
  25. case '<': //<div></div>,创建元素
  26. var oDiv = doc.createElement('div'); //创建一个容器
  27. var oFragment = doc.createDocumentFragment(); //创建文档碎片
  28. oDiv.innerHTML = selectors;
  29. var child = oDiv.childNodes;
  30. //储存在文档碎片中
  31. for (var t = 0; t < child.length; t++) {
  32. var clone = child[t].cloneNode(true);
  33. oFragment.appendChild(clone);
  34. }
  35. //输出到对象中
  36. var temp = [];
  37. for (var i = 0; i < oFragment.childNodes.length; i++) {
  38. temp.push(oFragment.childNodes[i]);
  39. }
  40. eles = temp;
  41. break;
  42. default: //默认情况下是选择符
  43. //现代浏览器,IE8+,chrome,firefox,safari,opera
  44. if (doc.querySelectorAll) {
  45. var aElems = doc.querySelectorAll(selectors);
  46. for (var o = 0; o < aElems.length; o++) {
  47. eles.push(aElems[o]);
  48. }
  49. }
  50. //IE8以下
  51. else{
  52. console.log('您的浏览器不支持TQuery');
  53. }
  54. }
  55. break;
  56. case "object":
  57. // //数组
  58. // if (TQuery.isArray(selectors)) {
  59. // $ARR(selectors);
  60. // }
  61. //DOM
  62. // else if (TQuery.isDOM(selectors)) {
  63. eles.push(selectors);
  64. // }
  65. //普通对象,IE8下,一切皆为对象
  66. // else {
  67. // $OBJ(selectors);
  68. // }
  69. break;
  70. default:
  71. return this;
  72. }
  73. this.refresh(eles);
  74. return this;
  75. },
  76. //重拾新的对象
  77. "reinit":function(selectors){
  78. return this.init(selectors);
  79. },
  80. //刷新对象数据
  81. "refresh": function(newArray) {
  82. //清空
  83. for (var j = 0; j < this.length; j++) {
  84. delete this[j];
  85. }
  86. if (newArray) this.init.elements = newArray;
  87. this.length = this.init.elements.length;
  88. //生成
  89. for (var i = 0; i < this.init.elements.length; i++) {
  90. this[i] = this.init.elements[i];
  91. }
  92. },
  93. //==============选择器=============
  94. "eq": function(n) {
  95. var m = n || 0,
  96. newArray = [];
  97. newArray[0] = this[m];
  98. this.refresh(newArray);
  99. return this;
  100. },
  101. //CSS3:nth-child
  102. "nth":function(selectors){
  103. var s = this.selectors.split(",");//'input,ul li'
  104. for( var i=0;i<s.length;i++ ){
  105. s[i] += ':nth-child(' + selectors + ')';
  106. }
  107. return this.reinit(s.join(","));
  108. },
  109. //倍数选择器
  110. "an":function(n){
  111. n = n ? n : 1;
  112. this.nth(n + 'n');
  113. },
  114. //奇数,2n-1
  115. "odd":function(){
  116. return this.nth('odd');
  117. },
  118. //偶数,2n
  119. "even":function(){
  120. return this.nth('even');
  121. },
  122. "first": function() {
  123. var s = this.selectors.split(",");//'input,ul li'
  124. for( var i=0;i<s.length;i++ ){
  125. s[i] += ':first-child';
  126. }
  127. return this.reinit( s.join(",") );
  128. },
  129. //选择倒数第几个,默认为0
  130. "last":function(n){
  131. n = n ? n : 1;
  132. var s = this.selectors.split(",");//'input,ul li'
  133. for( var i=0;i<s.length;i++ ){
  134. s[i] += ':nth-last-child(' + n + ')';
  135. }
  136. return this.reinit( s.join(",") );
  137. },
  138. "not": function(selectors) {//过滤掉
  139. var childElements = [];
  140. for (var i = 0; i < this.length; i++) {
  141. switch (selectors.charAt(0)) {
  142. case '#': //id
  143. if (this[i].id != selectors.substring(1)) {
  144. childElements.push(this[i]);
  145. }
  146. break;
  147. case '.': //class
  148. if (!this.hasClass(this[i], selectors.substring(1))) { //没有匹配到class
  149. childElements.push(this[i]);
  150. }
  151. break;
  152. default: //tagName
  153. if (this[i].tagName != selectors.toUpperCase()) {
  154. childElements.push(this[i]);
  155. }
  156. }
  157. }
  158. this.refresh(childElements);
  159. return this;
  160. },
  161. "filter": function(selectors) {//筛选
  162. var childElements = [];
  163. for (var i = 0; i < this.length; i++) {
  164. var ele = this[i];
  165. switch (selectors.charAt(0)) {
  166. case '#':
  167. if (this[i].id == selectors.substring(1)) {
  168. childElements.push(ele);
  169. }
  170. break;
  171. case '.':
  172. if (this.hasClass(ele, selectors.substring(1))) { //如果有class
  173. childElements.push(ele);
  174. }
  175. break;
  176. case '[':
  177. var attrinfo = selectors.replace(/(\[+|\]+|\"|\"+])/g, '').split('=');
  178. var attr = attrinfo[0];
  179. var value = attrinfo[1];
  180. if (attrinfo.length === 1) { //只过滤属性,没有值
  181. if (ele[attr] !== null || ele.getAttribute(attr)) {
  182. childElements.push(ele);
  183. }
  184. } else if (attrinfo.length == 2) { //过滤属性值
  185. if (ele[attr] == value || ele.getAttribute(attr) == value) {
  186. childElements.push(ele);
  187. }
  188. }
  189. break;
  190. default:
  191. if (ele.tagName == selectors.toUpperCase()) {
  192. childElements.push(ele);
  193. }
  194. }
  195. }
  196. this.refresh(childElements);
  197. return this;
  198. },
  199. "find": function(selectors) {//查找子节点
  200. var childElements = [];
  201. for (var i = 0; i < this.length; i++) {
  202. var aElems = this[i].querySelectorAll(selectors);
  203. var length = aElems.length;
  204. var j = 0;
  205. while (j < length) {
  206. childElements.push(aElems[j]);
  207. j++;
  208. }
  209. }
  210. this.refresh(childElements);
  211. return this;
  212. },
  213. "add": function(selectors) {
  214. var newSelectors = this.selectors + ',' + selectors;
  215. var newElements = doc.querySelectorAll(newSelectors);
  216. this.refresh(newElements);
  217. return this;
  218. },
  219. "slice": function(n, m) {
  220. if (n < 0 || m > this.length) return;
  221. var newArray = this.init.elements.slice(n, m + 1);
  222. this.refresh(newArray);
  223. return this;
  224. },
  225. //还原最初状态
  226. "end": function() {
  227. var newArray = doc.querySelectorAll(this.selectors);
  228. this.refresh(newArray);
  229. return this;
  230. },
  231. //是否包含元素
  232. "has": function(selectors) {
  233. var newArray = [];
  234. for (var i = 0; i < this.length; i++) {
  235. if (this[i].querySelectorAll(selectors).length > 0) {
  236. newArray.push(this[i]);
  237. }
  238. }
  239. this.refresh(newArray);
  240. return this;
  241. },
  242. //可见
  243. "visible":function(){
  244.  
  245. },
  246. //不可见
  247. "unvisible":function(){
  248.  
  249. },
  250. //在可视区域内的
  251. "inViewPort": function() {
  252. this.inViewPort.get = function(jugg) {
  253. var visi = [],
  254. unvisi = [],
  255. w, h, pos, inViewPort;
  256. for (var i = 0; i < this.length; i++) {
  257. pos = this[i].getBoundingClientRect();
  258. w = doc.documentElement.clientWidth || doc.body.clientWidth;
  259. h = doc.documentElement.clientHeight || doc.body.clientHeight;
  260. inViewPort = pos.top > h || pos.bottom < 0 || pos.left > w || pos.right < 0;
  261. if (inViewPort === true) { //不在可视区域
  262. unvisi.push(this[i]);
  263. } else { //在可视区域
  264. visi.push(this[i]);
  265. }
  266. }
  267. return jugg === true ? visi : unvisi;
  268. };
  269. var newArray = this.inViewPort.get.call(this, true);
  270. this.refresh(newArray);
  271. return this;
  272. },
  273. //不在可视区域内
  274. "outViewPort": function() {
  275. var newArray = this.inViewPort.get.call(this, false);
  276. this.refresh(newArray);
  277. return this;
  278. },
  279. //==============遍历=============
  280. "each": function(fn) {
  281. for (var i = 0; i < this.length; i++) {
  282. fn.call(this[i]);
  283. }
  284. return this;
  285. },
  286. "findParent": function(selectors) {
  287. var parent = this[0].parentNode;
  288. if (parent.className.match(/result/)) { //找到结果
  289. var newArray = [];
  290. newArray[0] = parent;
  291. this.refresh(newArray);
  292. return this;
  293. } else if (parent == doc.documentElement || parent == doc.body) { //到达DOM顶层
  294. return this;
  295. } else { //继续查找
  296. this.findParent(selectors);
  297. }
  298. },
  299. "parent": function() {
  300. var newArray = [];
  301. newArray[0] = this[0].parentNode;
  302. this.refresh(newArray);
  303. return this;
  304. },
  305. "parents": function() {
  306. var newArray = []; //存储所有的父节点
  307. var hash = {};
  308. for (var i = 0; i < this.length; i++) {
  309. var v = this[i].parentNode;
  310. if (typeof(hash[v]) == 'undefined') {
  311. hash[v] = 1;
  312. newArray.push(v);
  313. }
  314. }
  315. this.refresh(newArray);
  316. return this;
  317. },
  318. "children": function() {
  319. var childElements = []; //存放所有的子节点
  320. var hash = {}; //过滤已经重复的子节点,中转站
  321. for (var i = 0; i < this.length; i++) {
  322. if (this[i].hasChildNodes() === false) {
  323. continue;
  324. }
  325. for (var j = 0; j < this[i].children.length; j++) {
  326. childElements.push(this[i].children[j]);
  327. }
  328. }
  329. var newArray = TQuery.unique(childElements);
  330. this.refresh(newArray);
  331. return this;
  332. },
  333. "prev": function() {
  334. var temps = [];
  335. for (var i = 0; i < this.length; i++) {
  336. var ele = this[i];
  337. if ($(ele).index() === 0) { //如果处在第一位,没有上一个兄弟节点
  338. continue;
  339. }
  340. temps.push(ele.parentNode.children[$(ele).index() - 1]);
  341. }
  342. this.refresh(temps);
  343. return this;
  344. },
  345. "prevAll": function() {
  346. var prevAllElements = [];
  347. for (var i = 0; i < this.length; i++) {
  348.  
  349. }
  350. return this;
  351. },
  352. "next": function() {
  353. var temps = [];
  354. for (var i = 0; i < this.length; i++) {
  355. var ele = this[i];
  356. if ($(ele).index() == ele.parentNode.children.length - 1) { //如果处最后一位,没有下一个兄弟节点
  357. continue;
  358. }
  359. temps.push(ele.parentNode.children[$(ele).index() + 1]);
  360. }
  361. this.refresh(temps);
  362. return this;
  363. },
  364. "nextAll": function() {
  365. return this;
  366. },
  367. "siblings": function(selectors) {
  368. var temps = [];
  369. var parentNode = this.parents().elements;
  370. var parentNodeLength = parentNode.length;
  371. var allChild;
  372. for (var i = 0; i < parentNodeLength; i++) {
  373. allChild = parentNode[i].children; //所有同胞元素集合
  374. for (var j = 0; j < allChild.length; j++) {
  375. temps.push(allChild[j]); //获取所有同胞元素,包括自身
  376. }
  377. }
  378. this.refresh(temps);
  379. //如果有参数传入,则过滤同胞元素
  380. if (selectors) {
  381. this.not(selectors);
  382. }
  383. return this;
  384. },
  385. //==============事件=============
  386. "ready": function(fn) {
  387. if (this[0] == win) this[0] = doc;
  388. this.reinit(doc).bind('DOMContentLoaded', function(e) {
  389. fn.call(this, e);
  390. this.ready = "complete";
  391. // $(this).unbind('DOMContentLoaded',"ready");
  392. });
  393. //如果不支持DOMContentLoaded(IE8及以下不支持),
  394. if( !TQuery.browser.msie() || TQuery.browser().visoin>8 ) return this;
  395. if( typeof this[0].ready == "undefined" ||this[0].ready!=="complete" ){
  396. if( typeof this[0].onreadystatechange !== "undefined" ){
  397. this.bind('readystatechange',function(e){
  398. if(this.readyState == 'complete'){
  399. fn.call(this, e);
  400. this.ready = "complete";
  401. $(this).unbind('readystatechange',"ready");
  402. return false;
  403. }
  404. },"ready");
  405. }
  406. // 不支持document.onreadystatechange
  407. else{
  408. (function(){
  409. try{
  410. //doScroll方法只有在dom ready之后可以调用,否则会抛异常
  411. doc.documentElement.doScroll('left');
  412. }catch(e){
  413. win.setTimeout( arguments.callee, 0 );
  414. return;
  415. }
  416. //这里触发DOMContentLoaded事件
  417. fn.call(doc);
  418. doc.ready = "complete";
  419. })();
  420. }
  421. }
  422. return this;
  423. },
  424. "load": function(fn) {
  425. if (this[0] == doc) this[0] = win;
  426. this.bind('load', function(e) {
  427. if (fn.call(this, e) === false) {
  428. return stop.call(e);
  429. }
  430. },'load');
  431. return this;
  432. },
  433. "unload":function(fn){
  434. this.reinit(win).bind('unload',function(e){
  435. fn.call(this,e);
  436. return stop.call(e);
  437. },"unload");
  438. },
  439. "isreload":function(message){
  440. this.reinit(win).bind('beforeunload',function(e){
  441. e.returnValue = message;
  442. return message;
  443. },'beforeunload');
  444. },
  445. "click": function(fn) {
  446. this.bind('click', function(e) {
  447. if (fn.call(this, e) === false) {
  448. return stop.call(e);
  449. }
  450. });
  451. return this;
  452. },
  453. "keydown": function(fn) {
  454. this.bind('keydown', function(e) {
  455. if (fn.call(this, e) === false) {
  456. return stop.call(e);
  457. }
  458. });
  459. return this;
  460. },
  461. "keyup": function(fn) {
  462. this.bind('keyup', function(e) {
  463. if (fn.call(this, e) === false) {
  464. return stop.call(e);
  465. }
  466. });
  467. return this;
  468. },
  469. "keypress": function(fn) {
  470. this.bind('keypress', function(e) {
  471. if (fn.call(this, e) === false) {
  472. return stop.call(e);
  473. }
  474. });
  475. return this;
  476. },
  477. "mousedown": function(fn) {
  478. this.bind('mousedown', function(e) {
  479. if (fn.call(this, e) === false) {
  480. return stop.call(e);
  481. }
  482. });
  483. return this;
  484. },
  485. "mouseup": function(fn) {
  486. this.bind('mouseup', function(e) {
  487. if (fn.call(this, e) === false) {
  488. return stop.call(e);
  489. }
  490. });
  491. return this;
  492. },
  493. "mouseenter": function(fn) {
  494. this.bind("mouseover", function(e) {
  495. if (e.target == this) {
  496. fn.call(this, e);
  497. }
  498. return stop.call(e); //默认禁止冒泡
  499. });
  500. return this;
  501. },
  502. "mouseleave": function(fn) {
  503. this.bind("mouseout", function(e) {
  504. if (e.target == this) {
  505. fn.call(this, e);
  506. }
  507. return stop.call(e); //默认禁止冒泡
  508. });
  509. return this;
  510. },
  511. "mousemove": function(fn) {
  512. this.bind("mousemove", function(e) {
  513. if (fn.call(this, e) === false) {
  514. return stop.call(e);
  515. }
  516. });
  517. return this;
  518. },
  519. "mouseover": function(fn) {
  520. this.bind("mouseover", function(e) {
  521. if (fn.call(this, e) === false) {
  522. return stop.call(e);
  523. }
  524. });
  525. return this;
  526. },
  527. "mouseout": function(fn) {
  528. this.bind("mouseout", function(e) {
  529. if (fn.call(this, e) === false) {
  530. return stop.call(e);
  531. }
  532. });
  533. return this;
  534. },
  535. "on": function(type, fn) {
  536. var ev = null;
  537. //如果只传一个json参数
  538. if (arguments.length == 1) {
  539. for (var k = 0; k < this.length; k++) {
  540. for (var attr in type) {
  541. // this[k][ 'on'+attr ] = type[attr];
  542. this[k]['on' + attr] = function(e) {
  543. ev = win.event ? win.event : (e ? e : null);
  544. if (type[attr].call(this, ev) === false) {
  545. return stop.call(e);
  546. }
  547. };
  548. }
  549. }
  550. }
  551. //如果传两个参数type,fn
  552. else {
  553. var events = type.split(' '); //获取每个事件
  554. var eventsLength = events.length;
  555. for (var i = 0; i < this.length; i++) {
  556. var j = 0;
  557. while (j < eventsLength) {
  558. // this[i][ 'on'+events[j] ] = fn;
  559. this[i]['on' + events[j]] = function(e) {
  560. ev = win.event ? win.event : (e ? e : null);
  561. if (fn.call(this, ev) === false) {
  562. ev.stopPropagation(); //阻止冒泡,w3c标准
  563. ev.cancelBubble = true; //阻止冒泡,ie,firefox
  564. ev.preventDefault(); //w3c标准
  565. ev.returnValue = false; //阻止默认事件,针对老版本IE
  566. return false;
  567. }
  568. };
  569. j++;
  570. }
  571. }
  572. }
  573. return this;
  574. },
  575. "hover": function(mouseenter, mouseleave) {
  576. this.mouseenter(function(e) {
  577. mouseenter.call(this, e);
  578. });
  579. this.mouseleave(function(e) {
  580. mouseleave.call(this, e);
  581. });
  582. return this;
  583. },
  584. "toggleClick": function() {
  585. var _this = this,
  586. _arguments = arguments,
  587. data = this.data('toggleClick'); //获取属性
  588. if (typeof data.count == "undefined") data.count = 0;
  589. if (typeof data.fns == "undefined") data.fns = arguments.length;
  590. this.data('toggleClick', data); //设置属性
  591. for (var i = 0; i < this.length; i++) {
  592. this.bind('click', function() {
  593. _arguments[data.count++ % data.fns].call(_this[i]);
  594. return stop.call(e);; //默认禁止冒泡
  595. }, 'toggleClick');
  596. }
  597. return this;
  598. },
  599. "resize":function(fn){
  600. this.bind('resize',function(e){
  601. if( fn.call(this,e) === false){
  602. return stop.call(e);
  603. }
  604. });
  605. },
  606. "scroll": function(fn) {
  607. this.bind('scroll', function(e) {
  608. if (fn.call(this, e) === false) {
  609. return stop.call(e);
  610. }
  611. });
  612. return this;
  613. },
  614. "mouseScroll": function(fn) {
  615. this.bind('mousewheel DOMMouseScroll', function(e) {
  616. if (fn.call(this, e) === false) {
  617. return stop.call(e);
  618. }
  619. },'mouseScroll');
  620. return this;
  621. },
  622. "mouseScrollUp": function(fn) {
  623. this.bind('mousewheel DOMMouseScroll', function(e) {
  624. if (e.wheelDelta) { //chrome,ie
  625. if (e.wheelDelta > 0) { //滚轮向上滚动
  626. if (fn.call(this, e) === false) {
  627. return stop.call(e);
  628. }
  629. }
  630. } else { //狗日的firefox
  631. if (e.detail < 0) { //滚轮向上滚动
  632. if (fn.call(this, e) === false) {
  633. return stop.call(e);
  634. }
  635. }
  636. }
  637. }, "mouseScrollUp");
  638. return this;
  639. },
  640. "mouseScrollDown": function(fn) {
  641. this.bind('mousewheel DOMMouseScroll', function(e) {
  642. if (e.wheelDelta) { //chrome,ie
  643. if (e.wheelDelta < 0) { //滚轮向下滚动
  644. if (fn.call(this, e) === false) {
  645. return stop.call(e);
  646. }
  647. }
  648. } else { //狗日的firefox
  649. if (e.detail > 0) { //滚轮向下滚动
  650. if (fn.call(this, e) === false) {
  651. return stop.call(e);
  652. }
  653. }
  654. }
  655. }, "mouseScrollDown");
  656. return this;
  657. },
  658. "bind": function(type, fn, fnName) {
  659. //如果只传一个json参数
  660. if (arguments.length == 1) {
  661. for (var k = 0; k < this.length; k++) {
  662. for (var attr in type) {
  663. bindEvent(this[k], attr, type[attr], fnName);
  664. }
  665. }
  666. }
  667. //如果传两个参数,则多个事件统一执行一个e
  668. else {
  669. var events = type.split(' ');
  670. for (var i = 0; i < this.length; i++) {
  671. var j = 0;
  672. while (j < events.length) {
  673. bindEvent.call(this[i], this[i], events[j], fn, fnName);
  674. j++;
  675. }
  676. }
  677. }
  678.  
  679. function bindEvent(dom, type, fn, fnName) {
  680. dom.eventQueue = dom.eventQueue || {};
  681. dom.eventQueue[type] = dom.eventQueue[type] || {};
  682. dom.handler = dom.handler || {};
  683. var index = 0; //事件队列长度
  684. for (var length in dom.eventQueue[type]) {
  685. index++;
  686. }
  687. if (!fnName) {
  688. dom.eventQueue[type]['fn' + index] = fn;
  689. } else {
  690. dom.eventQueue[type][fnName] = fn;
  691. // this.fnName = fnName;
  692. }
  693. //如果不存在handler[click],handler[mouseover],…………
  694. if (!dom.handler[type]) {
  695. dom.handler[type] = function(e) {
  696. ev = win.event ? win.event : (e ? e : null);
  697. ev.target = ev.target || ev.srcElement;
  698. for (var fn in dom.eventQueue[type]) {
  699. if (dom.eventQueue[type][fn].call(this, ev) === false) {
  700. return stop.call(ev);
  701. }
  702. }
  703. };
  704. addEvent(dom, type, dom.handler[type]);
  705. }
  706. }
  707. return this;
  708. },
  709. "unbind": function(type, fnName) {
  710. for (var m = 0; m < this.length; m++) {
  711. var dom = this[m];
  712. var hasQueue = dom.eventQueue && dom.eventQueue[type];
  713. var queueLength = 0;
  714. for (var length in dom.eventQueue[type]) {
  715. queueLength++;
  716. }
  717. //没有绑定
  718. if (!hasQueue) return;
  719. if (!fnName) { //解除匿名函数
  720. if (win.removeEventListener) {
  721. dom.removeEventListener(type, dom.handler[type]);
  722. } else {
  723. dom.detachEvent(type, dom.handler[type]);
  724. }
  725. delete dom.eventQueue[type];
  726. }
  727. else { //解除有名函数
  728. delete dom.eventQueue[type][fnName];
  729. //如果没有队列了,则删除队列。
  730. if (queueLength === 0) {
  731. if (win.removeEventListener) {
  732. dom.removeEventListener(type, dom.handler[type]);
  733. } else {
  734. dom.detachEvent(type, dom.handler[type]);
  735. }
  736. delete dom.eventQueue[type];
  737. }
  738. }
  739. }
  740. },
  741. "one": function(type, fn) {
  742. var _this = this;
  743. //只穿一个json参数
  744. if (arguments.length == 1) {
  745. for (var k = 0; k < this.length; k++) {
  746. for (var attr in type) {
  747. // bindEvent(this[k],attr,type[attr],fnName);
  748. this.bind(attr, function(e) {
  749. var ev = win.event ? win.event : (e ? e : null);
  750. _this.unbind(ev.type, 'one');
  751. if (type[attr].call(this, ev) === false) {
  752. return stop.call(e);
  753. }
  754. }, "one");
  755. }
  756. }
  757. }
  758. //传2个参数
  759. else {
  760. var events = type.split(' '); //获取每个事件
  761. var eventsLength = events.length;
  762. for (var i = 0; i < this.length; i++) {
  763. var j = 0;
  764. while (j < eventsLength) {
  765. // this[i][ 'on'+events[j] ] = fn;
  766. this.bind(events[j], function(e) {
  767. var ev = win.event ? win.event : (e ? e : null);
  768. _this.unbind(ev.type, 'one');
  769. if (fn.call(this, ev) === false) {
  770. return stop.call(e);
  771. }
  772. }, "one");
  773. j++;
  774. }
  775. }
  776. }
  777. return this;
  778. },
  779. "trigger": function(type, fnName) {
  780. for (var k = 0; k < this.length; k++) {
  781. var dom = this[k];
  782. if (!fnName) {
  783. //如果是自定义事件
  784. if ( TQuery.isUndefined(dom["on" + type]) || TQuery.isUndefined(dom[type]) ) {
  785. //触发DOM2级事件,通过bind绑定的。
  786. if (dom.eventQueue) {
  787. for (var fn in dom.eventQueue[type]) {
  788. dom.eventQueue[type][fn].call(dom);
  789. }
  790. }
  791. }
  792. //如果是DOM原生事件
  793. else {
  794. // 触发DOM0,DOM2级事件,不通过bind绑定的
  795. if (typeof dom[type] !== "undefined") {
  796. dom[type].call(dom);
  797. }
  798. }
  799. }
  800. //指定触发哪个函数
  801. else {
  802. dom.eventQueue[type][fnName].call(dom);
  803. }
  804. }
  805. return this;
  806. },
  807. "triggerHandler":function(type, fnName){
  808. this.trigger(type, fnName);
  809. },
  810. "live": function(type, fn, parent) {
  811. var _this = this,
  812. liveIndex = "live" + parseFloat(Math.random() * 10).toFixed(10).replace('.', "");
  813. parent = parent ? parent : doc;
  814. for (var j = 0; j < this.length; j++) {
  815. this[j].parentLive = parent;
  816. this[j].liveIndex = liveIndex;
  817. }
  818. $(parent).bind(type, function(e) {
  819. for (var i = 0; i < _this.length; i++) {
  820. if (e.target == _this[i]) {
  821. fn.call(e.target, e);
  822. break;
  823. }
  824. }
  825. return stop.call(e);//默认阻止冒泡
  826. }, liveIndex);
  827. return this;
  828. },
  829. "die": function(type, parent) {
  830. var liveIndex = this[0].liveIndex;
  831. parent = parent ? parent : (this[0].parentLive ? this[0].parentLive : doc);
  832. $(parent).unbind(type, liveIndex);
  833. },
  834. "mutation": function(options, fn) {
  835. var MutationObserver, observer;
  836. for (var i = 0; i < this.length; i++) {
  837. MutationObserver = win.MutationObserver || win.WebKitMutationObserver || win.MozMutationObserver;
  838. observer = new MutationObserver(function(mutations) {
  839. mutations.forEach(function(mutation) {
  840. fn.call(this[i]);
  841. });
  842. });
  843. observer.observe(this[i], options);
  844. }
  845. return this;
  846. },
  847. //支持的标签<input type="text">, <select>, <textarea>,js对象:fileUpload, select, text, textarea
  848. "change":function(fn){
  849. this.bind('change',function(e){
  850. fn.call(this,e);
  851. });
  852. },
  853. //==============尺寸=============
  854. "width": function(setting) {
  855. if (!setting && this[0] instanceof Object && (this[0].alert || this[0].body)) { //如果是win,或document
  856. return doc.body.scrollWidth > doc.documentElement.scrollWidth ? doc.body.scrollWidth : doc.documentElement.scrollWidth; //获取带padding和margin的值
  857. } else if (setting) { //设置宽度
  858. for (var i = 0; i < this.length; i++) {
  859. this[i].style.width = setting.toString().replace('px', '') + 'px';
  860. }
  861. return this;
  862. } else {
  863. return this[0].offsetWidth || parseFloat(this.style('width')); //获取宽度
  864. }
  865. },
  866. "height": function(setting) {
  867. if (this[0] instanceof Object && (this[0].alert || this[0].body)) { //如果是win,或document,则返回整个文档高度
  868. return doc.body.scrollHeight > doc.documentElement.scrollHeight ? doc.body.clientHeight : doc.documentElement.scrollHeight; //获取带padding和margin的值
  869. } else if (setting) { //设置高度
  870. for (var i = 0; i < this.length; i++) {
  871. this[i].style.height = setting.toString().replace('px', '') + 'px';
  872. }
  873. return this;
  874. } else if (!setting) {
  875. return this[0].offsetHeight || parseFloat(this.style('height')); //获取高度
  876. }
  877. },
  878. "innerWidth": function() {
  879.  
  880. },
  881. "innerHeight": function() {
  882.  
  883. },
  884. "top": function(setting) {
  885. if (setting) {
  886. this.css('top', setting);
  887. return this;
  888. }
  889. return parseInt(this[0].offsetTop);
  890. },
  891. "left": function(setting) {
  892. if (setting) {
  893. this.css('left', setting);
  894. return this; //返回对象,进行链式操作
  895. }
  896. return parseInt(this[0].offsetLeft);
  897. },
  898. "viewWidth": function() {
  899. return doc.body.clientWidth < doc.documentElement.clientWidth ? doc.body.clientWidth : doc.documentElement.clientWidth; //取较小值
  900. },
  901. "viewHeight": function() {
  902. return doc.body.clientHeight < doc.documentElement.clientHeight ? doc.body.clientHeight : doc.documentElement.clientHeight; //取较小值
  903. },
  904. "style": function(attr) {
  905. return this[0].currentStyle ? this[0].currentStyle[attr] : getComputedStyle(this[0])[attr];
  906. },
  907. "scrollTop": function() {
  908. return this.size('scrollTop');
  909. },
  910. "scrollHeight": function() {
  911. return this.size('scrollHeight');
  912. },
  913. "scrollLeft": function() {
  914. return this.size('scrollLeft');
  915. },
  916. "scrollWidth": function() {
  917. return this.size('scrollLeft');
  918. },
  919. "size": function(attr) {
  920. return doc.documentElement[attr] ? doc.documentElement[attr] : doc.body[attr];
  921. },
  922. //包含margin
  923. "offset": function(attr) {
  924. return this[0]['offset' + TQuery.upper(attr)];
  925. },
  926. //==============属性=============
  927. //可编辑性,true>>>可编辑,false>>>不可编辑
  928. "modify":function(boolean){
  929. boolean = (typeof boolean !== "undefined") ? boolean : true;
  930. this.prop({
  931. "contentEditable":boolean,
  932. "readOnly":!boolean
  933. });
  934. return this;
  935. },
  936. //一个是特性
  937. "prop": function(prop, value) {
  938. if (arguments.length == 1) {
  939. //读取
  940. if (typeof prop == "string") {
  941. return this[0][prop];
  942. }
  943. //写,json格式
  944. else {
  945. for (var key in prop) {
  946. for( var j=0;j<this.length;j++ ){
  947. if( typeof this[j][key] !=="undefined" ){
  948. this[j][key] = prop[key];
  949. }
  950. }
  951. }
  952. }
  953. }
  954. else if (arguments.length == 2) {
  955. for (var i = 0; i < this.length; i++) {
  956. this[i][prop] = value;
  957. }
  958. }
  959. return this;
  960. },
  961. // .toggleProp('value',[1,2,3,4,5,6]) || .toggleProp('value')
  962. "toggleProp": function(prop, array) {
  963. var type = {
  964. "prop": TQuery.type(prop),
  965. "array": TQuery.type(array)
  966. };
  967. //1个值的toggle,增加/删除
  968. if (arguments.length <= 2 && (type.array !== "array" || type.array == "undefined")) {
  969. for (var i = 0; i < this.length; i++) {
  970. if (!this[i][prop]) { //不存在
  971. this[i][prop] = array;
  972. } else { //存在
  973. this[i][prop] = null;
  974. }
  975. }
  976. }
  977. //多个值得toggle
  978. else {
  979. var values = TQuery.toArray(arguments).slice(1)[0];
  980. var data = this.data('toggleProp');
  981. if (typeof data.count == "undefined") data.count = 0;
  982. if (typeof data.values == "undefined") data.values = values;
  983. this.data('toggleProp', data); //设置属性
  984. this.prop(prop, values[data.count++ % data.values.length]);
  985. }
  986. return this;
  987. },
  988. //一个是属性
  989. "attr": function(attr, value) {
  990. //2个参数,设置属性
  991. if (arguments.length == 2) {
  992. if (attr == "className") {
  993. attr = "class";
  994. }
  995. for (var k = 0; k < this.length; k++) {
  996. if (this[k][attr]) {
  997. this[k][attr] = value;
  998. } else {
  999. this[k].setAttribute(attr, value);
  1000. }
  1001. }
  1002. }
  1003. //1个参数
  1004. else if (arguments.length == 1) { //1个参数
  1005. //JSON,设置属性
  1006. if (typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]") { //如果是json,则分别设置属性
  1007. for (var i = 0; i < this.length; i++) {
  1008. for (var j in attr) {
  1009. if (j == "className" || j == "class") {
  1010. var classValue = attr[j];
  1011. this[i].setAttribute("class", classValue);
  1012. continue;
  1013. }
  1014. if (this[i][j]) { //如果属性是可以直接读取
  1015. this[i][j] = attr[j];
  1016. } else { //如果是自定义属性
  1017. this[i].setAttribute(j, attr[j]);
  1018. }
  1019. }
  1020. }
  1021. }
  1022. //读取
  1023. else {
  1024. return this[0][attr] || this[0].getAttribute(attr);
  1025. }
  1026. }
  1027. return this;
  1028. },
  1029. // .toggleProp('data-set',[1,2,3,4,5,6]) || .toggleProp('data-set')
  1030. "toggleAttr": function(attr, array) {
  1031. var type = {
  1032. "attr": TQuery.type(attr),
  1033. "array": TQuery.type(array)
  1034. };
  1035. //1个值的toggle,增加和删除
  1036. if (arguments.length <= 2 && (type.array !== "array" || type.array == "undefined")) {
  1037. for (var i = 0; i < this.length; i++) {
  1038. if (!this[i].getAttribute(attr)) { //不存在
  1039. this[i].setAttribute(attr, array);
  1040. } else { //存在
  1041. this[i].removeAttribute(attr);
  1042. }
  1043. }
  1044. }
  1045. //同时设置多个值的toggle
  1046. else {
  1047. var values = TQuery.toArray(arguments).slice(1)[0];
  1048. var data = this.data('toggleAttr'); //读取属性
  1049. if (typeof data.count == "undefined") data.count = 0;
  1050. if (typeof data.values == "undefined") data.values = values;
  1051. this.data('toggleAttr', data); //设置属性
  1052. this.attr(attr, values[data.count++ % data.values.length]);
  1053. }
  1054. return this;
  1055. },
  1056. "removeAttr": function(attr) {
  1057. for (var i = 0; i < this.length; i++) {
  1058. if (this[i][attr]) {
  1059. delete this[i][attr];
  1060. } else {
  1061. this[i].removeAttribute(attr);
  1062. }
  1063. }
  1064. return this;
  1065. },
  1066. "hasClass": function(obj, classValue) {
  1067. return obj.classList.contains(classValue);
  1068. },
  1069. "addClass": function(classValue) {
  1070. for (var i = 0; i < this.length; i++) {
  1071. this[i].classList.add(classValue);
  1072. }
  1073. return this;
  1074. },
  1075. "removeClass": function(classValue) {
  1076. for (var i = 0; i < this.length; i++) {
  1077. this[i].classList.remove(classValue);
  1078. }
  1079. return this;
  1080. },
  1081. // .toggleProp('class1','class2','class3') || .toggleProp('class1')
  1082. "toggleClass": function() {
  1083. //单个ClassName开关
  1084. if (arguments.length === 1) {
  1085. for (var i = 0; i < this.length; i++) {
  1086. this[i].classList.toggle( arguments[0] );
  1087. }
  1088. }
  1089. //多个className切换
  1090. else{
  1091. var values = TQuery.toArray(arguments);
  1092. var data = this.data('toggleAttr'); //读取属性
  1093. if (typeof data.count == "undefined") data.count = 0;
  1094. if (typeof data.values == "undefined") data.values = values;
  1095. for (var j = 0; j < arguments.length; j++) {
  1096. this.removeClass(arguments[j]);
  1097. }
  1098. this.data('toggleAttr', data); //设置属性
  1099. this.addClass(values[data.count++ % data.values.length]);
  1100. }
  1101. return this;
  1102. },
  1103. // .data('info',{})
  1104. "data": function(key,value) {
  1105. var data = this[0].dataTQuery = this[0].dataTQuery || {};
  1106. //读数据
  1107. if (arguments.length == 1 && typeof data[key] !== "undefined") {
  1108. return data[key];
  1109. }
  1110. //存数据
  1111. else {
  1112. for (var i = 0; i < this.length; i++) {
  1113. data = this[i].dataTQuery;
  1114. data[key] = value;
  1115. }
  1116. }
  1117. return data;
  1118. },
  1119. "removeData": function(key) {
  1120. var data;
  1121. for (var i = 0; i < this.length; i++) {
  1122. data = this[i].dataTQuery;
  1123. if (data[key]) {
  1124. data[key] = null;
  1125. delete data[key];
  1126. this[i].dataTQuery = data;
  1127. }
  1128. }
  1129. },
  1130. //==============样式=============
  1131. "css": function(attr, value) {
  1132. var type = /^(width|left|top|bottom|right|line-height|font-size)+/ig;
  1133. var type2 = /^(height|margin|padding)+/ig;
  1134. var type3 = /\d+(px)/ig;
  1135. var type4 = /\:/ig;
  1136. //两个参数
  1137. if (arguments.length == 2) {
  1138. //设置
  1139. value += "";
  1140. if (type.test(attr) && value.indexOf('%') < 0) {
  1141. value = parseFloat(value).toFixed(2) + 'px';
  1142. }
  1143. for (var m = 0; m < this.length; m++) {
  1144. this[m].style[attr] = value;
  1145. }
  1146. }
  1147. //一个参数
  1148. else {
  1149. //字符串格式
  1150. if (typeof attr == "string") {
  1151. //设置,background:#303030;font-size:20px;
  1152. //设置样式
  1153. if (type4.test(attr)) {
  1154. for (var x = 0; x < this.length; x++) {
  1155. this[x].style.cssText = attr;
  1156. }
  1157. }
  1158. //读取样式
  1159. else {
  1160. return this[0].currentStyle ? this[0].currentStyle[attr] : getComputedStyle(this[0])[attr];
  1161. }
  1162. }
  1163. //JSON格式
  1164. else if (typeof(attr) == "object" && Object.prototype.toString.call(attr).toLowerCase() == "[object object]" && !attr.length) {
  1165. var css = "",
  1166. key,
  1167. val;
  1168. for (var i = 0; i < this.length; i++) {
  1169. //JS写法
  1170. // for(var k in attr){
  1171. // //k == 属性名字,width,height,opacity等
  1172. // //attr[k] == 属性值,300px,#303030等
  1173. // if((type.test(k) || type2.test(k)) && attr[k].indexOf('%')<0 ){//如果没有%符号
  1174. // attr[k] = parseFloat( attr[k] ).toFixed(2) + 'px';
  1175. // }
  1176. // this[i].style[k] = attr[k];
  1177. // }
  1178. //纯CSS写法
  1179. for (key in attr) {
  1180. //k == 属性名字,width,height,opacity等
  1181. //attr[k] == 属性值,300px,#303030等
  1182. val = attr[key] + "";
  1183. if ((type.test(key) || type2.test(key)) && val.indexOf('%') < 0) { //如果是带像素的属性,并且没有%符号
  1184. val = parseFloat(val).toFixed(2) + 'px';
  1185. }
  1186. css += key + ":" + val + ";";
  1187. }
  1188. this[i].style.cssText = css;
  1189. }
  1190. }
  1191. }
  1192. return this;
  1193. },
  1194. //参数:内容,{}(properties)
  1195. "addStyle": function() {
  1196. var contents,prop,textNode,styleSheet;
  1197. for( var i=0;i<arguments.length;i++ ){
  1198. var agm = arguments[i];
  1199. //Style内容
  1200. if( TQuery.isString(agm) ){
  1201. contents = agm;
  1202. }
  1203. //Style属性
  1204. else if( TQuery.isObject(agm) ){
  1205. prop = agm;
  1206. }
  1207. }
  1208. textNode = doc.createTextNode(contents);
  1209. styleSheet = doc.createElement('style');
  1210. styleSheet.type = "text/css";
  1211. for( var attr in prop ){
  1212. if( typeof styleSheet[attr] !=="undefined" ){
  1213. styleSheet[attr] = prop[attr];
  1214. }
  1215. }
  1216. styleSheet.appendChild(textNode);
  1217. doc.head.appendChild(styleSheet);
  1218. return this;
  1219. },
  1220. //参数:内容,{}(properties)
  1221. "addScript":function(){
  1222. var contents,url,prop,position,textNode,script;
  1223. for( var i=0;i<arguments.length;i++ ){
  1224. var agm = arguments[i];
  1225. //内容
  1226. if( TQuery.isString(agm) ){
  1227. contents = agm;
  1228. }
  1229. //属性
  1230. else if( TQuery.isObject(agm) ){
  1231. prop = agm;
  1232. }
  1233. //position,true为头部,false为尾部
  1234. else if( TQuery.isBoolean(agm) ){
  1235. position = agm;
  1236. }
  1237. }
  1238. contents = contents ? contents : "";
  1239. textNode = doc.createTextNode(contents);
  1240. script = doc.createElement('script');
  1241. script.type = "text/javascript";
  1242. for( var attr in prop ){
  1243. if( !TQuery.isUndefined(script[attr]) ){
  1244. script[ attr ] = prop[attr];
  1245. }
  1246. }
  1247. script.appendChild(textNode);
  1248. //插入头部
  1249. if( position===true ){
  1250. doc.head.appendChild(script);
  1251. }
  1252. //插入尾部
  1253. else{
  1254. doc.body.appendChild(script);
  1255. }
  1256. return this;
  1257. },
  1258. //参数:{}(properties)
  1259. "addLink":function(){
  1260. var link = doc.createElement('link');
  1261. for( var attr in arguments[0] ){
  1262. link[ attr ] = arguments[0][ attr ];
  1263. }
  1264. doc.head.appendChild( link );
  1265. return this;
  1266. },
  1267. //==============动画=============
  1268. //animate({},load,speed,callBack)
  1269. "animate": function() {
  1270. var properties,load,speed,callBack,this_ = this,fps = parseInt(1000/60);
  1271. for( var o=0;o<arguments.length;o++ ){
  1272. var agm = arguments[o];
  1273. // properties
  1274. if( TQuery.isObject( agm ) ){
  1275. properties = agm;
  1276. }
  1277. // load
  1278. else if( TQuery.isFunction( agm ) && o!==arguments.length-1 ){
  1279. load = agm;
  1280. }
  1281. // speed
  1282. else if( TQuery.isNumber( agm ) || ( TQuery.isString(agm) && agm>=0) ){
  1283. speed = agm;
  1284. }
  1285. // callBack
  1286. else if( TQuery.isFunction( agm ) && o==arguments.length-1 ){
  1287. callBack = agm;
  1288. }
  1289. }
  1290. for (var i = 0; i < this.length; i++) {
  1291. var _this = this[i];
  1292. clearInterval(_this.animate);
  1293. _this.animate = setInterval(function() {
  1294. var bStop = true,
  1295. current,
  1296. target;
  1297. for (var attr in properties) {
  1298. // 1. 取得当前的值(可以是width,height,opacity等的值)
  1299. current = 0; //当前值
  1300. target = 0; //目标值
  1301. if (attr == 'opacity') {
  1302. current = Math.round(parseFloat($(_this).style(attr)) * 100);
  1303. target = parseFloat(properties[attr]) * 100;
  1304. }
  1305. else if( attr== 'scrollTop' ){
  1306. current = parseInt( this_.scrollTop() );
  1307. target = parseInt( properties[attr] );
  1308. }
  1309. else {
  1310.  
  1311. current = parseInt($(_this).style(attr));
  1312. target = parseFloat(properties[attr]);
  1313. }
  1314. // 2.计算运动速度
  1315. var speedConfig = typeof(speed) != 'undefined' ? speed : 10;
  1316. var iSpeed = (target - current) / speedConfig;
  1317. iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
  1318. // 3. 检测所有运动是否到达目标
  1319. if ((iSpeed > 0 && current <= target) || (iSpeed < 0 && current >= target)) {
  1320. bStop = false;
  1321. }
  1322. // 4. 开始运动
  1323. if (attr == "opacity") {
  1324. _this.style.filter = 'alpha(opacity=' + (current + iSpeed) + ')';
  1325. _this.style.opacity = (current + iSpeed) / 100;
  1326. }
  1327. else if( attr == 'scrollTop' ){
  1328. this_.scrollTo( target );
  1329. }
  1330. else {
  1331. _this.style[attr] = current + iSpeed + 'px';
  1332. }
  1333. load && load.call(_this);
  1334. // 4. 运动停止
  1335. if (bStop) {
  1336. clearInterval(_this.animate);
  1337. callBack && callBack.call(_this);
  1338. }
  1339. }
  1340. },fps);
  1341. }
  1342. return this;
  1343. },
  1344. //animateToggle({},{},{},{})
  1345. "animateToggle":function(){
  1346. var _arguments = arguments;
  1347. var data = this.data('animateToggle'); //获取属性
  1348. if (typeof data.count == "undefined") data.count = 0;
  1349. if (typeof data.objLength == "undefined") data.objLength = _arguments.length;
  1350. this.data('animateToggle', data); //设置属性
  1351. for (var i = 0; i < this.length; i++) {
  1352. this.animate( _arguments[data.count++ % data.objLength] );
  1353. }
  1354. return this;
  1355. },
  1356. "stop": function(delay) {
  1357. var stardelay = delay ? delay : 0;
  1358. setTimeout(function() {
  1359. clearInterval($(this)[0].animate);
  1360. }, stardelay);
  1361. return this;
  1362. },
  1363. "show": function() {
  1364. for (var i = 0; i < this.length; i++) {
  1365. this[i].style.display = 'block';
  1366. }
  1367. return this;
  1368. },
  1369. "hide": function() {
  1370. for (var i = 0; i < this.length; i++) {
  1371. this[i].style.display = 'none';
  1372. }
  1373. return this;
  1374. },
  1375. "fadeToggle": function() {
  1376. var _this = this;
  1377. this.toggle(function() {
  1378. _this.fadeOut();
  1379. }, function() {
  1380. _this.fadeIn();
  1381. });
  1382. return this;
  1383. },
  1384. "fadeIn": function(callBack) {
  1385. var _this = this;
  1386. this.css('display', 'block');
  1387. this.animate({
  1388. "opacity": 1
  1389. },function(){
  1390. if (callBack) callBack(this);
  1391. });
  1392. },
  1393. "fadeOut": function(callBack) {
  1394. var _this = this;
  1395. this.animate({
  1396. "opacity": 0
  1397. },function(){
  1398. _this.css('display', 'none');
  1399. if (callBack) callBack(this);
  1400. });
  1401. },
  1402. "fadeTo": function(target, callBack) {
  1403. var _this = this;
  1404. this.animate({
  1405. "opacity": target
  1406. }, function(){
  1407. if (target <= 0) {
  1408. _this.css('display', 'none');
  1409. } else {
  1410. _this.css('display', 'block');
  1411. }
  1412. if (callBack) callBack(this);
  1413. });
  1414. },
  1415. "scale": function(times,callBack) {
  1416. callBack = TQuery.isFunction(callBack) ? callBack : TQuery.noop;
  1417. var prop = {},width,height,arr = [],
  1418. eles = this.toArray();
  1419. for( var i=0;i<eles.length;i++ ){
  1420. var _this = $(eles[i]);
  1421. width = _this.data('size').width || _this.width();
  1422. height = _this.data('size').height || _this.height();
  1423. _this.data("size",{"width":width,"height":height});
  1424. _this.animate( {"width":width*times,"height":height*times},callBack );
  1425. }
  1426. return this;
  1427. },
  1428. //scaleToggle(2,3,1,0.5,callBack)
  1429. "scaleToggle":function(){
  1430. var agms = arguments,_arguments,callBack;
  1431. //如果最后一位是function,则最为回掉
  1432. if( TQuery.isFunction( agms[length-1] ) ) {
  1433. callBack = agms[length-1];
  1434. _arguments = TQuery.toArray(arguments).splice(0,arguments.length-1);
  1435. }else{
  1436. callBack = TQuery.noop;
  1437. _arguments = TQuery.toArray(arguments);
  1438. }
  1439. var data = this.data('scaleToggle'); //获取属性
  1440. if (typeof data.count == "undefined") data.count = 0;
  1441. if (typeof data.agms == "undefined") data.agms = _arguments.length;
  1442. this.data('scaleToggle', data); //设置属性
  1443. this.scale( _arguments[data.count++ %data.agms] ,callBack);
  1444. return this;
  1445. },
  1446. "toggle": function() {
  1447. var _arguments = arguments;
  1448. var data = this.data('toggle'); //获取属性
  1449. if (typeof data.count == "undefined") data.count = 0;
  1450. if (typeof data.fns == "undefined") data.fns = _arguments.length;
  1451. this.data('toggle', data); //设置属性
  1452. for (var i = 0; i < this.length; i++) {
  1453. _arguments[data.count++ % data.fns].call(this[i]);
  1454. }
  1455. return this;
  1456. },
  1457. "slideToggle": function() {
  1458. var _this = this;
  1459. this.toggle(function() {
  1460. $(this).slideUp();
  1461. }, function() {
  1462. $(this).slideDown();
  1463. });
  1464. return this;
  1465. },
  1466. "slideRight": function(callBack) {
  1467. var width = this.data('size').width;
  1468. this.show().animate({
  1469. "width": width
  1470. }, function(){
  1471. if (callBack) callBack.call(this);
  1472. });
  1473. return this;
  1474. },
  1475. "slideLeft": function(callBack) {
  1476. var size = this.data('size');
  1477. if (typeof size.width == "undefined") {
  1478. this.data('size').width = this.width();
  1479. }
  1480. var _this = this;
  1481. this.animate({
  1482. "width": 0
  1483. },function(){
  1484. _this.hide();
  1485. if (callBack) callBack.call(this);
  1486. });
  1487. return this;
  1488. },
  1489. "slideDown": function(callBack) {
  1490. var height = this.data('size').height;
  1491. this.show().animate({
  1492. "height": height
  1493. }, function(){
  1494. if (callBack) callBack.call(this);
  1495. });
  1496. return this;
  1497. },
  1498. "slideUp": function(callBack) {
  1499. var size = this.data('size');
  1500. if (typeof size.height == "undefined") {
  1501. this.data('size').height = this.height();
  1502. }
  1503. var _this = this;
  1504. this.animate({
  1505. "height": 0
  1506. }, function(){
  1507. _this.hide();
  1508. if (callBack) callBack.call(this);
  1509. });
  1510. return this;
  1511. },
  1512. "scrollTo": function(target, callBack) {
  1513. //传入DOM节点
  1514. if ( TQuery.isDOM(target) ) {
  1515. target = parseInt($(target).offset('top'));
  1516. }
  1517. //传入选择符,字符串
  1518. else if ( typeof target == "string" ) {
  1519. //字符串数字
  1520. if (target > 0) {
  1521. target = parseInt(target);
  1522. } else {
  1523. target = $(target).offset('top');
  1524. }
  1525. }
  1526. //传入TQuery对象
  1527. else if (typeof target.TQuery !== "undefined") {
  1528. target = target.offset('top');
  1529. }
  1530. var _this = this,
  1531. nowScrollTop, dif, speed, position,
  1532. pageHeight = $(doc).height() - $(doc).viewHeight();
  1533. target = target < 0 ? 0 : (target < pageHeight ? target : pageHeight); //超出范围
  1534. clearInterval(doc.timerScroll);
  1535. doc.timerScroll = setInterval(function() {
  1536. nowScrollTop = doc.body.scrollTop || doc.documentElement.scrollTop;
  1537. dif = Math.abs(nowScrollTop - target); //差值
  1538. speed = nowScrollTop - target < 0 ? (dif / 10) + 1 : -((dif / 10) + 1);
  1539. position = nowScrollTop + (speed);
  1540. if ((speed > 0 && position >= target) || (speed < 0 && position <= target)) {
  1541. doc.body.scrollTop = doc.documentElement.scrollTop = target;
  1542. clearInterval(doc.timerScroll);
  1543. if (callBack) callBack.call(_this[0]);
  1544. } else {
  1545. doc.body.scrollTop = doc.documentElement.scrollTop = position;
  1546. }
  1547. }, parseInt(1000 / 60));
  1548. return this;
  1549. },
  1550. "scrollToggle": function() {
  1551. var data = this.data('toggleClick'); //获取属性
  1552. if (typeof data.count == "undefined") data.count = 0;
  1553. if (typeof data.targets == "undefined") data.targets = arguments;
  1554. this.data('toggleClick', data); //设置属性
  1555. this.scrollTo(data.targets[data.count++ % arguments.length]);
  1556. return this;
  1557. },
  1558. //==============DOM=============
  1559. "replace":function(DOMNode){
  1560. //传入DOM节点
  1561. if( TQuery.isDOM( DOMNode ) ){
  1562. DOMNode = DOMNode;
  1563. }
  1564. //传入DOM字符串
  1565. else{
  1566.  
  1567. }
  1568. //替换
  1569. for( var i=0;i<this.length;i++ ){
  1570. doc.body.replaceChild(DOMNode,this[i]);//DOMNode替换掉this[i]
  1571. }
  1572. return this;
  1573. },
  1574. "replaceAll":function(){
  1575. },
  1576. "replaceWidth":function(){
  1577. },
  1578. "clone": function(deep) {
  1579. var newElements = [],
  1580. cloneNode;
  1581. for (var i = 0; i < this.length; i++) {
  1582. cloneNode = this[i].cloneNode(true); //带子节点
  1583. if (deep && deep === true) { //深度克隆,带事件
  1584.  
  1585. }
  1586. }
  1587. return this;
  1588. },
  1589. "append": function(content) {
  1590.  
  1591. },
  1592. "appendChild": function(content) {
  1593.  
  1594. },
  1595. "prepend": function(prepend) {
  1596.  
  1597. },
  1598. "prependChild": function() {
  1599.  
  1600. },
  1601. //插入到DOMNode之后
  1602. "after": function(DOMNode) {
  1603. var parent,
  1604. oFragment = doc.createDocumentFragment(); //创建文档碎片;
  1605. for (var i = 0; i < this.length; i++) {
  1606. oFragment.appendChild(this[i]);
  1607. }
  1608. parent = DOMNode.parentNode; //插入位置的父元素
  1609. if (parent.lastChild == DOMNode) { //如果最后的节点是目标节点,直接添加
  1610. parent.appendChild(oFragment);
  1611. } else { //如果不是,则插入在目标元素的下一个兄弟节点的前面,也就是目标元素的后面
  1612. parent.insertBefore(oFragment, DOMNode.nextSibling);
  1613. }
  1614. return this;
  1615. },
  1616. //插入到DOMNode之前
  1617. "before": function(DOMNode) {
  1618. var oFragment = doc.createDocumentFragment(); //创建文档碎片
  1619. for (var i = 0; i < this.length; i++) {
  1620. oFragment.appendChild(this[i]);
  1621. }
  1622. DOMNode.parentNode.insertBefore(oFragment, DOMNode);
  1623. return this;
  1624. },
  1625. "remove": function() {
  1626. for (var i = 0; i < this.length; i++) {
  1627. this[i].remove();
  1628. }
  1629. return this;
  1630. },
  1631. "empty": function() {
  1632. this.text(' ');
  1633. this.html(' ');
  1634. return this;
  1635. },
  1636. "html": function(setting) {
  1637. if (setting) {
  1638. for (var i = 0; i < this.length; i++) {
  1639. this[i].innerHTML = setting;
  1640. }
  1641. return this;
  1642. } else {
  1643. return this[0].innerHTML;
  1644. }
  1645. },
  1646. "text": function(setting) {
  1647. if (setting) {
  1648. for (var i = 0; i < this.length; i++) {
  1649. this[i].innerText = this[i].textContent = setting;
  1650. }
  1651. return this;
  1652. } else {
  1653. return this[0].innerText || this[0].textContent;
  1654. }
  1655. },
  1656. //带标签,注释
  1657. "contents":function(setting){
  1658. if (setting) {
  1659. for (var i = 0; i < this.length; i++) {
  1660. this[i].outerText = this[i].outerHTML = setting;
  1661. }
  1662. return this;
  1663. } else {
  1664. return this[0].outerText || this[0].outerHTML;
  1665. }
  1666. },
  1667. "val": function(setting) {
  1668. if (setting) {
  1669. this.prop("value",setting);
  1670. return this;
  1671. } else {
  1672. return this[0].value;
  1673. }
  1674. },
  1675. //==============其他=============
  1676. "proxy": function(fn, _this) {
  1677. fn.call(_this);
  1678. return this;
  1679. },
  1680. "delay": function(fn, time) {
  1681. var _this = this;
  1682. setTimeout(function() {
  1683. fn.call(_this);
  1684. }, time);
  1685. return this;
  1686. },
  1687. "do": function(fn) {
  1688. fn.call(this);
  1689. return this;
  1690. },
  1691. //==============转换=============
  1692. "get": function(n) {
  1693. n = n || 0;
  1694. return this[n];
  1695. },
  1696. "toArray": function() {
  1697. var temp = [];
  1698. for (var i in this) {
  1699. if (i >= 0) temp.push(this[i]);
  1700. }
  1701. return this.init.elements ? this.init.elements : temp;
  1702. },
  1703. "index": function(n) {
  1704. var _this = this,
  1705. index = 0,
  1706. brothers = _this[0].parentNode.children;
  1707. for (var i = 0; i < brothers.length; i++) { //遍历
  1708. if (brothers[i] == this[0]) { //如果匹配到
  1709. index = i;
  1710. break;
  1711. }
  1712. }
  1713. return index;
  1714. }
  1715. };
  1716. TQuery.fn.init.prototype = TQuery.fn;
  1717. //==============工具集=============
  1718. //****检查类型****
  1719. TQuery.type = function(obj) {
  1720. var string = Object.prototype.toString.call(obj);
  1721. return string.split(" ")[1].replace(/\]|\[/img, "").toString().toLowerCase();
  1722. };
  1723. TQuery.isNumber = function(obj) {
  1724. if (typeof obj == "number" && !isNaN(obj)) {
  1725. return true;
  1726. } else {
  1727. return false;
  1728. }
  1729. };
  1730. TQuery.isString = function(obj) {
  1731. if (typeof obj == "string" || obj instanceof String) {
  1732. return true;
  1733. } else {
  1734. return false;
  1735. }
  1736. };
  1737. TQuery.isFunction = function(obj) {
  1738. if (typeof obj == "function" && obj instanceof Function && Object.prototype.toString.call(obj) === '[object Function]') {
  1739. return true;
  1740. } else {
  1741. return false;
  1742. }
  1743. };
  1744. TQuery.isArray = function(obj) {
  1745. return Array.isArray ? Array.isArray(obj) : Object.prototype.toString.call(obj) === '[object Array]';
  1746. };
  1747. TQuery.isObject = function(obj) {
  1748. return Object.prototype.toString.call(obj) === '[object Object]';
  1749. };
  1750. TQuery.isDOM = function(obj) {
  1751. //IE8下,一切皆为object
  1752. return /html|document|element|object/img.test(Object.prototype.toString.call(obj).split(" ")[1]) && typeof obj.parentNode !=="undefined";
  1753. };
  1754. TQuery.isBoolean = function(obj){
  1755. return (obj===true || obj===false) ? true : Object.prototype.toString.call(obj)==='[object Boolean]';
  1756. };
  1757. TQuery.isWindow = function(obj) {
  1758. return (obj == obj.obj && typeof obj == "object") ? true : false;
  1759. };
  1760. TQuery.isUndefined = function(obj) {
  1761. return Object.prototype.toString.call(obj) === '[object Undefined]';
  1762. };
  1763. //创新一个新的TQuery副本,可以自行修改方法,属性,而不影响原有的。
  1764. TQuery.sub = function(selectors){
  1765. //构造函数
  1766. var newTQuery = function(selectors){
  1767. return newTQuery.fn.init(selectors);
  1768. };
  1769. for( var prop in $ ){
  1770. newTQuery[prop] = $[prop];
  1771. }
  1772. var prototype = {};
  1773. for( var attr in $.prototype ){
  1774. prototype[attr] = $.prototype[attr];
  1775. }
  1776. newTQuery.fn = newTQuery.prototype = prototype;
  1777. newTQuery.fn.init.prototype = newTQuery.fn;
  1778. return newTQuery;
  1779. };
  1780. //****AJAX****
  1781. TQuery.ajax = function(options) {
  1782. var oAjax,
  1783. data = options.data ? options.data : "", //头部信息。必须是数组[key,value]
  1784. context = options.context ? options.context : win, //执行上下文,this
  1785. type = options.type ? options.type : 'GET', //请求方式
  1786. async = options.async ? options.async : true; //默认异步加载
  1787. if (win.XMLHttpRequest) { //IE7+,chrome,firefox,opara,safari
  1788. oAjax = new XMLHttpRequest();
  1789. } else {
  1790. oAjax = new ActiveXObject("Microsoft.XMLHTTP"); //IE5,IE6
  1791. }
  1792.  
  1793. if (options.beforeSend) options.beforeSend.call(context); //发送之前
  1794.  
  1795. oAjax.setRequestHeader(data[0], data[1]); //设置头部信息
  1796. oAjax.open(options.type, options.url, async);
  1797. oAjax.send();
  1798. oAjax.onreadystatechange = function() {
  1799. if (oAjax.readyState == 4) {
  1800. if (options.complete) options.complete.call(context, oAjax.status); //读取完成
  1801. if (oAjax.status == 200) {
  1802. if (options.success) options.success.call(context, oAjax.responseText); //读取成功
  1803. } else {
  1804. if (options.fail) options.fail.call(context, oAjax.status); //读取失败
  1805. }
  1806. }
  1807. };
  1808. };
  1809. //****对象操作****
  1810. //去重复
  1811. TQuery.unique = function(obj) {
  1812. var V = {
  1813. "hash": {},
  1814. "arr": [],
  1815. "length": obj.length
  1816. };
  1817. for (var i = 0; i < V.length; i++) {
  1818. if (typeof V.hash[obj[i]] == "undefined") {
  1819. V.hash[obj[i]] = 1;
  1820. V.arr.push(obj[i]);
  1821. }
  1822. }
  1823. return V.arr;
  1824. };
  1825.  
  1826. //空函数,同jquery
  1827. TQuery.noop = function() {
  1828. return;
  1829. };
  1830.  
  1831. //去掉首尾空格,同jquery
  1832. TQuery.trim = function(str) {
  1833. var newStr = str.replace(/^\s*(\S*)\s*$/img, "$1");
  1834. return newStr;
  1835. };
  1836.  
  1837. //返回当前时间,同jquery
  1838. TQuery.now = function() {
  1839. return (new Date()).getTime();
  1840. };
  1841. //刷新页面,同jquery
  1842. TQuery.reload = function() {
  1843. win.location.reload(true);
  1844. };
  1845. //将类数组转成数组
  1846. TQuery.toArray = function(iArray) {
  1847. var temp = [];
  1848. for (var i = 0; i < iArray.length; i++) {
  1849. temp.push(iArray[i]);
  1850. }
  1851. return temp;
  1852. };
  1853. //单词首字母大写
  1854. TQuery.upper = function(str) {
  1855. var reg = /\b(\w)|\s(\w)/g;
  1856. str = str.toLowerCase();
  1857. return str.replace(reg, function(m) {
  1858. return m.toUpperCase();
  1859. });
  1860. };
  1861. //打乱数组,同jquery
  1862. TQuery.shuffleArray = function(arr) {
  1863. var V = {
  1864. "temp": [],
  1865. "length": arr.length
  1866. };
  1867. for (var i = 0; i < V.length; i++) {
  1868. V.temp.push(arr[i]);
  1869. }
  1870. V.temp.sort(function() {
  1871. return Math.random() - 0.5;
  1872. });
  1873. return V.temp;
  1874. };
  1875.  
  1876. //获取对象的长度
  1877. TQuery.sizeof = function(obj) {
  1878. var V = {
  1879. "temp": [],
  1880. "length": 0
  1881. };
  1882. for (var attr in obj) {
  1883. V.length++;
  1884. }
  1885. return V.length;
  1886. };
  1887. //获取浏览器信息
  1888. var ua = navigator.userAgent;
  1889. TQuery.browser = function() {
  1890. var name = null;
  1891. var vision = null;
  1892. var content = null;
  1893. //IE
  1894. if( /msie|Trident/img.test(ua) ){
  1895. name = "ie";
  1896. content = ua.match( /MSIE\s\d+\.\d/img );
  1897. if( content===null || typeof content === "undefined" ){
  1898. vision = 11;//IE11
  1899. }else{
  1900. vision = content[0].split(" ")[1];
  1901. }
  1902. }
  1903. //webkit
  1904. else if(/webkit/img.test(ua)){
  1905. name = "chrome";
  1906. content = ua.match( /Chrome\/[\d\.]+/img );
  1907. vision = content[0].split("/")[1];
  1908. }
  1909. //moz
  1910. else if(/firefox/img.test(ua)){
  1911. name = "firefox";
  1912. content = ua.match( /Firefox\/[\d\.]+/img );
  1913. vision = content[0].split("/")[1];
  1914. }
  1915. //opera
  1916. else if(/opera|Presto/img.test(ua)){
  1917. name = "opera";
  1918. content = ua.match( /Opera\/[\d\.]+/img );
  1919. vision = content[0].split("/")[1];
  1920. }
  1921. return {
  1922. "name":name,
  1923. "vision":vision
  1924. };
  1925. };
  1926. TQuery.browser.webkit = function() {
  1927. var content = ua.match( /Chrome\/[\d\.]+/img );
  1928. if( /webkit/img.test(ua)===false ){
  1929. return false;//不是webkit
  1930. }else{
  1931. if( content===null && typeof content =="undefined" ){
  1932. return true;
  1933. }
  1934. return content[0].split("/")[1];//返回版本号
  1935. }
  1936. };
  1937. TQuery.browser.msie = function() {
  1938. var content = ua.match( /MSIE\s\d+\.\d/img );
  1939. if( !/msie|Trident/img.test(ua) ){
  1940. return false;//不是IE
  1941. }else{
  1942. if( content===null || typeof content === "undefined" ){
  1943. return 11;//IE11
  1944. }else{
  1945. TQuery.browser.vision = content[0].split(" ")[1];
  1946. return content[0].split(" ")[1];//IE11以下版本号
  1947.  
  1948. }
  1949. }
  1950. };
  1951. TQuery.browser.moz = function() {
  1952. var content = ua.match( /Firefox\/[\d\.]+/img );
  1953. if( !/firefox/img.test(ua) ){
  1954. return false;//不是moz
  1955. }else{
  1956. if( content===null && typeof content =="undefined" ){
  1957. return true;
  1958. }
  1959. return content[0].split("/")[1];//返回版本号
  1960. }
  1961. };
  1962. TQuery.browser.opera = function() {
  1963. var content = ua.match( /Opera\/[\d\.]+/img );
  1964. if( !/Opera/img.test(ua) ){
  1965. return false;//不是opera
  1966. }else{
  1967. if( content===null && typeof content =="undefined" ){
  1968. return true;
  1969. }
  1970. return content[0].split("/")[1];//返回版本号
  1971. }
  1972. };
  1973. //合并对象
  1974. TQuery.merge = function() {
  1975. //合并json
  1976. if (TQuery.type.isObject(arguments[0])) {
  1977. var object = new Object({});
  1978. for (var i = 0; i < arguments.length; i++) {
  1979. for (var key in arguments[i]) {
  1980. if (typeof object[key] == "undefined") { //默认不覆盖
  1981. object[key] = arguments[i][key];
  1982. }
  1983. }
  1984. }
  1985. return object;
  1986. }
  1987. //合并数组
  1988. else if (TQuery.type.isArray(arguments[0])) {
  1989. var newArray = [];
  1990. for (var k = 0; k < arguments.length; k++) {
  1991. newArray = newArray.concat(arguments[k]);
  1992. }
  1993. return newArray;
  1994. }
  1995. };
  1996.  
  1997. //遍历对象
  1998. TQuery.map = function(obj, fn) {
  1999. var temps = [],
  2000. returnValue;
  2001. if (this.type.isArray(obj)) {
  2002.  
  2003. for (var i = 0; i < obj.length; i++) {
  2004. returnValue = fn.call(obj, obj[i], i);
  2005. if (returnValue && returnValue !== "undefined" || returnValue !== null) {
  2006. temps.push(returnValue);
  2007. }
  2008. }
  2009. } else if (this.type.isObject(obj)) {
  2010. for (var key in obj) {
  2011. returnValue = fn.call(obj, key, obj[key]);
  2012. if (returnValue && returnValue !== "undefined" || returnValue !== null) {
  2013. temps.push(returnValue);
  2014. }
  2015. }
  2016. }
  2017. return temps;
  2018. };
  2019. //转换JSON
  2020. TQuery.parseJSON = function(str, compatibility) {
  2021. return (compatibility && compatibility === true) ? (new Function("return " + str))() : JSON.parse(str);
  2022. };
  2023. //插件入口
  2024. TQuery.extend = TQuery.fn.extend = function(object) {
  2025. for( var name in object ){
  2026. if( TQuery.isUndefined(TQuery.prototype[name]) ){
  2027. TQuery.fn[name] = TQuery.prototype[name] = object[name];
  2028. }
  2029. }
  2030. return this;
  2031. };
  2032.  
  2033. return TQuery;
  2034. })();
  2035.  
  2036.  
  2037. //公共函数
  2038. function addEvent(obj, type, fn) {
  2039. var ev = null;
  2040. return obj.addEventListener ?
  2041. obj.addEventListener(type, function(e) {
  2042. ev = win.event ? win.event : (e ? e : null);
  2043. ev.target = ev.target || ev.srcElement;
  2044. if (fn.call(obj, ev) === false) {
  2045. return stop.call(ev);
  2046. }
  2047. }, false) :
  2048. obj.attachEvent('on' + type, function(e) {
  2049. ev = win.event ? win.event : (e ? e : null);
  2050. ev.target = ev.target || ev.srcElement;
  2051. ev.preventDefault = function(){
  2052. if (typeof this.preventDefault !== "undefined") this.preventDefault(); //w3c标准
  2053. if (typeof this.returnValue !== "undefined") this.returnValue = false; //阻止默认事件,针对老版本IE
  2054. };
  2055. if (fn.call(obj, ev) === false) {
  2056. return stop.call(ev);
  2057. }
  2058. });
  2059. }
  2060. //禁止冒泡和默认事件。
  2061. function stop() {
  2062. if (typeof this.stopPropagation !== "undefined") this.stopPropagation(); //阻止冒泡,w3c标准
  2063. if (typeof this.cancelBubble !== "undefined") this.cancelBubble = true; //阻止冒泡,ie,firefox
  2064. if (typeof this.preventDefault !== "undefined") this.preventDefault(); //w3c标准
  2065. if (typeof this.returnValue !== "undefined") this.returnValue = false; //阻止默认事件,针对老版本IE
  2066. return false;
  2067. }
  2068.  
  2069. win.TQuery = win.$ = $;
  2070. })(window, document, undefined);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址