Rumah hujung hadapan web tutorial js 使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)_jquery

使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)_jquery

May 16, 2016 pm 06:05 PM
pengalaman pengguna Halaman log masuk

需要引入插件jquery.md5.js
可直接在IIS下运行;
用户名:Ethan.zhu
密 码:123456789
完整文件下载:WebApplication1_jb51.rar

首先将按钮单击事件的异步验证提取出来作为一个单独的函数,需要将按钮单击事件里面的变量提取出来定义为全局变量,并且增加一个变量editPass(用来标记是自己输入密码,还是从cookies中读取的密码)

复制代码 代码如下:

var wrongTypeName, //用户名的错误类型,可以直接作为错误提示信息数组的下标
wrongTypePwd, //用户密码的错误类型
wrongNameHtml = new Array("", "请输入用户名", "用户名长度太短", "用户名长度超过12位", "您的用户名或密码错误", "超时,请重新登陆"),
wrongPwdHtml = new Array("", "请输入密码", "密码长度小于6位", "", "密码中含有非法字符"),
editPass=false;

这里从上一篇的按钮单击事件开始:
复制代码 代码如下:

$(".btn-submit").click(function () {
wrongTypeName = 0;
wrongTypePwd = 0;
var uname = $("#uname").val(), //用户名
pwd = $("#passwd").val(), //用户密码
plength = pwd.length,
nlength = uname.length; //长度
if (nlength == 0)
wrongTypeName = 1;
if (nlength > 0 && nlength wrongTypeName = 2;
if (nlength > 20)
wrongTypeName = 3;
if (plength == 0)
wrongTypePwd = 1; //这里是对用户名和密码长度的一个判断,并获取错误信息数组的下标。
else {
var patrn = /^(\w){6,20}$/;
if (plength wrongTypePwd = 2;
if (plength > 50)
wrongTypePwd = 3;
if (plength > 6 && plength if (!patrn.exec(pwd))
wrongTypePwd = 4; //这里是对用户密码合法性的前端判断,并返回错误数组的下标
}
}

inputTip(0, wrongNameHtml, wrongTypeName);
inputTip(1, wrongPwdHtml, wrongTypePwd);

if (wrongTypePwd == 0 && wrongTypeName == 0) {//在用户输入信息完全合法的情况下,即数组下标全部为0 开始执行ajax验证
//alert($.cookie("logout"));
if(editPass){
pwd = $.md5(pwd);
}
$("#passwd").val(pwd);
$("#login-form input").attr('disabled', true);
$('.remember').unbind('click');
//已经向服务器提交了信息,所以将页面上的所有输入框按钮设置成不可用状态,这样可以有效的避免重复提交
var remb = $('#remember-long').val();
ajaxCheck(uname, pwd, remb);
}
});

变化在33行和41行,

行用来判断密码是用户在程序内部退出到登录页面的时候是自行输入还是从cookies中读取的。防止二次加密造成服务器验证失败。

行主要是将ajax处理过程提取出来,同时加入了服务器验证成功之后的记住密码和取消记住密码的操作,方便阅读:
复制代码 代码如下:

var ajaxCheck = function (uname, pwd, remb) {
$(".btn-master").addClass("visibility");
var $params = "user_name=" + decodeURI(uname) + "&user_pwd=" + decodeURI(pwd) + "&remember=" + decodeURI(remb);
$.ajax({
type: 'POST',
url: 'CheckUserLogin.aspx',
//async: false,
cache: false,
dataType: 'json'
data: $params,
success: function (data, status) {
wrongTypeName = data.wrongTypeName;
wrongTypePwd = data.wrongTypePwd;
var loginSuccess = data.loginSuccess; //获取服务器返回的json数据
if (loginSuccess == 0) {
if ($('#remember-long').val() == 1) {//记住密码
$.cookie('UserName', uname, { expires: 7, path: '/' });
$.cookie('Password', pwd, { expires: 7, path: '/' });
}
else if ($('#remember-long').val() == 0) {//取消记住的密码,或者没有记住密码
$.cookie('UserName', null,{ expires: 7, path: '/' });
$.cookie('Password', null,{ expires: 7, path: '/' });
}
location.href = "/Members/Members.html"
}
else {
$(".btn-master").removeClass("visibility");
$("#login-form input").attr('disabled', false);
inputTip(0, wrongNameHtml, wrongTypeName);
inputTip(1, wrongPwdHtml, wrongTypePwd);
}
},
error: function () {
wrongTypeName = 5;
inputTip(0, wrongNameHtml, wrongTypeName);
$("#login-form input").attr('disabled', false);
$('.remember').bind('click', function () { checkClick(); });
$(".btn-master").removeClass("visibility");
}
})
}

页面初始化的时候要对记住密码这个过程进行处理:
复制代码 代码如下:

var rememberPassword = function (logout) {//页面加载完成之后执行自动登录检查
var ckname = $.cookie('UserName');
var ckpwd = $.cookie("Password");
if (ckname != "" && ckpwd != "" && ckname != null && ckpwd != null) {
$('#remember-long').val("1")
$('#remember-long').attr('checked', true);
$("#uname").val(ckname); //用户名
$('.reg-item').addClass('focus');
if (logout=="safe"){
$.cookie("logout","",{ expires: 1, path: '/' })
}
else{
$("#passwd").val(ckpwd); //用户密码
$(".btn-submit").trigger('click'); //自动登录
}
}
else {
$('#remember-long').val("0")
$('#remember-long').attr('checked', false);
}
}

var logout = $.cookie("logout");
    //判断用户是否是从内部退出还是直接打开
//如果是从内部退出,那么就不能再次自动登录进去,除非用户刷新了页面
rememberPassword(logout);

下面是完整的全新的前端脚本:
复制代码 代码如下:

$(function () {

var wrongTypeName, //用户名的错误类型,可以直接作为错误提示信息数组的下标
wrongTypePwd, //用户密码的错误类型
wrongNameHtml = new Array("", "请输入用户名", "用户名长度太短", "用户名长度超过12位", "您的用户名或密码错误", "超时,请重新登陆"),
wrongPwdHtml = new Array("", "请输入密码", "密码长度小于6位", "", "密码中含有非法字符"),
editPass=false;

$('body').focus(); //让输入框不再自动获取焦点

$('.reg-action .reg-input').each(function () {
var items = $(this).parent('.reg-item');
if ($(this).val()) {
items.addClass("focus");
}
$(this).bind('focus blur', function (event) {
var type = event.type; //获取事件类型
if($(this).attr("id")=="passwd"){
editPass = true;
}
if (type == 'focus') {
if (items.hasClass('error')) {
$(this).val("");
items.removeClass('error');
}
items.addClass('focus');
} else if (!$(this).val()) {
items.removeClass('focus');
}
})
});

$(".btn-submit").click(function () {
wrongTypeName = 0;
wrongTypePwd = 0;
var uname = $("#uname").val(), //用户名
pwd = $("#passwd").val(), //用户密码
plength = pwd.length,
nlength = uname.length; //长度
if (nlength == 0)
wrongTypeName = 1;
if (nlength > 0 && nlength wrongTypeName = 2;
if (nlength > 20)
wrongTypeName = 3;
if (plength == 0)
wrongTypePwd = 1; //这里是对用户名和密码长度的一个判断,并获取错误信息数组的下标。
else {
var patrn = /^(\w){6,20}$/;
if (plength wrongTypePwd = 2;
if (plength > 50)
wrongTypePwd = 3;
if (plength > 6 && plength if (!patrn.exec(pwd))
wrongTypePwd = 4; //这里是对用户密码合法性的前端判断,并返回错误数组的下标
}
}

inputTip(0, wrongNameHtml, wrongTypeName);
inputTip(1, wrongPwdHtml, wrongTypePwd);

if (wrongTypePwd == 0 && wrongTypeName == 0) {//在用户输入信息完全合法的情况下,即数组下标全部为0 开始执行ajax验证
//alert($.cookie("logout"));
if(editPass){
pwd = $.md5(pwd);
}
$("#passwd").val(pwd);
$("#login-form input").attr('disabled', true);
$('.remember').unbind('click');
//已经向服务器提交了信息,所以将页面上的所有输入框按钮设置成不可用状态,这样可以有效的避免重复提交
var remb = $('#remember-long').val();
ajaxCheck(uname, pwd, remb);
}
});

var inputTip = function (index, tipHtml, tipNum) {
$(".reg-tip").eq(index).html(tipHtml[tipNum]);
if (tipNum > 0)
$(".reg-item").eq(index).addClass("error");
else
$(".reg-item").eq(index).removeClass("error");
} //定义错误提示信息页面显示函数。由于页面只有两个输入框所以我这里直接指定了index,如果页面上有很多,可以使用$(this).index()

var ajaxCheck = function (uname, pwd, remb) {
$(".btn-master").addClass("visibility");
var $params = "user_name=" + decodeURI(uname) + "&user_pwd=" + decodeURI(pwd) + "&remember=" + decodeURI(remb);
$.ajax({
type: 'POST',
url: 'CheckUserLogin.aspx',
//async: false,
cache: false,
dataType: 'json',
data: $params,
success: function (data, status) {
wrongTypeName = data.wrongTypeName;
wrongTypePwd = data.wrongTypePwd;
var loginSuccess = data.loginSuccess; //获取服务器返回的json数据
if (loginSuccess == 0) {
if ($('#remember-long').val() == 1) {//记住密码
$.cookie('UserName', uname, { expires: 7, path: '/' });
$.cookie('Password', pwd, { expires: 7, path: '/' });
}
else if ($('#remember-long').val() == 0) {//取消记住的密码,或者没有记住密码
$.cookie('UserName', null,{ expires: 7, path: '/' });
$.cookie('Password', null,{ expires: 7, path: '/' });
}
location.href = "/Members/Members.html"
}
else {
$(".btn-master").removeClass("visibility");
$("#login-form input").attr('disabled', false);
inputTip(0, wrongNameHtml, wrongTypeName);
inputTip(1, wrongPwdHtml, wrongTypePwd);
}
},
error: function () {
wrongTypeName = 5;
inputTip(0, wrongNameHtml, wrongTypeName);
$("#login-form input").attr('disabled', false);
$('.remember').bind('click', function () { checkClick(); });
$(".btn-master").removeClass("visibility");
}
})
}

var checkClick = function () {
if ($('#remember-long').attr('checked')) {
$('#remember-long').attr('checked', false);
$('#remember-long').val("0")
}
else {
$('#remember-long').attr('checked', true);
$('#remember-long').val("1")
}
}
$('.remember').bind('click', function () { checkClick(); });
$("#remember-long").click(function () { checkClick(); });
//记住登录的checkbox和label点击的绑定。

if ($.browser.msie && $.browser.version == "6.0") {
//帮助微软消灭ie6
if ($.cookie('masterShow') != "hidden")
$('body').append('

您的浏览器是IE6.0,漏洞较多,用户体验较差,微软官方将要放弃支持,为了自身电脑安全和获取最佳用户体验建议你根据自身需求升级至IE8.0以上版本或者使用火狐浏览器

关闭
不再显示
');
$(".master").delay(1000).slideDown('', function () {
$(".m-close").fadeIn();
});
$(".m-close-short").click(function () {
$(".m-close").fadeOut('', function () {
$(".master").slideUp();
});
});
$(".m-close-long").click(function () {
$(".m-close").fadeOut('', function () {
$(".master").slideUp();
$.cookie('masterShow', 'hidden');
});
});
}

var rememberPassword = function (logout) {//页面加载完成之后执行自动登录检查
var ckname = $.cookie('UserName');
var ckpwd = $.cookie("Password");
if (ckname != "" && ckpwd != "" && ckname != null && ckpwd != null) {
$('#remember-long').val("1")
$('#remember-long').attr('checked', true);
$("#uname").val(ckname); //用户名
$('.reg-item').addClass('focus');
if (logout=="safe"){
$.cookie("logout","",{ expires: 1, path: '/' })
}
else{
$("#passwd").val(ckpwd); //用户密码
$(".btn-submit").trigger('click'); //自动登录
}
}
else {
$('#remember-long').val("0")
$('#remember-long').attr('checked', false);
}
}

var logout = $.cookie("logout");//判断用户是否是从内部退出
rememberPassword(logout);

$(document).bind('keydown', 'return', function () { $(".btn-submit").trigger('click'); });
})

关于页面中涉及的后台程序,我用了页面级别的aspx,当然你也可以使用ashx来处理。这个后台处理负责验证密码是否正确并在用户正确登录的情况下设置session值,如果需要演示,可以在后台定义常量来做验证判断:
复制代码 代码如下:

Hashtable ht = new Hashtable();
string uname = Request.Params["user_name"];
string pwd = Request.Params["user_pwd"];
int wrongTypeName = 0;
int wrongTypePwd = 0;
uname = PageValidate.InputText(uname, 30);

if (Validator.StrIsNullOrEmpty(uname))
{
wrongTypeName = 1;
}
if (Validator.StrIsNullOrEmpty(pwd))
{
wrongTypePwd = 1;
}
if (!string.IsNullOrEmpty(uname) && !string.IsNullOrEmpty(pwd))
{
//以下使用常量来做演示:
string userName="ethan.zhu";
string password ="";//需要MD5加密之后的字符串
if (uname==userName&&password==pwd )
ht.Add("loginSuccess", 0);
else
wrongTypeName = 4;//返回用户名或密码错误

if (wrongTypeName > 0 || wrongTypePwd > 0)
{
ht.Add("wrongTypeName", wrongTypeName);
ht.Add("wrongTypePwd", wrongTypePwd);
}
Response.Write(CreateJsonParams(ht));
}
Response.End();
}

将Hashtable转换成json:
复制代码 代码如下:

public static string CreateJsonParams(Hashtable items)
{
string returnStr = "";
foreach (DictionaryEntry item in items)
{
returnStr += "\"" + item.Key.ToString() + "\":\"" + item.Value.ToString() + "\",";
}
return "{" + returnStr.Substring(0, returnStr.Length - 1) + "}";

}
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Fahami perbezaan pengalaman pengguna antara vivox100s dan x100 Fahami perbezaan pengalaman pengguna antara vivox100s dan x100 Mar 23, 2024 pm 05:18 PM

Dengan perkembangan berterusan sains dan teknologi, keperluan orang ramai untuk peralatan komunikasi juga sentiasa meningkat. Di pasaran, Vivox100s dan X100 adalah dua jenama telefon mudah alih yang telah menarik perhatian ramai. Kesemuanya mempunyai ciri-ciri unik dan masing-masing mempunyai kelebihan tersendiri. Artikel ini akan membandingkan perbezaan pengalaman pengguna antara kedua-dua telefon mudah alih ini untuk membantu pengguna memahaminya dengan lebih baik. Terdapat perbezaan yang jelas dalam reka bentuk penampilan antara Vivox100s dan X100. Vivox100s menggunakan gaya reka bentuk yang bergaya dan ringkas, dengan badan yang nipis dan ringan serta rasa tangan yang selesa manakala X100 memberi lebih perhatian kepada kepraktisan

Mengapakah sesetengah orang berpendapat fotografi Android boleh mengalahkan Apple? Jawapannya begitu langsung Mengapakah sesetengah orang berpendapat fotografi Android boleh mengalahkan Apple? Jawapannya begitu langsung Mar 25, 2024 am 09:50 AM

Apabila membincangkan fungsi kamera telefon Android, kebanyakan pengguna memberikan maklum balas yang positif Berbanding dengan telefon Apple, pengguna umumnya percaya bahawa telefon Android mempunyai prestasi kamera yang lebih baik. Pandangan ini bukan tidak berasas, dan sebab-sebab praktikal adalah jelas. Telefon Android mewah mempunyai kelebihan daya saing yang lebih besar dari segi konfigurasi perkakasan, terutamanya penderia kamera. Banyak telefon Android canggih menggunakan penderia kamera terbaharu, yang paling tinggi, yang selalunya lebih cemerlang daripada iPhone yang dikeluarkan pada masa yang sama dari segi kiraan piksel, saiz apertur dan keupayaan zum optik. Kelebihan ini membolehkan telefon Android memberikan kesan pengimejan berkualiti tinggi apabila mengambil foto dan merakam video, memenuhi keperluan pengguna untuk fotografi dan videografi. Oleh itu, kelebihan daya saing konfigurasi perkakasan telah menjadi tarikan telefon Android.

Xiaomi Auto APP mendahului senarai percuma App Store Apple dengan jualan rasmi hampir 90,000 Xiaomi Auto APP mendahului senarai percuma App Store Apple dengan jualan rasmi hampir 90,000 Apr 01, 2024 am 09:56 AM

Pada 31 Mac, CNMO menyedari bahawa aplikasi mudah alih Xiaomi Auto mendahului kedudukan aplikasi percuma Apple App Store pada 31 Mac. Dilaporkan bahawa Aplikasi rasmi Xiaomi Auto telah memenangi hati majoriti pengguna dengan fungsi komprehensif dan pengalaman pengguna yang sangat baik, dengan cepat menduduki tempat pertama dalam senarai. Apl Auto Xiaomi yang dinanti-nantikan ini bukan sahaja merealisasikan sambungan lancar proses pembelian kereta dalam talian, tetapi juga menyepadukan perkhidmatan kawalan kenderaan jauh Pengguna boleh menyelesaikan satu siri operasi pintar seperti pertanyaan status kenderaan dan operasi jauh tanpa meninggalkan rumah. Terutama apabila model baharu Xiaomi Motors SU7 dikeluarkan, Apl dilancarkan secara serentak Pengguna boleh memahami butiran konfigurasi SU7 secara intuitif melalui Apl dan berjaya menyelesaikan prapesanan. Reka bentuk dalaman Apl Auto Xiaomi

Apakah lima elemen pengalaman pengguna? Apakah lima elemen pengalaman pengguna? Aug 26, 2022 pm 05:24 PM

Lima elemen pengalaman pengguna: 1. Keperluan pengguna, apa yang pengguna dan pengendali ingin dapatkan daripada produk ini 2. Skop fungsi, apakah fungsi produk ini 3. Reka bentuk proses, yang boleh dibahagikan kepada dua kategori utama: interaksi; reka bentuk dan seni bina maklumat Dalam bahagian ini, reka bentuk interaksi menerangkan "kelakuan pengguna yang mungkin", dan seni bina maklumat memberi tumpuan kepada cara untuk menyatakan maklumat kepada pengguna halaman; 5. Reka bentuk persepsi, Ia adalah penggabungan kandungan, kefungsian dan estetika untuk menghasilkan reka bentuk akhir yang memenuhi semua objektif pada peringkat lain.

Menganalisis proses komunikasi sisi pelayan Vue: cara meningkatkan pengalaman pengguna Menganalisis proses komunikasi sisi pelayan Vue: cara meningkatkan pengalaman pengguna Aug 10, 2023 am 11:19 AM

Menganalisis proses komunikasi sisi pelayan Vue: Bagaimana untuk meningkatkan pengalaman pengguna Pengenalan: Dengan perkembangan pesat Internet, komunikasi antara pelanggan dan pelayan telah menjadi semakin penting. Sebagai rangka kerja JavaScript moden, Vue menyediakan pembangun dengan pelbagai alatan dan teknologi untuk melaksanakan komunikasi sebelah pelayan. Artikel ini akan menyelidiki proses komunikasi sebelah pelayan Vue dan memperkenalkan beberapa petua dan amalan terbaik untuk meningkatkan pengalaman pengguna. 1. Gambaran keseluruhan proses komunikasi bahagian pelayan Vue Proses komunikasi bahagian pelayan Vue merangkumi langkah-langkah utama berikut

ViewSonic debut di ChinaJoy2024 dengan skrin besar 8K yang menakjubkan ViewSonic debut di ChinaJoy2024 dengan skrin besar 8K yang menakjubkan Jul 24, 2024 pm 01:33 PM

Dari 26 Julai hingga 29 Julai, ChinaJoy2024 tahunan akan dibuka secara megah di Pusat Ekspo Antarabangsa Baharu Shanghai, ViewSonic akan berganding bahu dengan ZOL Zhongguancun Online untuk mencipta liputan penuh penglihatan, pendengaran dan sentuhan untuk pengguna dan peminat teknologi A kenduri. ZOL Zhongguancun Online ialah portal interaktif IT yang meliputi seluruh negara dan berkedudukan untuk mempromosikan jualan Ia adalah media komposit yang mengintegrasikan data produk, maklumat profesional, video teknologi dan pemasaran interaktif. Zhongguancun Online memecahkan dinding dimensi dan muncul di gerai S101 Dewan E7 ChinaJoy dengan tema "Trendy dan Seronok", membawakan pengalaman pameran yang pelbagai dan mengasyikkan kepada penonton dan orang dalam industri dari seluruh dunia. Kawasan Pameran ViewSonic: Terokai teknologi paparan mewah 1

Pemalam Terbaik untuk php CodeIgniter: Bawa tapak web anda ke peringkat seterusnya Pemalam Terbaik untuk php CodeIgniter: Bawa tapak web anda ke peringkat seterusnya Feb 19, 2024 pm 11:48 PM

CodeIgniter ialah rangka kerja PHP yang berkuasa, tetapi kadangkala anda mungkin memerlukan ciri tambahan untuk melanjutkan fungsinya. Pemalam boleh membantu anda mencapai ini. Mereka boleh menyediakan pelbagai fungsi, daripada meningkatkan prestasi laman web kepada meningkatkan keselamatan. 1.HMVC (Hierarchical Model View Controller) Plugin Hmvc membolehkan anda menggunakan seni bina MVC berlapis dalam CodeIgniter. Ini berguna untuk projek besar dengan logik perniagaan yang kompleks. Menggunakan HMVC anda boleh menyusun pengawal ke dalam modul yang berbeza dan memuatkan serta memunggah modul ini mengikut keperluan. Kod demo: //Tambah kod berikut dalam config/routes.php: $route["/module/contr

DXO: Skor ujian skrin Huawei Mate60 Pro 143 telah meningkat dengan ketara DXO: Skor ujian skrin Huawei Mate60 Pro 143 telah meningkat dengan ketara Mar 22, 2024 pm 06:31 PM

Pada 21 Mac, CNMO menyedari bahawa DXOMARK mengumumkan keputusan ujian skrin Huawei Mate60Pro, dengan skor 143 mata, berada di kedudukan tengah kedudukan skrin global. Menurut semakan DXOMARK, skrin peranti memberikan pengalaman pengguna yang selesa. Berbanding dengan Huawei Mate50Pro generasi sebelumnya, versi terbaharu skrin mempunyai peningkatan ketara dalam gerak balas dan sentuhan sentuhan serta pengurusan artifak, membolehkan pengguna menikmati pengalaman visual yang lebih baik. Kebolehbacaan skrin pada asasnya mengekalkan tahap produk generasi sebelumnya Walaupun kecerahan dalam persekitaran cahaya malap sedikit tidak mencukupi, skrin peranti mempunyai kebolehbacaan yang baik dan pemaparan warna yang tepat dalam kebanyakan keadaan cahaya ambien. Kebolehbacaan agak baik terutamanya di luar, dan kecerahan skrin mencapai

See all articles