123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- //#region 浏览器兼容使用
- /*
- 设置兼容性的写法 ie里面有innerText,outerHTML,而HTML5没有这些属性,为了使得TML5兼容ie特性,写了如下兼容js,HTML5也在逐步形成上诉函数。
- */
- Namespace.register("U.UF.CP"); //C是compatible兼容的简写
- //通过修改浏览器内置属性 设置兼容,添加兼容,此兼容模块兼容ie6以上,firefox,safiry,chrome
- /**
- * 滚轮事件兼容
- *
- * @param {function} fun 滚动时触发的函数
- */
- U.UF.CP.wheel = function (fun) {//onwheel支持所有html5浏览器 onmousewheel 支持所有非firefox的浏览器 DOMMouseScroll支持firefox浏览器
- this.onwheel = fun; //onwheel 事件在鼠标滚轮在元素上下滚动时触发
- }
- /**
- * 滚轮事件兼容
- */
- U.UF.CP.wheelGet = function () {
- return this.onwheel; //onwheel 事件在鼠标滚轮在元素上下滚动时触发
- }
- /**
- * 打印标签之间的纯文本信息
- *
- * @param {string} str 需要打印的元素的内容
- */
- U.UF.CP.setInnerText = function (str) {//参数str txt是内容
- this.textContent = str; //获得元素的文本内容 = str
- }
- /**
- * innerText与textContent的兼容处理
- */
- U.UF.CP.setInnerTextGet = function () {
- return this.textContent; //获得元素的文本内容
- }
- /**
- * 打印开始和结束标签之间的HTML
- *
- * @param {string} str 字符串
- */
- U.UF.CP.outerHtml = function (str) {
- var i,
- _this = U.selectEl(this), //i为变量
- _div = $$("div", { "innerHTML": str }).childNodes, //创建一个div 内容为str
- _create = $$("frag"); // createDocumentFragment:创建一个 documentFragment
- //循环插入
- for (i = 0; i < _div.length; i++) {//
- _create.appendChild(_div[i]); //在_create添加_div
- }
- _create.insertBefore(_create, this); //向列表中插入一个项目
- _this.remove(); //拷贝并删除本身
- }
- /**
- * 打印开始和结束标签之间的HTML
- *
- * 给元素原型添加一个outerHtml方法
- */
- U.UF.CP.outerHtmlGet = function () {
- var _copy = this.cloneNode(true); //克隆源元素
- var _div = $$("div", {}); //创建一个临时div,用于把克隆元素放入
- _div.appendChild(_copy); //div里面插入克隆元素
- return _div.innerHTML; /*如果不支持就使用innerhtml插入*/
- }
- /**
- * 返回了元素上的样式表
- *
- * 给元素原型添加一个currentStyle方法
- */
- U.UF.CP.getStyleGet = function () {
- return getComputedStyle(this, false); //返回的元素样式的属性
- }
- /**
- * 可以将鼠标事件锁定在指定的元素上
- *
- * 给元素原型添加一个setCaptureGet方法
- */
- U.UF.CP.setCapture = function () {
- return function () { //可以将鼠标事件锁定在指定的元素上
- window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
- }
- }
- /**
- * 释放鼠标捕获
- * 给元素原型添加一个releaseCaptureGet方法
- */
- U.UF.CP.releaseCapture = function () {//兼容火狐
- return function () {
- window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP)
- } //释放鼠标捕获
- }
- /**
- * 浏览器窗口被调整尺寸时发生
- * @param {function} fun 被调整的对象
- */
- U.UF.CP.onresize = function (fun) {
- if (this.tagName) {//存在元素的标签名
- //设置Set事件
- var _position,
- _sizeelement = this.__SizeElement__; //自定义 __SizeElement__ 元素大小
- if (!_sizeelement || U.selectEl(_sizeelement).Parent() != this && fun) {//如果不存在SizeElement或者SizeElement的父级等于他本身并且存在el 往下执行
- _position = U.UF.EL.getStyle(this, "position");
- if (_position == "" || _position == "static") { this.style.position = "relative"; }
- _sizeelement = this.__SizeElement__ = $$("object", {//创建一个元素
- "onload": function () {
- if (fun) {
- _sizeelement.contentDocument.defaultView.onresize = function () {
- fun();
- }
- // U.UF.C.apply(retElement, [[执行函数的事件]])
- //retElement 将要绑定事件与属性的对象,如没有,可以传递null或者this,此处还需要优化,很多地方都会调用此函数,会导致速度降低。
- //arr 时间和属性组成的参数数组
- }
- else {
- try {//try...catch语句将能引发错误的代码放在try块中,并且对应一个响应,然后有异常被抛出。
- delete this.__SizeElement__;
- } catch (e) { }
- }
- }, //当触发onload时执行此函数
- "type": "text/html",
- "data": "about:blank",
- "style": {
- "cssText": "display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1;visibility:hidden;margin:0;padding:0;"
- }
- }, this);
- }
- else {//如果上述条件不成立则直接往下执行
- if (fun) {
- _sizeelement.contentDocument.defaultView.onresize = function () { fun(); }
- }
- else {
- try {//try...catch语句将能引发错误的代码放在try块中,并且对应一个响应,然后有异常被抛出。
- delete this.__SizeElement__;
- } catch (e) { }
- }
- }
- }
- }
- /**
- * 浏览器窗口被调整尺寸时发生
- *
- * 给元素原型添加一个onresize方法
- */
- U.UF.CP.onresizeGet = function () {
- try { //try...catch语句将能引发错误的代码放在try块中,并且对应一个响应,然后有异常被抛出。
- return this.__SizeElement__.contentDocument.defaultView.onresize;
- }
- catch (e) {
- return null;
- }
- }
- /**
- * 代表事件的状态
- * 比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
- */
- U.UF.CP.eventGet = function () {//arguments.callee ->指向参数arguments对象的函数
- var _currentfun = arguments.callee;
- while (_currentfun.caller) { //一直往上寻找直到 寻找到顶层作用域 返回null 再往下执行
- _currentfun = _UDE.caller;
- }
- if (_currentfun.arguments[0]) { //对于火狐的兼容
- return _currentfun.arguments[0];
- }
- else {
- return null; //返回null
- }
- }
- /**
- * 捕获当前事件作用的对象的兼容处理
- */
- U.UF.CP.targetGet = function () {//支持firefox
- return event.target; //返回事件的目标节点(触发该事件的节点)
- }
- /**
- * 获得键盘的按键码的兼容处理
- */
- U.UF.CP.keyCodeGet = function () {
- return event.which; //获取按下的键盘按键Unicode值
- }
- /**
- * onreadystatechange加载设置事件的兼容
- */
- U.UF.CP.onreadystatechangeGet = function () {
- return this.onload; //当不兼容onreadystatechange的浏览器设置onreadystatechange的时候那么就相当于设置了onload
- }
- /**
- * onreadystatechange加载获取事件的兼容
- */
- U.UF.CP.onreadystatechange = function (cb) {
- this.onload = cb; //当不兼容onreadystatechange的浏览器获取onreadystatechange的时候那么就相当于获取onload
- }
- /**
- * 特定事件返回对象在指定坐标下的位置。 outside 说明制定的位置在元素之外
- */
- U.UF.CP.componentFromPoint = function () {
- return function () {
- var _position = U.UF.EL.getMousePosition();
- var _elinfo = U.UF.EL.getElementInfo(this);
- if ((_position["X"] > _elinfo["CW"] + _elinfo["TX"]) || (_position["Y"] > _elinfo["CH"] + _elinfo["TY"])) {
- return "outside";
- }
- return "";
- }
- }
- /**
- * 在浏览器初始化的时候执行这个函数,给浏览器的兼容属性添加方法
- */
- U.UF.CP.init = function () {
- //如果是html5浏览器,则执行判断内的内容,ie则不用进入下面内容。
- if (window.HTMLElement) {
- //注: HTMLElement.prototype.__defineGetter__(event, fucntion)的作用是给指定的event设置得到的回调函数,如event=onmousewheel的时候,当我们给页面上任意的元素设置事件的时候会触发指定fucntion
- //当浏览器不支持onmousewheel滚轮事件的时候,给浏览器的全局HTMLElement设置滚轮事件,让页面上所有的元素都有onmousewheel这个事件
- //由于firefox不支持onmousewheel,这里利用__defineGetter__和__defineSetter__给HTMLElement绑定onmousewheel这个事件
- /*检测浏览器是否支持onmousewheel这个方法,Safiri,火狐没有这个方法*/
- if (!("onmousewheel" in HTMLElement.prototype)) {
- //IE里面或者safiri的处理方法?
- if ("onwheel" in HTMLElement.prototype) {
- //滚轮事件兼容处理,分为get获取和set设置处理
- HTMLElement.prototype.__defineGetter__("onmousewheel", U.UF.CP.wheelGet); //元素onmousewheel的get处理
- HTMLElement.prototype.__defineSetter__("onmousewheel", U.UF.CP.wheel); //元素onmousewheel的set处理
- }
- //火狐的滚动处理
- else {
- window.addEventListener("DOMMouseScroll", function (e) {
- //监控Scroll事件
- var _fun = null,
- _currentevent = e.srcElement; //e.srcElement当前事件的源
- do {
- _fun = U.selectEl(_currentevent).attr("onmousewheel") || _currentevent.onmousewheel;
- _currentevent = U.selectEl(_currentevent).Parent();
- }
- while (!(_fun || !_currentevent)); //冒泡的顶部获取
- if (_fun) {//如果存在_fun
- if (U.UF.C.isString(_fun)) {//判断_fun 是否为字符串
- _currentevent.onmousewheel = new Function(_fun);
- }
- U.UF.EV.stopDefault(); //阻止页面固定事件
- //异步执行 解决卡死的bug
- setTimeout(function () {
- obj.call(this, e);
- }, 0);
- }
- }, false);
- }
- }
- //当浏览器不支持onreadystatechange的时候,给浏览器的全局HTMLElement设置onload,让页面上所有的元素都有onreadystatechange这个事件
- //由于chrome和friefox不支持onreadystatechange,这里利用__defineGetter__和__defineSetter__给HTMLElement绑定onreadystatechange这个事件
- // if (!("onreadystatechange" in HTMLElement.prototype)) {
- // HTMLElement.prototype.__defineGetter__("onreadystatechange", U.UF.CP.onreadystatechangeGet); //onreadystatechange加载设置事件的兼容
- // HTMLElement.prototype.__defineSetter__("onreadystatechange", U.UF.CP.onreadystatechange); //onreadystatechange加载设置事件的兼容
- // }
- //当浏览器不支持innerText的时候,给浏览器的全局HTMLElement设置textContent,让页面上所有的元素都有innerText这个事件
- //由于低版本的firefox不支持innerText,这里利用__defineGetter__和__defineSetter__给HTMLElement绑定innerText这个事件
- if (!("innerText" in HTMLElement.prototype)) {/*检测浏览器是否支持innerText这个方法*/
- HTMLElement.prototype.__defineGetter__("innerText", U.UF.CP.setInnerTextGet); //给元素原型添加一个innerText事件并且绑定U.UF.CP.setInnerText
- HTMLElement.prototype.__defineSetter__("innerText", U.UF.CP.setInnerText);
- }
- //当浏览器不支持outerHTML的时候,给浏览器的全局HTMLElement设置innerHTML,让页面上所有的元素都有outerHTML这个事件
- //由于低版本的firefox(FF7-)不支持outerHTML,这里利用__defineGetter__和__defineSetter__给HTMLElement绑定outerHTML这个事件
- if (!("outerHTML" in HTMLElement.prototype)) {/*检测浏览器是否支持outerHTML这个方法*/
- HTMLElement.prototype.__defineGetter__("outerHTML", U.UF.CP.outerHtmlGet); //给元素原型添加一个outerHtml事件并且绑定U.UF.CP.outerHtml
- HTMLElement.prototype.__defineSetter__("outerHTML", U.UF.CP.outerHtml);
- }
- //当浏览器不支持currentStyle的时候,给浏览器的全局HTMLElement设置getComputedStyle事件,让页面上所有的元素都有currentStyle这个事件
- //由于低版本的firefox不支持currentStyle,这里利用__defineGetter__给HTMLElement绑定currentStyle这个事件
- if (!("currentStyle" in HTMLElement.prototype)) {/*检测浏览器是否支持currentStyle这个方法*/
- HTMLElement.prototype.__defineGetter__("currentStyle", U.UF.CP.getStyleGet); //给元素原型添加一个currentStyle事件并且绑定U.UF.CP.getStyle
- }
- //当浏览器不支持setCapture的时候,给浏览器的全局HTMLElement设置captureEvents事件,让页面上所有的元素都有setCapture这个事件
- //由于firefox不支持setCapture,这里利用__defineGetter__给HTMLElement绑定setCapture这个事件
- if (!("setCapture" in HTMLElement.prototype)) {
- HTMLElement.prototype.__defineGetter__("setCapture", U.UF.CP.setCapture); //给元素原型添加一个setCapture事件并且绑定U.UF.CP.setCapture
- }
- //当浏览器不支持releaseCapture的时候,给浏览器的全局HTMLElement设置releaseEvents事件,让页面上所有的元素都有releaseCapture这个事件
- //由于firefox不支持releaseCapture,这里利用__defineGetter__给HTMLElement绑定releaseCapture这个事件
- if (!("releaseCapture" in HTMLElement.prototype)) {
- HTMLElement.prototype.__defineGetter__("releaseCapture", U.UF.CP.releaseCapture); //给元素原型添加一个releaseCapture事件并且绑定U.UF.CP.releaseCapture
- }
- //当浏览器不支持onresize的时候,给浏览器的全局HTMLElement设置focus,让页面上所有的元素都有onresize这个事件
- //由于低版本的firefox不支持onresize,这里利用__defineGetter__和__defineSetter__给HTMLElement绑定onresize这个事件
- if (!("onresize" in HTMLElement.prototype) || !(U.UF.CI.getBrowser().browser == "msie")) { /*检测浏览器是否支持onfocus事件*/
- HTMLElement.prototype.__defineGetter__("onresize", U.UF.CP.onresizeGet); //给元素原型添加一个onresize事件并且绑定U.UF.CP.onresize
- HTMLElement.prototype.__defineSetter__("onresize", U.UF.CP.onresize);
- }
- /*检测浏览器是否支持componentFromPoint事件*/
- if (!("componentFromPoint" in HTMLElement.prototype)) {
- HTMLElement.prototype.__defineGetter__("componentFromPoint", U.UF.CP.componentFromPoint); //当获取元素的componentFromPoint时候出发该函数
- }
- //当浏览器不支持event的时候,给浏览器的全局HTMLElement设置releaseEvents,让页面上所有的元素都有event这个事件
- //由于firefox不支持event,这里利用__defineGetter__给HTMLElement绑定event这个事件
- if (!("event" in window.constructor.prototype)) { /*检测浏览器是否支持event事件*/
- window.constructor.prototype.__defineGetter__("event", U.UF.CP.eventGet); //给元素原型添加一个event事件并且绑定U.UF.CP.event
- }
- //给window.event添加兼容属性方法
- if (window.Event.prototype) {
- //当浏览器不支持srcElement的时候,给浏览器的全局HTMLElement设置target事件,让页面上所有的元素都有srcElement这个事件
- //由于firefox不支持srcElement,这里利用__defineGetter__给HTMLElement绑定srcElement这个事件
- if (!("srcElement" in window.Event.prototype)) {/*检测浏览器是否支持srcElement事件*/
- window.Event.__defineGetter__("target", U.UF.CP.targetGet); //给元素原型添加一个target事件并且绑定U.UF.CP.target
- }
- //当浏览器不支持keyCode的时候,给浏览器的全局HTMLElement设置which事件,让页面上所有的元素都有keyCode这个事件
- //由于firefox不支持keyCode,这里利用__defineGetter__给HTMLElement绑定keyCode这个事件
- if (!("keyCode" in window.Event.prototype) && window.Event.__defineGetter__) {
- window.Event.__defineGetter__("keyCode", U.UF.CP.keyCodeGet); //给元素原型添加一个keyCode事件并且绑定U.UF.CP.keyCheck
- }
- }
- }
- }
- //#region querySelector 兼容处理
- U.UF.C.style; //防止选择器创建多个样式style
- /**
- * querySelectorAll 兼容
- *
- * @param {string} 搜索的内容
- * @param {element} 搜索的元素区域
- */
- document.querySelectorAll = document.querySelectorAll || function (str, el) {
- var _addstyle = U.UF.C.style, //判断是否已经添加了上style识别样式
- _returnarr = [], //创建一个空的数组
- _firstchild = document.documentElement.firstChild, //document.documentElement的第一个子元素
- _arr = (el || document).all, //搜索区域
- i = _arr.length; //_arr的长度
- //添加的style link
- try {
- _addstyle.styleSheet.cssText = str + "{q:1}";
- }
- catch (e) {
- U.UF.C.style = $$("style", {//U.UF.C.style:防止选择器创建多个样式style
- "type": "text/css",
- "styleSheet": {
- "cssText": str + "{q:1}"
- }
- }, _firstchild);
- }
- //全局筛选
- while (i--) {
- if (_arr[i].currentStyle.q) {
- _returnarr.unshift(_arr[i]);
- }
- }
- return _returnarr;
- };
- /**
- * querySelector 兼容
- *
- * @param {number} 搜索的内容
- */
- document.querySelector = document.querySelector || function (num) {//返回文档中匹配指定 CSS 选择器的一个元素
- var _num = document.querySelectorAll(num);
- if (_num.length) {//如果_num存在
- return _num[0]; //返回_num[0]
- }
- else {//不存在
- return null; //返回null
- }
- };
- /**
- * 选择元素区域 自定义搜索元素选择函数
- *
- * @param {string} 搜索的内容
- * @param {object} 搜索的元素
- */
- U.UF.CP.selectorElement = function (str, el) {
- var _ishasid = (el.id === "" && el != document), //判断是否支持选择器
- _query = $$("div").querySelectorAll;
- if (_ishasid) {//如果支持
- el.id = el.uniqueID; //uniqueID : 绝对唯一地标识一个 HTML 元素
- }
- try { //尝试执行代码块
- if (_query) {//如果浏览器支持querySelectorAll ,那么直接使用浏览器的
- return (el || document).querySelectorAll((el.id ? ("#" + el.id + " ") : " ") + str, el);
- }
- //否则调用上面自定义的方法
- else {
- return document.querySelectorAll((el.id ? ("#" + el.id + " ") : " ") + str, el);
- }
- }
- catch (e) {//捕获错误的代码块
- return null;
- }
- finally {//无论 try / catch 结果如何都会执行的代码块
- if (_ishasid) {
- el.id = "";
- }
- }
- }
- //#endregion
- //#region 手机兼容处理,只要引用了uform框架,会自动使手机在滑动的过程中不会触发点击事件
- /**
- * 手机点击处理
- */
- U.UF.CP.touch = function () {
- //这里有个bug如果多次引用uform的时候这里的事件会注册监视多次
- if (U.UF.C.touchstart) {
- U.UF.EV.delElementEvent("touchstart", document, U.UF.C.touchstart, true);
- }
- //监视touchstart,注册函数事件 U.UF.EV.addElementEvent(事件名称,添加事件的元素,事件触发后调用的函数,指定事件是否在捕获或冒泡阶段执行)
- U.UF.EV.addElementEvent("touchstart", document, U.UF.C.touchstart, true);
- }
- /**
- * touchstart处理
- */
- U.UF.C.touchstart = function () {
- var i,
- _eventsrc = event.srcElement; //时间触发的元素
- //默认触发的时候是没有移动的状态
- U.UF.C.ismove = null;
- //停止事件分发
- U.UF.EV.stopBubble();
- //移除start事件事件取消,防止下面直接出发touch事件的时候给重复监听
- U.UF.EV.delElementEvent("touchstart", document, U.UF.C.touchstart, true);
- //直接执行touchstart事件
- U.UF.EV.simulatePhoneTouch(_eventsrc, "touchstart");
- //取消后重新添加事件进去
- U.UF.EV.addElementEvent("touchstart", document, U.UF.C.touchstart, true);
- //监视在鼠标移动的处理
- U.UF.EV.addElementEvent("touchmove", document, U.UF.C.touchmove);
- //end事件等待
- U.UF.EV.addElementEvent("touchend", document, U.UF.C.touchend, true);
- }
- /**
- * touchmove处理
- */
- U.UF.C.touchmove = function () { //移动监视
- U.UF.C.ismove = true; //设置鼠标在移动
- U.UF.EV.delElementEvent("touchmove", document, U.UF.C.touchmove); //移除鼠标移动事件
- U.UF.EV.simulatePhoneTouch(event.srcElement, "touchmove"); //执行事件touch移动的处理
- U.UF.EV.stopBubble(); //停止冒泡处理
- }
- /**
- * touchend处理
- */
- U.UF.C.touchend = function () {
- U.UF.EV.delElementEvent("touchend", document, U.UF.C.touchend, true); //touchend抓取成功后的处理
- U.UF.EV.stopBubble(); //移除事件
- //如果用户的touchstart后没有处理touchmove事件,那么允许用户出发touchend事件
- if (!U.UF.C.ismove) {
- U.UF.EV.simulatePhoneTouch(event.srcElement, "touchend"); //触发touchend事件
- }
- }
- //#endregion
|