Event.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. //处理事件:
  2. Namespace.register("U.UF.EV");
  3. /**
  4. * 统一绑定系统处理函数
  5. * @param fun {function} 执行函数
  6. * 绑定的所有函数可通过 U.UF.EV.systemEventBind,Array 查看
  7. */
  8. U.UF.EV.systemEventBind = function (fun) {
  9. U.selectEl('body').bind(fun);
  10. U.UF.EV.systemEventBind, Array.push(fun);
  11. }
  12. /*
  13. *var a = document.body.aaaa ;
  14. *document.body.aaaa = "aaa"
  15. * U.UF.EV.boundProperties(HTMLElement.prototype,"aaaa",
  16. * function(){
  17. * return this.innerHTML;
  18. * },
  19. * function(value){
  20. * this.innerHTML = value;
  21. * })
  22. *
  23. ** 作用:属性添加处理 这里处理例如chrome取消innerText等。
  24. 当修改html元素的属性时,可以让他触发一个函数.可以用于双向绑定。当某个变量的值变了,触发回调函数,修改其中的样式。
  25. ** @param {object} obj 需要添加属性的对象
  26. ** @param {string} str 类型的名字
  27. ** @param {function} fun1 get函数处理
  28. ** @param {function} fun2 set函数处理
  29. */
  30. U.UF.EV.boundProperties = function (obj, str, fun1, fun2) {
  31. //判断obj是否已经定义了新的属性
  32. if (obj.__defineGetter__) {//兼容处理
  33. obj.__defineGetter__ = (obj, fun1); //__definGetter__用于Getter方法追加定义,函数第一个是getter的名称,第二个参数为getter的函数
  34. obj.__defineSetter__ = (obj, fun2); //__definSetter__用于Setter方法追加定义,函数第一个是setter的名称,第二个参数为setter的函数
  35. } else if (Object.defineProperty) {//ie8以上的兼容处理
  36. //obj.defineProperty是直接在某一个对象上定义一个属性,这个属性可以用来添加或修改现有的属性,obj修改对象,key属性名,
  37. //{//descriptor}对象用来声明新属性的特性
  38. //configurable:默认false,表示此属性是否可用delete删除。
  39. //enumerable: 默认为false,表示此属性是否可被for...in、Object.keys遍历到
  40. //value:默认undefined,此属性的值,可以是任何JavaScript类型
  41. //writable:默认为false,此属性是否可被改写
  42. //get:默认undefined,指定一个函数,当属性被调用时,此函数也被调用,默认为返回属性值
  43. //set:默认undefined,指定一个函数,当属性被赋值时,此函数也被调用,仅接受一个参数,参数为属性被赋的值
  44. Object.defineProperty(obj, str, { configurable: true, get: fun1, set: fun2 });
  45. } else {//ie6-1e7
  46. obj[str] = fun1; //如果自动获取了属性的对象和类型的名字,则自动调用get函数处理
  47. obj[str].toString = fun1; //获取的属性对象的类型名进行字符串转换
  48. //attachEvent事件监听处理,第一个参数是事件类型,第二个参数是处理函数
  49. obj.attachEvent("onpropertychange", function () {
  50. if (event.propertyName == obj) {//判断事件对象的属性名是否为需要添加的属性的对象
  51. //argument用于提供调用当前正在执行的函数,caller返回调用这个函数体的函数,则返回U.UF.EV.boundProperties()
  52. //再添加一个caller,则返回调用了U.UF.EV.boundProperties()这个函数体的函数
  53. var _str = arguments.caller.caller;
  54. obj.detachEvent("onpropertychange", _str); //detachEvent事件监听处理,删除事件,与attachEvent相配对。第一个参数是事件参数,第二个是处理函数
  55. fun2(obj[str]); //调用set方法去设置新的属性
  56. obj[str] = fun1; //如果自动获取了属性的对象和类型的名字,则自动调用get函数处理
  57. obj[str].toString = fun2; //获取的属性对象的类型名进行字符串的转换,并且调用set函数处理
  58. obj.attachEvent("onpropertychange", _str); //重新建立事件监听处理,重新设置新的属性
  59. }
  60. });
  61. }
  62. }
  63. /*
  64. ** 作用:对象添加原型方法,添加新的数据类型,或者在已有数据类型上扩充功能,例如:String,Number,Array,Object,Guid等
  65. ** @param {object} obj 数据类型 例如string、number等
  66. ** @param {string、object} str 当这个参数为string的时候下述函数有效
  67. ** @param {function} fun 原型对应的函数
  68. */
  69. U.UF.EV.addPrototype = function (obj, str, fun) {
  70. //判断传值的参数类型是否是string
  71. if (typeof str == "string") {//如果传值的数据类型是string,则执行以下函数
  72. obj.prototype[str] = fun; //prototype是添加属性和方法,向obj对象中添加一个属性
  73. } else {
  74. var i; //用于循环
  75. for (i in str) {//循环所有包含了str的个数
  76. obj.prototype[i] = str[i]; //单个添加包含了str这个类型的属性
  77. }
  78. }
  79. }
  80. /**
  81. *当页面滚动到底端的时候执行
  82. *
  83. * @param {function} fun 滚动到底端需要加载的函数
  84. * @param {objcet} obj 需要滚动的元素
  85. */
  86. U.UF.EV.scrollLoad = function (obj, fun) {
  87. obj.onscroll = function () {//滚动滚轮触发
  88. clearTimeout(U.UF.EV.scrollLoad.time);
  89. if (U.UF.EV.scrollLoad.scrollTop(obj) + U.UF.EV.scrollLoad.windowHeight(obj) >= (U.UF.EV.scrollLoad.documentHeight(obj))) {
  90. U.UF.EV.scrollLoad.time = setTimeout(fun, 100);
  91. }
  92. }
  93. }
  94. /**
  95. * 获取页面顶部被卷起来的高度
  96. */
  97. U.UF.EV.scrollLoad.scrollTop = function (obj) {
  98. return Math.max(//取最大值
  99. //chrome
  100. U.selectEl(obj)[0].scrollTop,
  101. //firefox/IE
  102. document.documentElement.scrollTop
  103. );
  104. }
  105. /**
  106. * 获取页面文档的总高度
  107. */
  108. U.UF.EV.scrollLoad.documentHeight = function (obj) {
  109. //现代浏览器(IE9+和其他浏览器)和IE8的document.body.scrollHeight和document.documentElement.scrollHeight都可以
  110. return Math.max($(obj)[0].scrollHeight, document.documentElement.scrollHeight); //取最大值
  111. }
  112. /**
  113. * 获取页面浏览器视口的高度
  114. */
  115. U.UF.EV.scrollLoad.windowHeight = function (obj) {
  116. return U.selectEl(obj)[0].clientHeight;
  117. }
  118. /**
  119. * 页面活动监视,当用户离开页面休息时,停止页面活动(计时器)
  120. *
  121. * @param {function} 页面聚焦回调函数
  122. * @param {function} 页面离开的回调
  123. * @return {string} 获取key对应的值
  124. */
  125. U.UF.EV.IsActivity = function (fun1, fun2) {
  126. var _timer;
  127. //页面聚焦的处理
  128. if (fun1) {
  129. //判断鼠标是否在body页面上
  130. U.selectEl(document.body).mouseenter(function () {
  131. //由于函数会多次触发,所以做一个计时器进行处理,让函数只触发一次
  132. if (_timer) {
  133. window.clearTimeout(_timer);
  134. }
  135. _timer = window.setTimeout(fun1);
  136. });
  137. //页面聚焦同时为活动页面
  138. U.UF.EV.addElementEvent("focusin", document, function () {
  139. //由于函数会多次触发,所以做一个计时器进行处理,让函数只触发一次
  140. if (_timer) {
  141. window.clearTimeout(_timer);
  142. }
  143. _timer = window.setTimeout(fun1);
  144. });
  145. }
  146. //页面失焦的处理
  147. if (fun2) {
  148. //页面不活动的时候处理
  149. U.UF.EV.addElementEvent("focusout", document, function () {
  150. var _clientx = event.clientX; //页面x坐标
  151. var _clienty = event.clientY; //获取event对象的y坐标
  152. //判断用户的鼠标是否在制定的范围内,如果在说明活动了当前页面
  153. if ((!(U.UF.CI.getBrowser().browser == "msie") ||
  154. (_clientx < 0 || _clientx > US.width || _clienty < 0 || _clienty > US.height))) { //判断鼠标不在页面中
  155. fun2();
  156. }
  157. });
  158. }
  159. }
  160. /**
  161. * 滚动条滚动到制定的位置
  162. *
  163. * @param {string} 指定scrollTop的数值
  164. * @param {function} 需要调整滚动条位置的对象
  165. * @param {function} 加载成功回调
  166. * @return {element} 图片元素
  167. */
  168. U.UF.EV.scrollToPosition = function (str, fun1, fun2) {
  169. var _isnumber = U.UF.C.isNumber(str); //判断str是否是数字true 或者 false
  170. //动画移动具体的位置
  171. if (_isnumber && fun2) {
  172. U.selectEl(fun1).animate({ "scrollTop": str }, fun2);
  173. }
  174. else {
  175. //设置fun1的内容垂直滚动的像素数
  176. if (typeof str == "number") {
  177. fun1.scrollTop = str;
  178. }
  179. else {
  180. str.scrollIntoView(); //sty.scrollIntoView 让当前的元素滚动到浏览器窗口的可视区域内
  181. }
  182. } //直接移动过
  183. }
  184. /**
  185. * 自动触发HTMLElement事件 Mouse事件,模拟鼠标点击事件
  186. *
  187. * @param {element} 触发的元素
  188. * @param {string} 事件类型
  189. * @return {object} resize对象
  190. */
  191. U.UF.EV.simulateMouseClicks = function (el, str) {
  192. //ie直接执行事件的处理
  193. if (el.fireEvent) {
  194. return el.fireEvent("on" + str, window.event);
  195. }
  196. //ie以外的浏览器处理事件执行
  197. else if (document.createEvent) {
  198. var _mousevent = document.createEvent("MouseEvents"), //创建事件事件
  199. _event = window.event; //事件处理
  200. //初始化事件
  201. if (_event) { //原本已经具有事件event来源的情况下处理
  202. //执行mouse事件处理
  203. _mousevent.initMouseEvent(
  204. str,
  205. true,
  206. true,
  207. window,
  208. _event.detail,
  209. _event.screenX,
  210. _event.screenY,
  211. _event.clientX,
  212. _event.clientY,
  213. _event.ctrlKey,
  214. _event.altKey,
  215. _event.shiftKey,
  216. _event.metaKey,
  217. _event.button,
  218. _event.relatedTarget
  219. );
  220. }
  221. else {
  222. //没有事件来源event的处理
  223. _mousevent.initMouseEvent(
  224. str,
  225. true,
  226. true,
  227. document.defaultView,
  228. 0,
  229. 0,
  230. 0,
  231. 0,
  232. 0,
  233. false,
  234. false,
  235. false,
  236. false,
  237. 0,
  238. el
  239. )
  240. }
  241. //分发事件
  242. return el.dispatchEvent(_mousevent);
  243. }
  244. }
  245. /**
  246. * 自动触发HTMLElement Touch事件
  247. *
  248. * @param {element} 触发的元素
  249. * @param {string} 事件类型
  250. * @param {object} resize对象
  251. */
  252. U.UF.EV.simulatePhoneTouch = function (el, str, obj) {
  253. if (el.fireEvent) { //ie事件触发处理
  254. el.fireEvent("on" + TF);
  255. }
  256. else if (document.createEvent) { //h5事件处理
  257. var i,
  258. _arr,
  259. _event = obj || window.event;
  260. //创建一个touch时间的处理
  261. if (TouchEvent) { //有TouchEvent的创建方式
  262. var _touchevent = new TouchEvent(str, _event);
  263. }
  264. //其他的创建方式
  265. else {
  266. var _touchevent = document.createEvent("TouchEvent");
  267. }
  268. //执行事件的方法
  269. if (_touchevent.initTouchEvent) { //有initTouchEvent执行方法的处理
  270. var _str = "initTouchEvent";
  271. }
  272. else { //initEvent执行方法的处理
  273. var _str = "initEvent";
  274. }
  275. //chrome
  276. _arr = [
  277. //chrome
  278. [
  279. event.touches, //当前屏幕上所有触摸点的列表
  280. event.targetTouches, //当前对象上所有触摸点的列表
  281. event.changedTouches, //涉及当前(引发)事件的触摸点的列表
  282. str,
  283. event.view,
  284. event.screenX,
  285. event.screenY,
  286. event.clientX,
  287. event.clientY,
  288. event.ctrlKey,
  289. event.alrKey,
  290. event.shiftKey,
  291. event.metaKey
  292. ],
  293. //safari
  294. [
  295. str,
  296. true,
  297. event.cancelable,
  298. event.view,
  299. event.detail,
  300. event.screenX,
  301. event.screenY,
  302. event.clientX,
  303. event.clientY,
  304. event.ctrlKey,
  305. event.altKey,
  306. event.shiftKey,
  307. event.metaKey,
  308. event.touches,
  309. event.targetTouches,
  310. event.changedTouches,
  311. event.scale,
  312. event.rotation
  313. ],
  314. //firefox
  315. [
  316. str,
  317. true,
  318. event.cancelable,
  319. event.view,
  320. event.detail,
  321. event.ctrlKey,
  322. event.altKey,
  323. event.shiftKey,
  324. event.metaKey,
  325. event.touches,
  326. event.targetTouches,
  327. event.changedTouches
  328. ],
  329. ];
  330. //由于浏览器对直接执行事件的兼容有三种方案,这里是对三种方案的循环添加
  331. for (i = 0; i < _arr.length; i++) {
  332. //直接执行
  333. try {
  334. _touchevent[_str].apply(_touchevent, _arr[i]);
  335. }
  336. catch (e) {
  337. }
  338. if (_touchevent.type == str) {
  339. break;
  340. }
  341. }
  342. }
  343. return el.dispatchEvent(_touchevent); //分发事件
  344. }
  345. /**
  346. * 注册函数事件 Internet Explorer 8 及更早IE版本不支持 addEventListener() 方法,,Opera 7.0 及 Opera 更早版本也不支持。 但是,对于这些不支持该函数的浏览器,你可以使用 attachEvent() 方法来添加事件句柄
  347. *
  348. * @param {string} 事件名称
  349. * @param {element} 添加事件的元素
  350. * @param {function} 事件触发后调用的函数
  351. * @param {string} 指定事件是否在捕获或冒泡阶段执行
  352. */
  353. U.UF.EV.addElementEvent = function (str, el, fun, isbubble) {
  354. if (el.addEventListener) { //非IE使用
  355. el.addEventListener(str, fun, isbubble || false);
  356. }
  357. else if (el.attachEvent) { //IE
  358. el.attachEvent("on" + str, fun);
  359. }
  360. else {//html5处理
  361. el["on" + str] = function () {
  362. el["on" + str]();
  363. fun();
  364. }
  365. }
  366. }
  367. /**
  368. * 取消函数事件
  369. *
  370. * @param {string} 事件名称
  371. * @param {element} 添加事件的元素
  372. * @param {function} 事件触发后调用的函数
  373. * @param {string} 指定事件是否在捕获或冒泡阶段执行
  374. */
  375. U.UF.EV.delElementEvent = function (str, el, fun, isbubble) {
  376. if (el.removeEventListener) { //非IE使用
  377. el.removeEventListener(str, fun, isbubble || false);
  378. }
  379. else if (el.detachEvent) {//IE使用
  380. el.detachEvent("on" + str, fun);
  381. }
  382. else { el["on" + str] = null; } //非元素
  383. }
  384. /**
  385. * 获取事件源 跨iframe搜索,由于我们在点击iframe的时候,不知道事件是从哪个iframe或者来的,所以这里循环iframe找事件的来源
  386. *
  387. */
  388. U.UF.EV.getEventSource = function () {
  389. var i, //循环初始化
  390. _data, //用于储存数据
  391. _frames = window.frames; //获取window.frames
  392. var _event = window.event; //获取window.event
  393. if (!_event) {
  394. for (i = 0; i < _frames.length; i++) { //循环所有的iframe 获取事件源
  395. _data = _frames[i]; //得到iframe处理
  396. //由于非自己站点的iframe会存在跨域处理
  397. try {
  398. _event = _data.event; //获取事件
  399. //如果找到了事件那么就直接break
  400. if (_event) {
  401. break;
  402. }
  403. }
  404. catch (e) { continue; };
  405. }
  406. }
  407. //返回事件源
  408. return _event;
  409. }
  410. /**
  411. * 阻止冒泡
  412. */
  413. U.UF.EV.stopBubble = function () {
  414. var _event = U.UF.EV.getEventSource(); //获取Event
  415. //调用的时候判断是否有时间的来源
  416. if (_event) {
  417. //非ie系列浏览器支持处理事件冒泡的方案
  418. if (_event.stopPropagation) {
  419. _event.stopPropagation();
  420. }
  421. //ie系列浏览器支持去小事件冒泡处理
  422. else {
  423. _event.cancelBubble = true;
  424. }
  425. }
  426. }
  427. /**
  428. * 执行mouseout mouseover不冒泡情况,以前是多次触发,现在做到移动进去触发一次,移动出来触发一次
  429. * mouseout||mouseover 冒泡解决
  430. *
  431. * @param {element} 需要执行的元素
  432. * @return {function} 回调函数
  433. */
  434. U.UF.EV.stopBubbleMouseOutOrOver = function (el, cb) {
  435. if (event && "mouseover,mouseout".indexOf(event.type) > -1) { //判断事件源
  436. var _target = (event.type == "mouseover" ? event.fromElement : event.toElement) || event.relatedTarget, //事件对象
  437. _bool = U.UF.EL.isChild(el, _target); //判断_target是否是el的子孙节点
  438. if (!_bool && U.UF.C.isFunction(cb)) { //判断是否在该元素下
  439. cb();
  440. }
  441. return _bool;
  442. }
  443. }
  444. /**
  445. * 阻止浏览器的默认行为,例如右键菜单,左键选择
  446. *
  447. */
  448. U.UF.EV.stopDefault = function (e) {
  449. var _event = e || window.event; //获取window.event对象
  450. if (_event) {
  451. //IE中阻止函数器默认动作的方式
  452. if (document.all) {
  453. _event.returnValue = false;
  454. }
  455. //阻止默认浏览器动作(W3C)
  456. else {
  457. _event.preventDefault();
  458. }
  459. return false;
  460. }
  461. }
  462. /**
  463. 事件委托,本地程序调用客户端程序时会用到。
  464. * 随机产生一个函数 调用后销毁 类似委托
  465. 解决跨域问题,以及ajax多个请求,多份实例的问题。
  466. *
  467. * @param {function} 回调函数
  468. * @param {array} 回调参数 params1
  469. * @param {boolean} 执行成功后是否移除委托
  470. * @param {string} id
  471. * @return {object} 委托对象
  472. */
  473. U.UF.EV.eventDelegation = function (cb, params, isremove, id) {
  474. if (isremove == null) {
  475. isremove = true;
  476. }
  477. var _id = id || "a" + Guid.newGuid(); //唯一识别id
  478. window[_id] = function () {
  479. try {
  480. //判断是否有回调函数
  481. if (U.UF.C.isFunction(cb)) {
  482. cb.apply(null, arguments);
  483. }
  484. //是否移除事件委托对象
  485. if (this.isremove) {
  486. window[_id] = null; //设置对象移除
  487. delete window[_id]; //清理对象
  488. }
  489. }
  490. catch (e) { }
  491. }
  492. return _id;
  493. }
  494. /**
  495. * 页面消息传递,解决跨域问题。
  496. * @param {function} 跨域iframe传参的回调函数
  497. * @param {boolean} 是否是发送者,在iframe里面的是接收者,iframe外的是发送者
  498. * @param {string} 与iframe通讯的唯一识别id,如果是接收多个不同回调的消息,那么需要传参
  499. * @param {string} 需要跨域的iframe的id
  500. *
  501. */
  502. U.UF.EV.message = function (fun, issender, id, iframeid) {
  503. this.fun = fun; //监视消息的函数
  504. this.id = id || Guid.guidNoDash(); //消息通讯的唯一id
  505. this.sender = issender; //是否是发送者
  506. this.iframeid = iframeid; //消息发送到哪个iframe里 接受者没有
  507. this.iframe = null; //发送给那个iframe的元素
  508. this.url = ""; //iframe的链接
  509. U.UF.EV.message.callbacks[this.id] = this; //所有消息记录
  510. //设置onmessage事件获取浏览器之间的传参
  511. if ("onmessage" in window) {
  512. U.UF.EV.addElementEvent("message", window, U.UF.EV.message.getDataAndCallBack);
  513. }
  514. //如果是iframe内的发送的处理方式
  515. if (this.sender) {
  516. this.iframe = U.selectEl("#" + this.iframeid)[0]; //获取iframe
  517. this.url = $$("a", { "src": this.iframe.src }).host; //iframe的链接,用于ie跨域传参的时候使用
  518. }
  519. //如果是接收者也就是iframe里面的对象的处理方法
  520. else if (!("onmessage" in window)) {
  521. U.UF.EV.message.getDataAndCallBack();
  522. }
  523. }
  524. //这里包含了所有的需要回调的回调函数
  525. U.UF.EV.message.callbacks = [];
  526. /**
  527. * 得到数据的方法
  528. * @message {object} 发送者发送的信息
  529. */
  530. U.UF.EV.message.getDataAndCallBack = function (message) {
  531. var _data;
  532. //高版本的浏览器是通过onmessage获取的
  533. if ("onmessage" in window) {
  534. _data = message.data; //获取数据
  535. }
  536. //低版本的浏览器获取值得处理
  537. else {
  538. _data = window.name; //获取数据
  539. }
  540. _data = _data.parseJSON(); //传入的数据转化成json处理
  541. var _fun = U.UF.EV.message.callbacks[_data[1]]; //得到回调函数的类
  542. //如果类存在,那么调用类的message数据回调方法
  543. if (_fun) {
  544. _fun.message(_data[0], _data[1], _data[2]);
  545. }
  546. }
  547. //message类的原型方法
  548. U.UF.EV.message.prototype = {
  549. /**
  550. * 接收消息
  551. * @data {object} 接收的信息
  552. * @cookie {object} 接受者 cookie
  553. */
  554. message: function (data, id, cookie) {
  555. //如果页面监视的是回调函数的处理
  556. if (U.UF.C.isFunction(this.fun)) {
  557. this.fun(data, id, cookie);
  558. }
  559. //如果是接收者,同时又是在低版本的浏览器下使用的iframe,那么清空iframe的使用
  560. if (this.sender && !("onmessage" in window)) {
  561. var _doc = this.obj.contentWindow.document; //重新创建一个document
  562. _doc.open(); //打开
  563. _doc.write(""); //整个页面写入空
  564. _doc.close(); //关闭
  565. }
  566. },
  567. /**
  568. * 提交消息
  569. * @data {object} 发送者发送的信息
  570. * @id {object} 发送者的id
  571. * @cookie {object} 发送者 cookie
  572. */
  573. post: function (data, id, cookie) {
  574. var _win,
  575. _message = U.UF.C.jsonToStr([data, id || this.id, cookie]); //拼接传参的参数,由于发送者和接受者都公用这个 所以当接受者给发送者发回消息的时候第二个参数是发送者的id。
  576. //高版本的iframe发送消息
  577. if ("onmessage" in window) {
  578. if (this.sender) {
  579. //得到iframe传参的域
  580. try {
  581. _win = this.iframe.contentWindow || this.iframe; //如果是发送者,那么获取contentWindow
  582. }
  583. catch (e) {
  584. _win = this.iframe; //如果是接收者发送回给发送者,那么iframe是parent就不需要获取contentWindow了
  585. }
  586. }
  587. else {
  588. _win = parent;
  589. }
  590. _win.postMessage(_message, "*"); //发送消息
  591. }
  592. //低版本的浏览器发送iframe消息
  593. else {
  594. //如果是发送者发消息的处理
  595. if (this.sender) {
  596. //等待iframe重新加载后处理跨域
  597. U.UF.DL.iframeLoad(this.iframe, U.UF.C.apply(this, function () {
  598. this.iframe.contentWindow.name = _message; //设置window.name传参值
  599. this.iframe.contentWindow.location.href = this.url; //刷新到跨域的页面
  600. //重新设置onlaod事件处理等待页面响应
  601. U.UF.DL.iframeLoad(this.iframe, U.UF.C.apply(this, function () {
  602. U.UF.EV.message.getDataAndCallBack(); //调用iframe返回数据后重新load "about:blank"链接后的回调
  603. }));
  604. }));
  605. this.iframe.src = "about:blank"; //重新加载iframe
  606. }
  607. //接受者的处理
  608. else {
  609. window.name = _message; //设置window.name传参值
  610. window.src = "about:blank"; //
  611. }
  612. }
  613. }
  614. }
  615. /**
  616. * 打印处理函数
  617. *
  618. */
  619. U.UF.EV.print = function (el) {
  620. // var AllContent = window.document.body.innerHTML; //首先获得元素的html内容,保存当前页面的HTML
  621. // var newstr = el.innerHTML; //得到需要打印的元素HTML
  622. // document.body.innerHTML = newstr; //把当前页面替换为打印内容HTML
  623. // window.print(); //执行打印操作
  624. // document.body.innerHTML = AllContent; //还原当前页面
  625. var iframe = document.createElement('iframe');
  626. var doc = null;
  627. iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
  628. document.body.appendChild(iframe);
  629. doc = iframe.contentWindow.document;
  630. doc.write('<div>' + el.innerHTML + '</div>');
  631. doc.close();
  632. iframe.contentWindow.focus();
  633. iframe.contentWindow.print();
  634. if (navigator.userAgent.indexOf("MSIE") > 0) {
  635. document.body.removeChild(iframe);
  636. }
  637. }