- 浏览: 152683 次
- 性别:
- 来自: 上海
最新评论
-
qinzjy:
写的非常详细,很好!我想请教另外一个问题,就是没法打开自己发布 ...
菜鸟玩GAE(Google App Engine)完全指南 -
ego008:
bluky999 写道原来是你啊 呵,saepy的博主不擅长 ...
SAE 支持Java了 -
bluky999:
原来是你啊 呵,saepy的博主
SAE 支持Java了 -
hwujo:
悲剧啊,
我的。。。
使用micolog的博客全挂了 -
wtstengshen:
楼主我目前遇到一个问题就是安装google app engin ...
新GAE应用收集
//set cookie function setcookie(name,value){ var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); } function getcookie(name){ var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)")); if(arr != null){ return unescape(arr[2]); }else{ return ""; } } function delcookie(name){ var exp = new Date(); exp.setTime(exp.getTime() - 1); var cval=getCookie(name); if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString(); } //delcookie("GD-cms"); if (document.cookie != "") { setcookie("GD-cms", "gae-django-cms"); } alert(getcookie("GD-cms"));
原文
评论
5 楼
rjzou2006
2009-11-26
cuixiping 写道
价值不高。
第一,不○○,现在大家好像比较重视这个。
第二,功能也不全面,cookie的有效时间应该做为参数传入,而不是写死在函数里面。
理论上至少应该是这样:
Cookie={
set:function(params){...}
,get:function(params){...}
,remove:function(params){...}
}
但我不喜欢又是get又是set的,我喜欢合二为一,就像jquery那样,取值和设置值是同一个方法,只是参数不同。只传一个key就是取值,同时传了value就是设置。
所以要这样:
Cookie={
item:function(params){...}
}
用的时候可以这样:
Cookie.item(key, value); //设置cookie
Cookie.item({key:key, value:value, expires:expires, domain:domain}); //设置cookie
var value = Cookie.item(key); //获取cookie
Cookie.item(key, null); //清除cookie
第一,不○○,现在大家好像比较重视这个。
第二,功能也不全面,cookie的有效时间应该做为参数传入,而不是写死在函数里面。
理论上至少应该是这样:
Cookie={
set:function(params){...}
,get:function(params){...}
,remove:function(params){...}
}
但我不喜欢又是get又是set的,我喜欢合二为一,就像jquery那样,取值和设置值是同一个方法,只是参数不同。只传一个key就是取值,同时传了value就是设置。
所以要这样:
Cookie={
item:function(params){...}
}
用的时候可以这样:
Cookie.item(key, value); //设置cookie
Cookie.item({key:key, value:value, expires:expires, domain:domain}); //设置cookie
var value = Cookie.item(key); //获取cookie
Cookie.item(key, null); //清除cookie
params 传个对象来好点.
4 楼
vb2005xu
2009-11-24
我自己写的,为什么你这种帖子也能上首页,我自己写的框架就被评为新手帖??
cookie.js
core.js如下:
ui.js
ui.widget.js
cookie.js
xu.pkg('xu.cookie'); (function() { var Cookie = function(){ this.get = function (name) { var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if (arr != null) { return decodeURIComponent(arr[2]); } return null; }; this.set = function (sName,sValue,objHours,sPath,sDomain,bSecure){ var sCookie = sName + "=" + encodeURIComponent(sValue); if (objHours) { var date = new Date(); var ms = objHours * 3600 * 1000; date.setTime(date.getTime() + ms); sCookie += ";expires=" + date.toGMTString(); } if (sPath) { sCookie += ";path=" + sPath; } if (sDomain) { sCookie += ";domain=" + sDomain; } if (bSecure) { sCookie += ";secure"; } document.cookie=sCookie; }; this.clear = function (sName,sPath,sDomain,bSecure){ this.set(sName,'',0,sPath,sDomain,bSecure); } ; }; xu.apply(xu.cookie,new Cookie()); })(); /* xu.cookie 功能测试*/ //xu.cookie.set('ua',xu.browser.ua); //xu.cookie.set('chinese-char',"中文测试" + window.document.title); //trace_obj("xu.cookie.get('ua')",xu.cookie.get('ua')); //trace_obj("xu.cookie.get('chinese-char')",xu.cookie.get('chinese-char')); // //xu.cookie.clear('ua'); //xu.cookie.clear('chinese-char');
core.js如下:
/* * 编码规范: 包名小写,类名大写,函数名小写,对象定义名称大写 * HTML标签小写,CSS名称小写,元素ID,name小写 * * 对js内置关键字做变量,在前面加上_标识符 */ /** * 开发笔记: * * -- IE6 hacker: * * 1. 元素ID不能以下划线开头 * 2. COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR * 的很多属性只读,例如innerHTML,appendChild等等 * 3. p 不能包容div、h1除了<br />等块级元素。否则报错 * 4. a 不能包容div ;dt不能包容div,h */ var start_loaded_time = (new Date()).getTime(); // for old browsers window.undefined = window.undefined; // ------------------- 常用方法区域 //Camelcase 驼峰式风格 -- 第二个单词的首字母大写 String.prototype.getCamelcaseStyle = function(){ return this.replace(/-([a-z])/g, function(_0,_1){return _1.toUpperCase();}); }; /** * 创建元素 * @param {} tagName * @return {} */ function $C(tagName) { return document.createElement(tagName); } /** * 返回带有指定标签名的对象的集合,注意集合不是数组 * @param {} name * @return {} */ function $TagN(name) { return document.getElementsByTagName(name); } /** * 元素name属性名取 元素 * @param {} name * @return {} */ function $N(name) { return document.getElementsByName(name); } /** * 元素ID属性名取 元素 * @param {} name * @return {} */ function $ID(name) { return document.getElementById(name); } /** * 取指定节点下 具有CSS类名的元素数组 * 摘自: js捷径教程 * * @param {} node * @param {} classname * @return {} */ function $clsN(node,classname) { var a = [] ; var re = new RegExp('(^| )' + classname + '( |$)'); var els = node.getElementsByTagName('*'); for(var i = 0 , j = els.length;i<j;i++){ //排除 空白节点 if (els[i] && (els[i].nodeType ==1 )&& (re.test(els[i].className) ) ) a.push(els[i]); } return a ; } var __proto = "prototype"; var __class = "__class__"; var __pkg = "__pkg__"; var __superclass = "__superclass__"; //顶级命名空间 -- xu if (typeof xu == 'undefined') { xu = { version : '0.1' , is_debug: true && 1 // 开启调试功能的变量 }; } /** * 将config对象中的属性全部复制给obj对象 * 摘自: ext3.0 * * @param {} obj * @param {} config * @param {} defaults * @return {} */ xu.apply = function(obj, config, defaults){ if(defaults){ xu.apply(obj, defaults); } if(obj && config && typeof config == 'object'){ for(var p in config){ obj[p] = config[p]; } } return obj; }; xu.apply(xu,{ /** * 系统变量申明區域 * @type {} */ G_Var: { 'PKGS': [] , 'APP_INF': {} , 'OBJECTS': {} , 'CLASS_PATH': {} } , /** * 定义包 * @param {} ns * @return {} */ pkg: function(ns) { if (!ns || !ns.length) { return null; } var levels = ns.split("."); var nsobj = xu; for (var i = (levels[0] == "xu") ? 1 : 0; i < levels.length; ++i) { nsobj[levels[i]] = nsobj[levels[i]] || {}; nsobj = nsobj[levels[i]]; } xu['G_Var']['PKGS'].push(ns); return nsobj; } , dump_pkg_list: function(){alert('依赖debug.js')} , uid: function(){alert('依赖crypto.js')} , /** * 仅当obj对象不存在config对象中的属性时才将此属性复制给obj对象 * @param {} obj * @param {} config * @return {} */ applyIf : function(obj, config){ if(obj){ for(var p in config){ if(xu.verify._null(obj[p])){ obj[p] = config[p]; } } } return obj; } , getAppInf: function(option){ if (option && !xu.verify._null(option) && xu['G_Var']['APP_INF'].hasOwnProperty(option)){ return xu['G_Var']['APP_INF'][option]; } return null ; } , setAppInf: function(option,value){ if (option && !xu.verify._null(option)) xu['G_Var']['APP_INF'][option] = value ; } , map: function(obj,func){ if(obj){ obj = func(obj); } return obj; } }); //xu.verify -- 变量类型验证 xu.pkg('xu.verify'); xu.apply(xu.verify,{ _undef: function (v){return typeof v == "undefined";} , _null: function (v){return v === null;} , _arr: function (v){ // return xu.verify._obj(v) && v.constructor == Array; return Object[__proto].toString.call(v) === '[object Array]'; } , _str: function (v){return typeof v == "string";} , _bool: function (v){return typeof v == "boolean";} , _num: function (v){return typeof v == "number";} , _int: function (v){return /^[01233456789]{1,}$/.test(v);} , _func: function (v){return v && typeof v == "function";} , _obj: function (v){return v && typeof v == "object";} }); xu.pkg('xu._class') ; (function() { xu.setAppInf('SYS_CLASS_NS','xu._class.sys'); xu.setAppInf('USER_CLASS_NS','xu._class.user'); xu.apply(xu._class,{ create: function(pkg_n,class_n,p_class,class_impl,isOverride){ if (xu.verify._null(class_n) || class_n === ""){ return null ;} try { var $t_class = eval(pkg_n + "." +class_n); if (this.exist($t_class)) { trace( "isExist: " + class_n + " Override:" + isOverride ); if (!isOverride){ return null ;} } } catch(e){ //如果出异常,说明该类没有定义 } if (xu.verify._null(pkg_n) || pkg_n === ""){ pkg_n = xu.getAppInf('USER_CLASS_NS') ; } $this_pkg = xu.pkg(pkg_n); //定义父类,将子类的原型 指向父类 if (xu.verify._null(p_class) || p_class === ""){ p_class = xu._class.sys.XClass ;//这个类在匿名函数中创建 } //定义类 $t_class = $this_pkg[class_n] = function(){}; $t_class['__instance_count__'] = 0 ; // 将子类的原型 指向父类,以此获取属性继承 $t_class[__proto] = new p_class(); var __superclass__ = ($t_class[__proto]['__str__']) ? $t_class[__proto]['__str__'](true): 'Object' ; xu.apply($t_class[__proto],{ '__pkg__': pkg_n , '__superclass__': __superclass__, '__class__': class_n }); if (!$t_class[__proto]['__str__']){ $t_class[__proto]['__str__'] = function(isShort){ if (!isShort) return "[class: " + this.__pkg__ + "." + this.__class__ + "]" ; return this.__pkg__ + "." + this.__class__ ; } } if (xu.verify._obj(class_impl)){ xu.apply($t_class[__proto],class_impl); } return $t_class ; } , /** * 验证类是否存在 * @param {String} Class * @return {Boolean} */ exist: function(Class){ if (xu.verify._func(Class)) return true ; return false ; } }); //定义基类, 用于框架中所创建的类的基类. xu._class.create(xu.getAppInf('SYS_CLASS_NS'),'XClass',Object,{ 'desc': 'A System Base Class !' }); Class = xu._class ; })(); //定义时间对象 xu.pkg('xu.date'); xu.apply(xu.date,{ start_loaded_time: start_loaded_time , stop_loaded_time: -1 , loaded_time: function(){ this.stop_loaded_time = this.getTime(); return this.stop_loaded_time - this.start_loaded_time ; } , getTime: function(){return (new Date()).getTime();} });
ui.js
/** * UI Widget 包 */ xu.pkg('xu.ui'); xu._class.create('xu.ui','Widget',null,{ desc: 'Widget Base Class' ,options: {}, instance: null ,error: false , newInstance: function(Class){} , config: function(options){ xu.apply(this.options,options); } , getWidget: function(){alert(this.__str__() + " getWidget() not implement");} , __err__: function(){ return this.__str__() + this.error; }, destroy: function(){alert("销毁");} }); //定义实例列表,用于缓存Widget对象 xu.ui.Widget.instances = {} ; /** * 快速构建Widget 对象的方法 * * @param String ref_n * @param {} options * @return xu.ui.Widget */ xu.ui.Widget.get = function(ref_n,options){ if (xu.ui.Widget.instances.hasOwnProperty(ref_n)) return xu.ui.Widget.instances[ref_n].getWidget(); if (typeof options == 'undefined' || !xu.verify._obj(options)){ var o_info = "'widget标识符',options: { type: Widget Class ,config: {类初始化参数} }" ; warn_msg('<br/>$widget('+ref_n+')初始化错误<br/>设置语法: ' + o_info);return null ; } var options = options || {} ; if (options['type'] && xu._class.exist(options['type']) && options['type'].prototype['getWidget']){ var widget = new options['type'](); widget.config(options['config']); var instance = widget.getWidget() ; if (instance){ xu.ui.Widget.instances[ref_n] = widget ; return instance ; } warn_msg(widget.__err__()); return null ; } }; $widget = xu.ui.Widget.get ; $widget.destroy = function(ref_n){ if (xu.ui.Widget.instances.hasOwnProperty(ref_n)){ var w = xu.ui.Widget.instances[ref_n]; if (w.destroy) w.destroy(); delete xu.ui.Widget.instances[ref_n]; } };
ui.widget.js
// widget 调用步骤: new , config , getWidget /** * xu.ui.UCrenWidget -- Ucren Widget的封装器基类 */ xu._class.create('xu.ui','UCrenWidget',xu.ui.Widget,{ desc: 'Ucren Widget' ,xtype: null ,error: '依赖Ucren组件' , newInstance: function(){ try{ var $t = eval(this.xtype); this.instance = new $t(this.options); } catch(e){} finally { return this.instance ; } } }); /** * xu.ui.UCrenWindow */ xu._class.create('xu.ui','UCrenWindow',xu.ui.UCrenWidget,{ error: '依赖Ucren.FlashWindow' , xtype: 'Ucren.FlashWindow' , options: { left: 170,top: 70,width: 400,height: 300,minWidth: 200,minHeight: 100, caption: '窗体', resizeAble: true ,cloButton: true,cloAble: true } , getWidget: function(){ if (this.instance) return this.instance ; return this.newInstance(); } }); /** * xu.ui.HTMLWidget HTML 构件基类 */ xu._class.create('xu.ui','HTMLWidget',xu.ui.Widget,{ desc: 'HTML Widget Base Class', newInstance: function(){} , config: function(options){ xu.apply(this.options,options); } , render: function(){alert(this.__str__() + " render() not implement");} }); /** * xu.ui.HTMLTable */ xu._class.create('xu.ui','HTMLTable',xu.ui.HTMLWidget,{ desc: 'HTML Table' ,table:null,caption: null,thead: null ,tbody: null ,tfoot:null, options: { caption: null , columns: [] ,datas:{fields:[] ,records:[]} ,foots:[] , css: { color: 'red' } } , destroy: function(){ if (!this.instance) return null ; with(this){ instance.empty().remove(); caption=null;tfoot=null;options = null ;thead=null;tbody=null;table=null; } }, getWidget: function(){ if (this.instance) return this ; this.instance = $eo.create('table'); this.table = this.instance.ele; this.caption = this.table.createCaption(); this.thead = this.table.createTHead(); this.tbody = this.table.getElementsByTagName("tbody")[0] || this.table.appendChild($C("tbody")); this.tfoot = this.table.createTFoot(); return this ; } , render: function(ele){ this.setCaption(this.options.caption); this.setTHead(this.options.columns); this.setTBody(this.options.datas); this.setTBody(this.options.foots); this.instance.css(this.options.css); this.instance.appendTo($eo(ele).ele); return this.instance.html() ; } , setCaption: function(v){ if (v){ this.caption.innerHTML = v ; this.options.caption = v ; } } , setTHead: function(columns){ if (xu.verify._arr(columns)){ var _tr = this.thead.insertRow(0);var _this = this ; xu.array.each(columns,function(item,index){ var _td = _tr.insertCell(index); _td.innerHTML = item.name ; if (item.width) xu.dom.css(_td,{width: item.width}); if (item.dataIndex) xu.dom.attr(_td,{dataIndex: item.dataIndex}); }); } } , setTBody: function(datas){ if (xu.verify._obj(datas) && datas.fields && datas.records){ var _this = this ; xu.array.each(datas.records,function(record,index){ var _tr = _this.tbody.insertRow(index); xu.array.each(record,function(item,index){ var _td = _tr.insertCell(index); _td.innerHTML = item ; }); }); } } , setTFoot: function(foots){ } });
3 楼
moyue
2009-11-24
楼上对jquery的参数机制很熟啊 ,研究过jQuery源码吧
2 楼
achun
2009-11-20
<p>jQuery版的</p>
<pre name="code" class="js">jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + (options.path) : '';
var domain = options.domain ? '; domain=' + (options.domain) : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};</pre>
<p> 事实上这个版本可以不用jQuery来写的,因为代码里面只用了</p>
<pre name="code" class="js">jQuery.trim</pre>
<p>
这一个方法,完全可以写成独立的对象,用法形式上有jQuery方法的风格</p>
<pre name="code" class="js">jQuery.cookie = function(name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + (options.path) : '';
var domain = options.domain ? '; domain=' + (options.domain) : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};</pre>
<p> 事实上这个版本可以不用jQuery来写的,因为代码里面只用了</p>
<pre name="code" class="js">jQuery.trim</pre>
<p>
这一个方法,完全可以写成独立的对象,用法形式上有jQuery方法的风格</p>
1 楼
cuixiping
2009-11-18
价值不高。
第一,不○○,现在大家好像比较重视这个。
第二,功能也不全面,cookie的有效时间应该做为参数传入,而不是写死在函数里面。
理论上至少应该是这样:
Cookie={
set:function(params){...}
,get:function(params){...}
,remove:function(params){...}
}
但我不喜欢又是get又是set的,我喜欢合二为一,就像jquery那样,取值和设置值是同一个方法,只是参数不同。只传一个key就是取值,同时传了value就是设置。
所以要这样:
Cookie={
item:function(params){...}
}
用的时候可以这样:
Cookie.item(key, value); //设置cookie
Cookie.item({key:key, value:value, expires:expires, domain:domain}); //设置cookie
var value = Cookie.item(key); //获取cookie
Cookie.item(key, null); //清除cookie
第一,不○○,现在大家好像比较重视这个。
第二,功能也不全面,cookie的有效时间应该做为参数传入,而不是写死在函数里面。
理论上至少应该是这样:
Cookie={
set:function(params){...}
,get:function(params){...}
,remove:function(params){...}
}
但我不喜欢又是get又是set的,我喜欢合二为一,就像jquery那样,取值和设置值是同一个方法,只是参数不同。只传一个key就是取值,同时传了value就是设置。
所以要这样:
Cookie={
item:function(params){...}
}
用的时候可以这样:
Cookie.item(key, value); //设置cookie
Cookie.item({key:key, value:value, expires:expires, domain:domain}); //设置cookie
var value = Cookie.item(key); //获取cookie
Cookie.item(key, null); //清除cookie
相关推荐
javascript 操作cookiejavascript 操作cookiejavascript 操作cookie
js写的方法,可以设置cookie和获取cookie值,简单易懂
总的来说,JavaScript操作Cookie主要涉及设置、获取、更新和删除四个基本操作,理解这些操作对于前端开发人员来说至关重要,因为它涉及到用户数据的本地存储和管理。通过使用像`CookieUtil.js`这样的工具库,可以更...
总结,JavaScript操作Cookie是Web开发中的基础技能,它允许我们在客户端存储和管理数据,实现诸如用户登录状态、个性化设置等功能。通过学习和实践,我们可以更好地掌握这一技术,提高Web应用的用户体验。
本文将深入探讨如何使用JS操作Cookie的子键,以及如何利用jQuery的Ajax方法进行无刷新的数据提交,并接收后台返回的值。 首先,让我们了解什么是Cookie和它的子键。Cookie是一种在客户端存储小量信息的方法,它由...
除了基本的名、值和过期时间,还可以设置Cookie的域(domain)、路径(path)和安全性(secure)。域决定了哪个站点可以访问Cookie,路径规定了哪些页面可以读取,而安全属性则确保只有在HTTPS连接下才能发送Cookie...
2. JavaScript操作Cookie JavaScript可以通过document.cookie属性来读取、设置和删除cookie。document.cookie是一个字符串,包含了当前域下的所有cookie,各cookie之间以分号和空格分隔。 3. 读取Cookie 要读取特定...
**纯JavaScript操作Cookie** 在JavaScript中,我们可以使用内置的`document.cookie`属性来操作Cookie。但是,`document.cookie`是一个字符串,直接操作起来并不方便,因此通常需要封装成函数进行处理。 1. **设置...
JS的COOKIE设置和清楚,写好的一个函数,方便调用,可直接写成函数的方式
Js 操作cookie源码封装Js 操作cookie源码封装
在Java Web开发中,通常使用Servlet API来设置Cookie。以下是一个示例,展示了如何在响应头中添加带有HttpOnly属性的Cookie: ```java response.setHeader("Set-Cookie", "username=JohnDoe; Path=/; HttpOnly"); `...
### JavaScript操作Cookie知识点详解 #### 一、Cookie简介 Cookie是一种小型的数据文件,通常由服务器发送到客户端(浏览器),客户端将这些数据存储在本地硬盘上,并在后续与该服务器进行交互时将数据发送回...
设置cookie主要涉及以下几个步骤: 1. 创建一个键值对对象,例如`{key: 'username', value: 'JohnDoe'}`。 2. 将对象转换为字符串,以便在HTTP头部中发送。可以使用`encodeURIComponent`函数对键和值进行编码,防止...
本篇文章将基于提供的代码片段深入探讨如何使用JavaScript(简称JS)来操作Cookie,包括设置、获取以及删除Cookie等核心功能,并进一步解释这些功能如何帮助实现一个基本的购物车系统。 #### 一、设置Cookie 设置...
并且在Cookie详解这篇文章中,介绍了如何在服务器端和使用JavaScript创建Cookie,并设置属性。 我们知道,Cookie是存储在客户端的,并且现在前后端分离慢慢变得流行起来,因此如何在浏览器上可以使用方便快捷的...