`
zhangziyueup
  • 浏览: 1171389 次
文章分类
社区版块
存档分类
最新评论

汇总Javascript各种判断脚本

 
阅读更多

验证类1、数字验证内1.1 整数1.2 大于0的整数 (用于传来的ID的验证)1.3 负整数的验证1.4 整数不能大于iMax1.5 整数不能小于iMin2、时间类2.1 短时间,形如 (13:04:06)2.2 短日期,形如 (2003-12-05)2.3 长时间,形如 (2003-12-05 13:04:06)2.4 只有年和月。形如(2003-05,或者2003-5)2.5 只有小时和分钟,形如(12:03)3、表单类3.1 所有的表单的值都不能为空3.2 多行文本框的值不能为空。3.3 多行文本框的值不能超过sMaxStrleng3.4 多行文本框的值不能少于sMixStrleng3.5 判断单选框是否选择。3.6 判断复选框是否选择.3.7 复选框的全选,多选,全不选,反选3.8 文件上传过程中判断文件类型4、字符类4.1 判断字符全部由a-Z或者是A-Z的字字母组成4.2 判断字符由字母和数字组成。4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母4.4 字符串替换函数.Replace();5、浏览器类5.1 判断浏览器的类型5.2 判断ie的版本5.3 判断客户端的分辨率6、结合类6.1 email的判断。6.2 手机号码的验证6.3 身份证的验证二、功能类1、时间与相关控件类1.1 日历1.2 时间控件1.3 万年历1.4 显示动态显示时钟效果(文本,如OA中时间)1.5 显示动态显示时钟效果 (图像,像手表)2、表单类2.1 自动生成表单2.2 动态添加,修改,删除下拉框中的元素2.3 可以输入内容的下拉框2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)3、打印类3.1 打印控件4、事件类4.1 屏蔽右键4.2 屏蔽所有功能键4.3 --> 和<-- F5 F11,F9,F14.4 屏蔽组合键ctrl+N5、网页设计类5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)5.2 html编辑控件类5.3 颜色选取框控件5.4 下拉菜单5.5 两层或多层次的下拉菜单5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)5.8 双击后,网页自动滚屏6、树型结构。6.1 asp+SQL版6.2 asp+xml+sql版6.3 java+sql或者java+sql+xml7、无边框效果的制作8、连动下拉框技术9、文本排序---------------------------------------------------------------------------------------一、验证类1、数字验证内1.1 整数/^(-|/+)?/d+$/.test(str)1.2 大于0的整数 (用于传来的ID的验证)/^/d+$/.test(str)1.3 负整数的验证/^-/d+$/.test(str)2、时间类2.1 短时间,形如 (13:04:06)function isTime(str){var a = str.match(/^(/d{1,2})(?(/d{1,2})/2(/d{1,2})$/);if (a == null) {alert('输入的参数不是时间格式'); return false;}if (a[1]>24 || a[3]>60 || a[4]>60){alert("时间格式不对");return false}return true;}2.2 短日期,形如 (2003-12-05)function strDateTime(str){var r = str.match(/^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2})$/);if(r==null)return false;var d= new Date(r[1], r[3]-1, r[4]);return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);}2.3 长时间,形如 (2003-12-05 13:04:06)function strDateTime(str){var reg = /^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2}) (/d{1,2})/d{1,2})/d{1,2})$/;var r = str.match(reg);if(r==null)return false;var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);}2.4 只有年和月。形如(2003-05,或者2003-5)2.5 只有小时和分钟,形如(12:03)3、表单类3.1 所有的表单的值都不能为空3.2 多行文本框的值不能为空。3.3 多行文本框的值不能超过sMaxStrleng3.4 多行文本框的值不能少于sMixStrleng3.5 判断单选框是否选择。3.6 判断复选框是否选择.3.7 复选框的全选,多选,全不选,反选3.8 文件上传过程中判断文件类型4、字符类4.1 判断字符全部由a-Z或者是A-Z的字字母组成4.2 判断字符由字母和数字组成。4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母/^([a-zA-z_]{1})([/w]*)$/g.test(str)4.4 字符串替换函数.Replace();5、浏览器类5.1 判断浏览器的类型window.navigator.appName5.2 判断ie的版本window.navigator.appVersion5.3 判断客户端的分辨率window.screen.height; window.screen.width;6、结合类6.1 email的判断。function ismail(mail){return(new RegExp(/^/w+((-/w+)|(/./w+))*/-AT-[A-Za-z0-9]+((/.|-)[A-Za-z0-9]+)*/.[A-Za-z0-9]+$/).test(mail));}6.2 手机号码的验证6.3 身份证的验证function isIdCardNo(num){if (isNaN(num)) {alert("输入的不是数字!"); return false;}var len = num.length, re;if (len == 15)re = new RegExp(/^(/d{6})()?(/d{2})(/d{2})(/d{2})(/d{3})$/);else if (len == 18)re = new RegExp(/^(/d{6})()?(/d{4})(/d{2})(/d{2})(/d{3})(/d)$/);else {alert("输入的数字位数不对!"); return false;}var a = num.match(re);if (a != null){if (len==15){var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];}else{var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];}if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}}return true;}-------------------------------------------------------------------------------------3.7 复选框的全选,多选,全不选,反选全选全选function checkAll(str){var a = document.getElementsByName(str);var n = a.length;for (var i=0; ia[i].checked = window.event.srcElement.checked;}function checkItem(str){var e = window.event.srcElement;var all = eval("document.hrong."+ str);if (e.checked){var a = document.getElementsByName(e.name);all.checked = true;for (var i=0; i{if (!a[i].checked){ all.checked = false; break;}}}else all.checked = false;}3.8 文件上传过程中判断文件类型-------------------------------------------------------------------------------------1.身份证严格验证:2.验证IP地址function isip(s){var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};var re=s.split(".")return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false}var s="202.197.78.129";alert(isip(s))3.加sp1后还能用的无边框窗口!!/*--- Special Thanks For andot ---*//*This following code are designed and writen by Windy_skYou can use it freely, but u must held all the copyright items!//- Thanks For andot Again ---*/var CW_width = 400;var CW_height = 300;var CW_top = 100;var CW_left = 100;var CW_url = "/";var New_CW = window.createPopup();var CW_Body = New_CW.document.body;var content = "";var CSStext = "margin:1px;color:black; border:2px outset;border-style:expression(onmouseout=onmouseup=function(){this.style.borderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.borderStyle='inset'});background-color:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;cursor:Default;";//Build Windowinclude.startDownload(CW_url, function(source){content=source});function insert_content(){var temp = "";CW_Body.style.overflow = "hidden";CW_Body.style.backgroundColor = "white";CW_Body.style.border = "solid black 1px";content = content.replace(/]*)>/g,"");temp += "";temp += "";temp += "Chromeless Window For IE6 SP1";temp += "";temp += "?";temp += "0";temp += "1";temp += "x";temp += "";temp += "";temp += content;temp += "";temp += "";CW_Body.innerHTML = temp;}setTimeout("insert_content()",1000);var if_max = true;function show_CW(){window.moveTo(10000, 10000);if(if_max){New_CW.show(CW_top, CW_left, CW_width, CW_height);if(typeof(New_CW.document.all.include)!="#ff0000"){New_CW.document.all.include.style.width = CW_width;New_CW.document.all.Max.innerText = "1";}}else{New_CW.show(0, 0, screen.width, screen.height);New_CW.document.all.include.style.width = screen.width;}}window.onfocus = show_CW;window.onresize = show_CW;// Move Windowvar drag_x,drag_y,draging=falsefunction drag_move(e){if (draging){New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);return false;}}function drag_down(e){if(e.button==2)return;if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return;drag_x=e.clientX;drag_y=e.clientY;draging=true;e.srcElement.setCapture();}function drag_up(e){draging=false;e.srcElement.releaseCapture();if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return;CW_top = e.screenX-drag_x;CW_left = e.screenY-drag_y;}电话号码的验证要求:(1)电话号码由数字、"("、")"和"-"构成(2)电话号码为3到8位(3)如果电话号码中包含有区号,那么区号为三位或四位(4)区号用"("、")"或"-"和其他部分隔开(5)移动电话号码为11或12位,如果为12位,那么第一位为0(6)11位移动电话号码的第一位和第二位为"13"(7)12位移动电话号码的第二位和第三位为"13"根据这几条规则,可以与出以下正则表达式:(^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)function PhoneCheck(s) {var str=s;var reg=/(^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/alert(reg.test(str));}-----------------------------------------------------------------------------------------------------------------------------------------------------------------------//检验法人代码function isCorporationCode(s){var patrn=/^(/d){15}$/;if (!patrn.exec(s)) return falsereturn true}//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串function isRegisterUserName(s){var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验用户姓名:只能输入1-30个以字母开头的字串function isTrueName(s){var patrn=/^[^`~!@#$%^&*()+-=|///[/]/{/}:;/'/,.<>/? 0-9]{2,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验密码:只能输入6-15个字母、数字function isPasswd(s){var patrn=/^[a-zA-Z0-9]{6,15}$/;if (!patrn.exec(s)) return falsereturn true}//检验体重function isAvoirdupois(s){var patrn=/^[1-9]{1}[0-9]{0,2}$/;var patrn2=/^[1-9]{1}$/;var intPart=s.indexOf('.');var decPart=s.lastIndexOf('.');if (intPart==-1 && patrn.exec(s) && eval(s)>=2 && eval(s)<=200) return trueif (intPart!=decPart || intPart==0 || intPart+2!=s.length) return falseif (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return falseif (eval(s)<2 || eval(s)>200) return falsereturn true}//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”function isTel(s){var patrn=/^[+]{0,1}(/d){1,3}[ ]?([-]?((/d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}//校验手机号码:必须以数字开头,除数字外,可含有“-”function isMobile(s){var patrn=/^[+]{0,1}(/d){1,3}[ ]?([-]?((/d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}//校验地区代码function isAreaCode(s){var patrn=/^(/d){6}$/;if (!patrn.exec(s)) return falsereturn true}//校验邮政编码function isPostalCode(s){var patrn=/^[1-9]{1}(/d){5}$/;if (!patrn.exec(s)) return falsereturn true}//校验搜索关键字function isSearch(s){var patrn=/^[^`~!@#$%^&*()+=|///[/]/{/}:;/'/,.<>/? ]{1}[^`~!@$%^&()+=|///[/]/{/}:;/'/,.<>?]{0,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验是否为ip地址function isIP(s){var patrn=/^[0-9.]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}//检验页码是否正确function isPage(s){var patrn=/^[1-9]{1}[0-9]{0,2}$/;if (!patrn.exec(s)) return falsereturn true}//表单输入值错误提示function vErr(o,s){alert(s);if (o) o.focus();return false;}//判断单选function chkRadio(o){for (i=0;iif (o[i].checked) return true;}return false;}//====================================表单类================================// 文件上传过程中判断文件类型/*///表单的值不能为空function isNull(elem){//var pattern=/^/s+|/s+$/;if(elem.replace(/(^/s+|/s$)/g, "")==""){return false;}else{return true;}}//不能超过imax字符function imax(elem){if(elem.length>imax){return false;}else{return true;}}//不能少于imix字符function imix(elem){if(elem.lengthreturn false;}else{return true;}}//输入为中文判断function isChinese(elem){var pattern=/[^/x00-/xff]/g;if(pattern.test(elem)){//包含中文return false;}else{//不包含中文return true;}}/ *********************************************************************************************************************.cMenu {FILTER: alpha(opacity=0);BACKGROUND-COLOR: #D6D3CE;BORDER-BOTTOM: #666666 2px solid; BORDER-LEFT: #E4E4E4 2px solid; BORDER-RIGHT: #666666 2px solid; BORDER-TOP: #E4E4E4 2px solid; COLOR: #000000; CURSOR: default; FONT-SIZE: 9pt; color:#000000;FONT-WEIGHT: normal; LINE-HEIGHT: 20px; POSITION: absolute; VISIBILITY: hidden; WIDTH: 110px}.menuitems {font-size:9pt;MARGIN: 2px;PADDING-BOTTOM: 0px;PADDING-LEFT: 15px;PADDING-RIGHT: 3px;PADDING-TOP: 0px;}

<!--[if IE]>onmouseover=highlightie5()>电话号码的验证要求:(1)电话号码由数字、"("、")"和"-"构成(2)电话号码为3到8位(3)如果电话号码中包含有区号,那么区号为三位或四位(4)区号用"("、")"或"-"和其他部分隔开(5)移动电话号码为11或12位,如果为12位,那么第一位为0(6)11位移动电话号码的第一位和第二位为"13"(7)12位移动电话号码的第二位和第三位为"13"根据这几条规则,可以与出以下正则表达式:(^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)<! function PhoneCheck(s) {var str=s;var reg=/(^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/alert(reg.test(str));}// -->

----------------------------------------------------------------------------------------<%'********************************************'函数功能:正则表达式校验'参数patrn:要校验的类型' "User" - 用户名' "Truename" - 英文姓名' "Passwd" - 密码' "Tel" - 电话/传真' "Mobil" - 手机' "Date" - 日期(格式:yyyy-mm-dd)' "Email" - 电子邮件' "Postalcode" - 邮政编码' "Search" - 搜索关键字' "Int" - 整数'参数strng:要校验的字串'返回值:校验结果,正确返回true,错误返回false'********************************************Function IsVerify(patrn,strng)strng=Trim(strng)Select Case patrnCase "User" '用户名patrn="^[a-z]{1}([a-z0-9]|[._]){2,19}$"Case "Truename" '英文姓名patrn="^[a-zA-Z]{1,30}$"Case "Passwd" '密码patrn="^(/w){6,20}$"Case "Tel" '电话/传真patrn="^[+]{0,1}(/d){1,3}[ ]?([-]?((/d)|[ ]){1,12})+$"Case "Mobil" '手机patrn="^(/d)+[-]?(/d){6,12}$"Case "Date" '日期(格式:yyyy-mm-dd)patrn="^[12]{1}(/d){3}[-][01]?(/d){1}[-][0123]?(/d){1}$"Case "Email" '电子邮件patrn="^((/w)|[-]|[.])+@(((/w)|[-])+[.])+[a-z]{2,4}$"Case "Postalcode" '邮政编码patrn="^[a-z0-9 ]{3,12}$"Case "Search" '搜索关键字patrn="^[^`~!@#$%^&*()+=|///[/]/{/}:;/'/,.<>/?]{1}[^`~!@$%^&()+=|///[/]/{/}:;/'/,.<>?]{0,19}$"Case "Int" '整数patrn="^[1-9]{1}[0-9]{0,6}$"Case "Array"patrn="^[0-9]{1}([0-9]|[/,]){0,150}$"End SelectDim regExDim MatchSet regEx = New RegExpregEx.Pattern = patrnregEx.IgnoreCase = TrueregEx.Global = TrueMatches = regEx.test(strng)IsVerify = MatchesSet regEx = NothingEnd Function'********************************************'函数功能:对输入框的特殊字串进行过滤保存'参数strPass:过滤前的字符串'返回值:过滤后的字符串'********************************************Function SQLencode(byVal strPass)strPass = Replace(strPass, "&", "&")strPass = Replace(strPass, "<", "<")strPass = Replace(strPass, ">", ">")strPass = Replace(strPass, """", """)strPass = Replace(strPass, "'", "'")strPass = Replace(strPass, " ", " ")strPass = Replace(strPass,chr(13)&chr(10),"
")SQLencode = strPassEnd Function'********************************************'函数功能:对SQLencode函数过滤后的字符串进行还原'参数strPass:经过过滤后的字符串'返回值:还原的过滤前的字符串'********************************************Function SQLdecode(byVal strPass)If Not isNull(strPass) ThenstrPass = Replace(strPass, "<", "<")strPass = Replace(strPass, ">", ">")strPass = Replace(strPass, ""","""" )strPass = Replace(strPass, "'","'" )strPass = Replace(strPass,"
",chr(13)&chr(10))End IfSQLdecode = strPassEnd Function'********************************************'函数功能:生成随机密码(字符为数字与大小写字母集合)'参数length:密码长度'返回值:随机密码'********************************************Function random(length)Dim n,strrnds=""RandomizeFor i=1 To lengthn=Int(75*Rnd+48)If (n>57 and n<65) Or (n>90 and n<97) Theni=i-1Elsernds=rnds&Chr(n)End IfNextrandom=rndsEnd Function'********************************************'函数功能:对密码进行加密/解密(最大长度为15位)'********************************************Function Encrypt(preString)Dim pwds,spwds=""s=Left(preString,15)For i=1 To Len(s)seed=170-Asc(Mid(s,i,1))-ipwds=pwds & Chr(seed)NextEncrypt=pwdsEnd Function'********************************************'函数功能:格式化当前时间字串'参数:无'返回值:返回当前时间的纯数字字符串方式的表示(例如:当前时间2001-10-3 2:34:6,返回字符串"20011003023406")'********************************************Function TheDate()y=year(date())m=month(date())d=day(date())h=Hour(time())n=Minute(time())s=Second(time())If Len(m)=1 Then m="0"&mIf Len(d)=1 Then d="0"&dIf Len(h)=1 Then h="0"&hIf Len(n)=1 Then n="0"&nIf Len(s)=1 Then s="0"&sthedate=y&m&d&h&n&sEnd Function'********************************************'函数功能:返回字符串的长度'参数:字符串'返回值:字符串长度'********************************************Function strLen(str)dim p_lenp_len=0strlen=0if trim(str)<>"" thenp_len=len(trim(str))for xx=1 to p_lenif asc(mid(str,xx,1))<0 thenstrlen=int(strlen) + 2elsestrlen=int(strlen) + 1end ifnextend ifEnd Function'********************************************'函数功能:发送邮件通知'参数:字符串'返回值:成功/失败'********************************************Function SendMail(ToAddress, Subject, Body)On Error Resume NextSet objMail = server.CreateObject("JMail.Message")objMail.From = ADR_EmailobjMail.FromName = "ADR管理中心"objMail.Subject = SubjectobjMail.AddRecipient ToAddressobjMail.Body = BodyIf objMail.Send("") ThenSendMail = TrueElseSendMail = FalseEnd IfIf Err.Number<> 0 Then SendMail = FalseSet objMail = NothingOn Error Goto 0End Function%>-----------------------------------------------------------------------------------//检验法人代码function isCorporationCode(s){var patrn=/^(/d){15}$/;if (!patrn.exec(s)) return falsereturn true}//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串function isRegisterUserName(s){var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验用户姓名:只能输入1-30个以字母开头的字串function isTrueName(s){var patrn=/^[^`~!@#$%^&*()+-=|///[/]/{/}:;/'/,.<>/? 0-9]{2,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验密码:只能输入6-15个字母、数字function isPasswd(s){var patrn=/^[a-zA-Z0-9]{6,15}$/;if (!patrn.exec(s)) return falsereturn true}//检验体重function isAvoirdupois(s){var patrn=/^[1-9]{1}[0-9]{0,2}$/;var patrn2=/^[1-9]{1}$/;var intPart=s.indexOf('.');var decPart=s.lastIndexOf('.');if (intPart==-1 && patrn.exec(s) && eval(s)>=2 && eval(s)<=200) return trueif (intPart!=decPart || intPart==0 || intPart+2!=s.length) return falseif (!patrn.exec(s.substring(0,intPart)) || !patrn2.exec(s.substring(decPart+1))) return falseif (eval(s)<2 || eval(s)>200) return falsereturn true}//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”function isTel(s){var patrn=/^[+]{0,1}(/d){1,3}[ ]?([-]?((/d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}//校验手机号码:必须以数字开头,除数字外,可含有“-”function isMobile(s){var patrn=/^[+]{0,1}(/d){1,3}[ ]?([-]?((/d)|[ ]){1,12})+$/;if (!patrn.exec(s)) return falsereturn true}//校验地区代码function isAreaCode(s){var patrn=/^(/d){6}$/;if (!patrn.exec(s)) return falsereturn true}//校验邮政编码function isPostalCode(s){var patrn=/^[1-9]{1}(/d){5}$/;if (!patrn.exec(s)) return falsereturn true}//校验搜索关键字function isSearch(s){var patrn=/^[^`~!@#$%^&*()+=|///[/]/{/}:;/'/,.<>/? ]{1}[^`~!@$%^&()+=|///[/]/{/}:;/'/,.<>?]{0,19}$/;if (!patrn.exec(s)) return falsereturn true}//校验是否为ip地址function isIP(s){var patrn=/^[0-9.]{1,20}$/;if (!patrn.exec(s)) return falsereturn true}//检验页码是否正确function isPage(s){var patrn=/^[1-9]{1}[0-9]{0,2}$/;if (!patrn.exec(s)) return falsereturn true}//表单输入值错误提示function vErr(o,s){alert(s);if (o) o.focus();return false;}//判断单选function chkRadio(o){for (i=0;i

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics