utils.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. module("core.utils");
  2. test('cssRule', function () {
  3. var utils = te.obj[0];
  4. utils.cssRule('test1', '.test{width:300px;}');
  5. var style = utils.cssRule('test1');
  6. ok(/^\.test/.test(style));
  7. utils.cssRule('test1', '');
  8. style = utils.cssRule('test1');
  9. ok(!style);
  10. var div = te.dom[2];
  11. div.innerHTML = '<span class="test">sdfsdf</span>';
  12. utils.cssRule('style_test', '.test{display:block}');
  13. utils.cssRule('style_test', '.test{font-size:48px}');
  14. var block = UE.dom.domUtils.getComputedStyle(div.firstChild, 'display');
  15. equals(block, 'inline');
  16. //删除样式
  17. utils.cssRule('style_test', '');
  18. equals(UE.dom.domUtils.getComputedStyle(div.firstChild, 'font-size'), '16px');
  19. });
  20. test("makeInstance", function () {
  21. var utils = te.obj[0];
  22. var obj = {
  23. s: 1,
  24. str: "makeInstance"
  25. }, str = "makeInstance";
  26. var ins = utils.makeInstance(obj);
  27. var ins1 = utils.makeInstance(str);
  28. equals(ins.s, 1, "ins.s");
  29. equals(ins.str, "makeInstance", "ins.str");
  30. same(ins1, {}, "null");
  31. same(utils.makeInstance(null), {}, "null");
  32. });
  33. test("isArray--普通对象", function () {
  34. var utils = te.obj[0];
  35. var arr = [ '1', '2' ], ob = {}, str = "array", fun = function () {
  36. };
  37. var div = te.dom[0];
  38. ok(utils.isArray(arr), 'arr is a array');
  39. ok(!utils.isArray(ob), 'ob is not a array');
  40. ok(!utils.isArray(str), 'str is not a array');
  41. ok(!utils.isArray(fun), 'fun is not a array');
  42. ok(!utils.isArray(null), 'null is not a array');
  43. ok(!utils.isArray(div), 'dom element is not a array');
  44. });
  45. test("isArray--类数组对象", function () {
  46. var utils = te.obj[0];
  47. var arrayLike = {
  48. 0: '0',
  49. 1: '1',
  50. 2: '2',
  51. length: 3
  52. };
  53. var div = te.dom[0];
  54. div.innerHTML = '<span><label></label></span>xxxxx<p></p>';
  55. ok(!utils.isArray(arrayLike), '类数组对象不是数组');
  56. ok(!utils.isArray(div.childNodes), 'nodeList 不是数组');
  57. });
  58. test("inherits", function () {
  59. var utils = te.obj[0];
  60. var superClass = function () {
  61. };
  62. var subClass = function () {
  63. };
  64. expect(4);
  65. var index = 0;
  66. superClass.prototype.name = "superClass";
  67. superClass.prototype.methodSuper = function () {
  68. ok(true, "method in superClass is called");
  69. };
  70. superClass.prototype.method = function () {
  71. ok(false, "I am in superClass");
  72. };
  73. subClass.prototype.name = "subClass";
  74. subClass.prototype.methodSub = function () {
  75. ok(true, "method in subClass is called");
  76. };
  77. subClass.prototype.method = function () {
  78. ok(true, "I am in subClass");
  79. };
  80. utils.inherits(subClass, superClass);
  81. var sub = new subClass();
  82. /*子类自己的名字,父类的被覆盖*/
  83. equal(sub.name, "subClass", "the name of subClass");
  84. /*从父类中继承的方法*/
  85. sub.methodSuper();
  86. /*子类自己的方法*/
  87. sub.methodSub();
  88. /*覆盖父类中的method方法*/
  89. sub.method();
  90. });
  91. test("bind", function () {
  92. var utils = te.obj[0];
  93. var first_object = { num: 4 };
  94. var second_object = { num: 2 };
  95. function multiply(mult) {
  96. return this.num * mult;
  97. }
  98. var first_multiply = utils.bind(multiply, first_object);
  99. equal(first_multiply(5), 20, "first_object"); // returns 4 * 5
  100. var second_multiply = utils.bind(multiply, second_object);
  101. equal(second_multiply(5), 10, "second_object");
  102. });
  103. test('defer--一个defer', function () {
  104. var utils = te.obj[0];
  105. var delay = 100;
  106. expect(1);
  107. stop();
  108. /*defer返回一个闭包,算defer不准,chrome下会 相差300多ms,没办法判断延时是否准确*/
  109. var stime = +new Date();
  110. utils.defer(function () {
  111. ok(1, '检查回调函数是否触发');
  112. start();
  113. }, delay)();
  114. });
  115. test('defer--多个defer', function () {
  116. var utils = te.obj[0];
  117. var delay = 40;
  118. stop();
  119. expect(2);
  120. utils.defer(function () {
  121. ok(true, '第一个触发');
  122. }, delay)();
  123. utils.defer(function () {
  124. ok(true, '第二个触发');
  125. start();
  126. }, delay)();
  127. });
  128. /*若互斥,则前一个注册的setTimeout事件被删除*/
  129. test('defer--考虑互斥', function () {
  130. var utils = te.obj[0];
  131. var delay = 20;
  132. stop();
  133. expect(1);
  134. /*exclusion=true*/
  135. var defer = utils.defer(function () {
  136. ok(1, '检查回调函数是否在规定的时间内触发');
  137. }, delay, true);
  138. defer();
  139. //第一个defer会被删掉
  140. defer();
  141. setTimeout(function () {
  142. start();
  143. }, 100);
  144. });
  145. test("extend--true", function () {
  146. var utils = te.obj[0];
  147. var obj1 = {a: 3, b: "str", fun: function () {
  148. ok(true, "fun");
  149. }, n: null};
  150. var obj2 = {a: 2, c: 1};
  151. utils.extend(obj2, obj1, true);
  152. equal(obj2.a, 2, "obj2 a");
  153. equal(obj2.b, "str", "obj2 str");
  154. equal(obj2.c, 1, "obj2 c");
  155. obj2.fun();
  156. equal(obj2.n, null, "obj2 n null");
  157. });
  158. test("extend--false", function () {
  159. var utils = te.obj[0];
  160. var obj1 = {a: 3, b: "str", fun: function () {
  161. ok(true, "fun");
  162. }, n: null};
  163. var obj2 = {a: 2, c: 1};
  164. utils.extend(obj2, obj1, false);
  165. equal(obj2.a, 3, "obj2 a");
  166. equal(obj2.b, "str", "obj2 str");
  167. equal(obj2.c, 1, "obj2 c");
  168. obj2.fun();
  169. equal(obj2.n, null, "obj2 n null");
  170. });
  171. test('indexOf', function () {
  172. var utils = te.obj[0];
  173. var s = [ 1, 2, 3, 4, 5 ];
  174. equals(utils.indexOf(s, 3), 2);
  175. equals(utils.indexOf(s, 6), -1);
  176. equals(utils.indexOf(s, 5), 4);
  177. equals(utils.indexOf(s, 3, 3), -1);
  178. equals(utils.indexOf(s, 3, 3), -1);
  179. });
  180. test('removeItem&&itemexist', function () {
  181. var utils = te.obj[0];
  182. var s = [ 1, 2, 3, 4, 5 , 4, 3];
  183. equal(s[5], 4, "before remove 4");
  184. utils.removeItem(s, 4);
  185. equal(s.length, 5, "4 be removed");
  186. equal(s[4], 3, "4 be removed");
  187. });
  188. test('removeItem&&itemnotexist', function () {
  189. var utils = te.obj[0];
  190. var s = [ 1, 2, 3, 4, 5 , 4];
  191. utils.removeItem(s, 6);
  192. equal(s.length, 6, "itemnotexist");
  193. });
  194. test("trim", function () {
  195. var utils = te.obj[0];
  196. var s = ' sss ';
  197. equals(utils.trim(s), 'sss', "两端有空格");
  198. s = "&nbsp;xxx ";
  199. equal(utils.trim(s), '&nbsp;xxx', "包含&nbsp;");//&nbsp;不能被捕获
  200. s = "string";
  201. equal(utils.trim(s), "string", '没有&nbsp;和空格');
  202. });
  203. test('listToMap', function () {
  204. var utils = te.obj[0];
  205. var s = "listToMap";
  206. var re = utils.listToMap(s);
  207. equal(re.listToMap, 1, "listToMap");
  208. });
  209. test('list,To,Map', function () {
  210. var utils = te.obj[0];
  211. var s = "list,To,Map";
  212. var re = utils.listToMap(s);
  213. equal(re.list, 1, "list");
  214. equal(re.To, 1, "list");
  215. equal(re.Map, 1, "Map");
  216. });
  217. test('listToMap ""', function () {
  218. var utils = te.obj[0];
  219. var s = "";
  220. var re = utils.listToMap(s);
  221. equal(re.toString(), {}, "{}");
  222. });
  223. test('listToMap null', function () {
  224. var utils = te.obj[0];
  225. var s = null;
  226. var re = utils.listToMap(s);
  227. equal(re.toString(), {}, "{}");
  228. });
  229. test('listToMap numstring', function () {
  230. var utils = te.obj[0];
  231. var s = "123333";
  232. var re = utils.listToMap(s);
  233. equal(re[123333], 1, "num");
  234. });
  235. test('unhtml 字符转义', function () {
  236. var utils = te.obj[0];
  237. var str = '<p>"as&cd"</p>';
  238. var str_html = utils.unhtml(str);
  239. equal(str_html, '&lt;p&gt;&quot;as&amp;cd&quot;&lt;/p&gt;', '转义字符成功');
  240. str = 'border:&lt;script&gt;alert(&quot;&quot;)&lt;/script&gt;"'
  241. equal(utils.unhtml(str), 'border:&lt;script&gt;alert(&quot;&quot;)&lt;/script&gt;&quot;', '转义字符成功');
  242. str = "'";
  243. equal(utils.unhtml('比如&#23567;这个汉字的unicode编码'), '比如&#23567;这个汉字的unicode编码');
  244. equal(utils.unhtml('比如&#<23567;这个汉字的unicode编码<>'), '比如&amp;#&lt;23567;这个汉字的unicode编码&lt;&gt;')
  245. });
  246. test('html 反转义', function () {
  247. var utils = te.obj[0];
  248. var str_html = '&lt;p&gt;&quot;as&amp;cd&quot;&lt;/p&gt;';
  249. var str = utils.html(str_html);
  250. equal(str, '<p>"as&cd"</p>', '反转义成功');
  251. });
  252. test('unhtml null ""', function () {
  253. var utils = te.obj[0];
  254. var s = null;
  255. equal(utils.unhtml(s), "", "unhtml null");
  256. s = '';
  257. equal(utils.unhtml(s), "", "unhtml null");
  258. });
  259. test('cssStyleToDomStyle', function () {
  260. var utils = te.obj[0];
  261. equal(utils.cssStyleToDomStyle("cssFloat").toLowerCase(), "cssfloat", "cssFloat");
  262. if (ua.browser.ie && ua.browser.ie < 9) {
  263. equal(utils.cssStyleToDomStyle("float").toLowerCase(), "stylefloat", "float");
  264. } else {
  265. equal(utils.cssStyleToDomStyle("float").toLowerCase(), "cssfloat", "float");
  266. }
  267. equal(utils.cssStyleToDomStyle("styleFloat").toLowerCase(), "stylefloat", "styleFloat");
  268. });
  269. //zhuwenxuan add
  270. test("isEmptyObject", function () {
  271. var utils = te.obj[0];
  272. var obj = {
  273. n: 1
  274. };
  275. equal(false, utils.isEmptyObject(obj));
  276. equal(true, utils.isEmptyObject([]));
  277. equal(true, utils.isEmptyObject(""));
  278. });
  279. //dong
  280. test("fixColor", function () {
  281. var utils = te.obj[0];
  282. equal('#953734', utils.fixColor("color", 'rgb(149, 55, 52)'), 'fixColor');
  283. });
  284. test("sort", function () {
  285. var utils = te.obj[0];
  286. same(["a", "df", "sdf", "asdf"], utils.sort(['a', 'asdf', 'df', 'sdf'], function (a, b) {
  287. if (a.length > b.length)
  288. return 1;
  289. else return 0;
  290. }), 'sort');
  291. });
  292. test("domReady", function () {
  293. var utils = te.obj[0];
  294. expect(1);
  295. utils.domReady(function () {
  296. ok(1, 'domReady')
  297. });
  298. });
  299. test('4个padding属性', function () {
  300. // var css = 'padding-bottom:0px; margin:0px 0px 20px; padding-left:0px; padding-right:4px; padding-top:0px';
  301. /*上下相同,左右相同*/
  302. var css = 'padding-bottom:3px;padding-left:2px;padding-right:2px;padding-top:3px';
  303. var result = UE.utils.optCss(css);
  304. equal(result, 'padding:3px 2px;', '上下相同,左右相同');
  305. /*上下不同,左右相同*/
  306. css = 'padding-bottom:2px;padding-left:2px;padding-right:2px;padding-top:3px';
  307. result = UE.utils.optCss(css);
  308. equal(result, 'padding:3px 2px 2px;', '上下不同,左右相同');
  309. /*只有2个属性*/
  310. css = 'padding-bottom:2px;padding-left:2px;';
  311. result = UE.utils.optCss(css);
  312. equal(result, 'padding-bottom:2px;padding-left:2px;', '2个属性就不合');
  313. });
  314. test('4个margin属性', function () {
  315. /*上下相同,左右相同*/
  316. var css = 'margin-bottom:3px;margin-left:2px;margin-right:2px;margin-top:3px';
  317. var result = UE.utils.optCss(css);
  318. equal(result, 'margin:3px 2px;', '上下相同,左右相同');
  319. css = 'margin-bottom:2px;margin-left:2px;margin-right:2px;margin-top:2px';
  320. result = UE.utils.optCss(css);
  321. equal(result, 'margin:2px;', '全相同');
  322. /*上下不同,左右相同*/
  323. css = 'margin-bottom:2px;margin-left:2px;margin-right:2px;margin-top:3px';
  324. result = UE.utils.optCss(css);
  325. equal(result, 'margin:3px 2px 2px;', '上下不同,左右相同');
  326. /*只有1个属性*/
  327. css = 'margin-top:2px;';
  328. result = UE.utils.optCss(css);
  329. equal(result, 'margin-top:2px;', '1个属性就不合');
  330. });
  331. test('合并;的问题', function () {
  332. equal(UE.utils.optCss('font-size:12px;&quot;;&lt;dssdfs&gt;;;'), 'font-size:12px;&quot;;&lt;dssdfs&gt;;', '');
  333. });
  334. //test( '合并border相关属性', function () {
  335. //// var css = 'border-width:thin medium;' + //只有border-width
  336. //// 'border-top-color:red;border-bottom-color:red;border-left-color:red;' + //3个分属性相同,不应当合
  337. //// 'border-right-style:hidden;border-bottom-style:hidden;border-left-style:hidden;border-top-style:hidden'; //4个分属性相同,应当合
  338. //// var result = UE.utils.optCss( css );
  339. //// equal( result, 'border-width:thin medium;border-top-color:red;border-bottom-color:red;border-left-color:red;border-style:hidden' );
  340. //// /*border属性, border不能分别定义4个边框的宽度,颜色和样式,
  341. //// 只能统一定义,不可以对四个边设置不同的值,和margin与padding是不同的(后两者可以分别定义四个边的值).*/
  342. //// css = 'border-top:2px hidden red;border-right:2px hidden red';
  343. //// result = UE.utils.optCss(css );
  344. //// equal(result,css,'border2个属性不合');
  345. //// /*4个属性都相同,合*/
  346. //// css = 'border-top:2px hidden red;border-right:2px hidden red;border-left:2px hidden red;border-bottom:2px hidden red';
  347. //// result = UE.utils.optCss(css );
  348. //// equal(result,'border:2px hidden red;','4个属性都相同,合');
  349. //// /*4个属性不同,不合*/
  350. //// css = 'border-top:2px hidden red;border-right:3px hidden red;border-left:2px hidden red;border-bottom:2px hidden red';
  351. //// result = UE.utils.optCss(css );
  352. //// equal(result,'border:2px hidden red;','4个属性不同,不合');
  353. // var css = 'border-image:initial;'
  354. //} ) ;
  355. //
  356. test('margin,border,padding属性混杂', function () {
  357. var css = 'margin-bottom:3px;margin-left:2px;margin-right:2px;margin-top:3px;padding:4px;border-image:initial;border-top-color:red;';
  358. var result = UE.utils.optCss(css);
  359. equal(result, 'padding:4px;border-top-color:red;margin:3px 2px;', 'margin,border,padding属性混同');
  360. });
  361. test('each 遍历方法', function () {
  362. var div = te.dom[0];
  363. div.innerHTML = '<span></span><span></span><span id="a"></span><span></span>';
  364. UE.utils.each(div.getElementsByTagName('span'), function (node, i) {
  365. equal(node.tagName, 'SPAN', '遍历nodelist');
  366. });
  367. var count = 0;
  368. UE.utils.each(div.getElementsByTagName('span'), function (node, i) {
  369. count++;
  370. if (node.id == 'a')
  371. return false
  372. });
  373. equal(count, 3);
  374. UE.utils.each(['a', 'b'], function (v, i) {
  375. equal(v, ['a', 'b'][i], '遍历数组');
  376. });
  377. UE.utils.each({a: 1, b: 2}, function (v, k) {
  378. equal(v, {a: 1, b: 2}[k], '遍历对象');
  379. });
  380. });
  381. test('clone 转换', function () {
  382. var obj = {a: 1};
  383. var obj1 = UE.utils.clone({a: 1});
  384. obj.a = 2;
  385. equal(obj1.a, 1);
  386. obj = {
  387. a: {
  388. b: 1
  389. },
  390. c: [1, 2]
  391. }
  392. obj1 = UE.utils.clone(obj);
  393. obj.a.b = 2;
  394. equal(obj1.a.b, 1);
  395. obj.c[1] = 3;
  396. equal(obj1.c[1], 2);
  397. });
  398. test('transUnitToPx 转换', function () {
  399. equal(UE.utils.transUnitToPx('20pt'), '27px');
  400. equal(UE.utils.transUnitToPx('0pt'), '0');
  401. });
  402. test('RegExp', function () {
  403. var reg = new RegExp(".*");
  404. equal(ok(utils.isRegExp(reg), 'reg is a RegExp'));
  405. });
  406. test('isDate', function () {
  407. var date = new Date();
  408. equal(ok(utils.isDate(date), 'date is a Date'));
  409. });
  410. test('isCrossDomainUrl', function () {
  411. var l = location;
  412. ok(!utils.isCrossDomainUrl(location.href), 'location.href 不跨域');
  413. if (l.port == '') {
  414. ok(!utils.isCrossDomainUrl(l.protocol + '//' + l.hostname + ':80/ueditor/'), '本地没端口,80端口不跨域');
  415. }
  416. if (l.port == '80') {
  417. ok(!utils.isCrossDomainUrl(l.protocol + '//' + l.hostname + '/ueditor/'), '本地没80端口,无端口不跨域');
  418. }
  419. if (l.protocol == 'http:') {
  420. ok(utils.isCrossDomainUrl('https://' + l.host + '/ueditor/'), '本地http协议,https协议跨域');
  421. } else {
  422. ok(utils.isCrossDomainUrl('http://' + l.host + '/ueditor/'), '本地不是http协议,http协议跨域');
  423. }
  424. ok(utils.isCrossDomainUrl(l.protocol + '//www.baidu.com' + ':' + l.port), '域名不一致跨域');
  425. });
  426. test('formatUrl', function () {
  427. var url1 = 'http://localhost/a.html?&key1=value1&&key2=value2&&&&&&&&&key3=value3&#hash';
  428. var url2 = 'http://localhost/a.html?&key1=value1&&key2=value2&&&&&&&&&key3=value3&';
  429. equal(utils.formatUrl(url1), 'http://localhost/a.html?key1=value1&key2=value2&key3=value3#hash', '格式化url');
  430. equal(utils.formatUrl(url2), 'http://localhost/a.html?key1=value1&key2=value2&key3=value3', '格式化url');
  431. });
  432. test('str2json', function () {
  433. same(utils.str2json('{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}'),
  434. {"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}},
  435. '字符串转json对象');
  436. });
  437. test('json2str', function () {
  438. equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}),
  439. '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}',
  440. 'json对象转字符串');
  441. });
  442. test('json2str 不使用原生方法', function () {
  443. stop();
  444. var j = window.JSON;
  445. var flag = 0;
  446. ua.readFile("../../../_test/coverage/core/utils.js", function (s) {
  447. if(s===null)flag = 1;
  448. window.JSON = null;
  449. eval(s);
  450. equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}),
  451. '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}',
  452. 'json对象转字符串');
  453. window.JSON = j;
  454. });
  455. if(flag){
  456. ua.readFile("../../../_src/core/utils.js", function (s) {
  457. window.JSON = null;
  458. eval(s);
  459. equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}),
  460. '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}',
  461. 'json对象转字符串');
  462. window.JSON = j;
  463. });
  464. }
  465. setTimeout(function(){start();},50);
  466. });
  467. test('clearEmptyAttrs', function () {
  468. var utils = te.obj[0];
  469. var ob = utils.clearEmptyAttrs({a: 1, b: ''});
  470. ok(!ob.hasOwnProperty('b'), 'clearEmptyAttrs');
  471. });
  472. test('serializeParam', function () {
  473. equal(utils.serializeParam({
  474. key1: 'value1',
  475. key2: 'value2',
  476. key3: 33,
  477. key4: '44',
  478. key5: true,
  479. key6: null,
  480. key7: undefined,
  481. key8: [11, 22, '33', 'aa', true, null]
  482. }),
  483. 'key1=value1&' +
  484. 'key2=value2&' +
  485. 'key3=33&' +
  486. 'key4=44&' +
  487. 'key5=true&' +
  488. 'key7=undefined&' +
  489. 'key8[]=11&' +
  490. 'key8[]=22&' +
  491. 'key8[]=33&' +
  492. 'key8[]=aa&' +
  493. 'key8[]=true&' +
  494. 'key8[]=null',
  495. '序列化obj对象为GET请求字符串');
  496. });