本文整理并详解了15个前端开发中常用的JavaScript函数与技巧,涵盖图片无损缩放与裁剪、文本域字数统计、新窗口强制弹出、输入框自适应宽度、收藏夹与设为首页、Ajax用户验证、邮箱格式校验、用户名综合判断、新闻滚动效果、数字输入限制、字符串转换与截取分割等高频场景。
本文整理了一系列前端开发中常用的JavaScript函数与实用技巧,旨在帮助开发者提高编码效率。
JavaScript常用功能概览
主要涵盖以下15个功能点: 1. 图片大小自适应调整(兼容Firefox与IE)及基于overflow:hidden的图片裁剪。 2. 文本域(textarea)内文字数量的实时统计与控制。 3. 点击按钮强制弹出新窗口的方法。 4. Input输入框宽度随内容自动扩展。 5. 添加网页到收藏夹的功能实现。 6. 将当前网页设置为浏览器首页。 7. 结合jQuery与Ajax进行用户存在性验证。 8. 邮箱地址格式的正则表达式校验。 9. 用户名的综合验证(包括长度限制、字符类型等)。 10. 新闻列表滚动效果的实现。 11. 限制输入框仅允许输入正整数(常用于购物车)或正数(包含正小数)。 12. 字符串转数字类型的转换方法。 13. 获取文件后缀名以判断文件格式。 14. 字符串的截取操作。 15. 字符串的分割处理。
图片自适应与裁剪处理
接下来将逐一介绍上述功能的具体实现细节,首先从图片处理开始。
// 用法 <img src="this_image_path.jpg" onload="DrawImage(this,450,450);" />
function DrawImage(ImgD,FitWidth,FitHeight){
var image=new Image();
image.src=ImgD.src;
if(image.width>0 && image.height>0){
if(image.width/image.height>= FitWidth/FitHeight){
if(image.width>FitWidth){
ImgD.width=FitWidth;
ImgD.height=(image.height*FitWidth)/image.width;
}else{
ImgD.width=image.width;
ImgD.height=image.height;
}
} else{
if(image.height>FitHeight){
ImgD.height=FitHeight;
ImgD.width=(image.width*FitHeight)/image.height;
}else{
ImgD.width=image.width;
ImgD.height=image.height;
}
}
}
}
利用CSS属性overflow:hidden实现图片的剪切效果,确保显示区域整齐。
function clipImage(o, w, h){
var img = new Image();
img.src = o.src;
if(img.width >0 && img.height>0)
{
if(img.width/img.height >= w/h)
{
if(img.width > w)
{
o.width = (img.width*h)/img.height;
o.height = h;
//o.setAttribute("style", "marginLeft:-" + ((o.width-w)/2).toString() + "px");
$(o).css("margin-left", "-"+((o.width-w)/2).toString() + "px");
}
else
{
o.width = img.width;
o.height = img.height;
}
}
else
{
if(img.height > h)
{
o.height = (img.height*w)/img.width;
o.width = w;
//o.setAttribute("style", "margin-top:-" + ((o.height-h)/2).toString() + "px");
//$(o).css("style", "margin-top:-" + ((o.height-h)/2).toString() + "px");
$(o).css("margin-top", "-"+((o.height-h)/2).toString() + "px");
}
else
{
o.width = img.width;
o.height = img.height;
}
}
}
}
具体应用示例如下:
<style type="text/css">
ul{list-style:none;}
ul li{float:left;padding:1px;border:#ccc 1px solid;width:120px;height:120px;overflow:hidden;text-align:center;over-flow:hidden;}
</style>
<ul>
<li><img src="1.jpg" onload="DrawImage(this,120,120);" /></li>
<li><img src="2.jpg" onload="clipImage(this,120,120);" /></li>
</ul>
文本域字数统计与控制
关于如何限制文本域(textarea)中可输入的文字数量,可以通过JavaScript监听输入事件来实现。
<script>
/**
* Calculate how many characters remain in a textarea (jQuery)
* @param string textarea
* @param int maxLength
* @param string div
*/
function charsRemain(textarea, maxLength, div) {
var currentLength = $(textarea).val().length;
var charsLeft = maxLength - currentLength;
if (charsLeft < 0) { charsLeft = 0; }
$("#"+ div +"_charsRemain").html(charsLeft);
if (currentLength > maxLength) {
var fullText = $(textarea).val().substring(0, maxLength);
$(textarea).val(fullText);
}
}
/**
* Calculate how many characters remain in a textarea (javascript)
* @param string textarea
* @param int maxLength
* @param string div
*/
function charsRemain(textarea, maxLength, div) {
var currentLength = textarea.value.length;
var charsLeft = maxLength - currentLength;
if (charsLeft < 0) { charsLeft = 0; }
document.getElementById(div +"_charsRemain").innerHTML = charsLeft;
if (currentLength > maxLength) {
var fullText = textarea.value.substring(0, maxLength);
textarea.value = fullText;
}
}
</script>
<textarea rows="5" cols="15" onkeyup="charsRemain(this, 250, 'textarea');"></textarea>
<span id="textarea_charsRemain">250</span> characters remaining
新窗口强制弹出技巧
对于需要在新窗口打开链接的场景,普通window.open()常被浏览器拦截,这里介绍一种强制弹出的方法。
//弹窗
function g_OpenWindow(pageURL, innerWidth, innerHeight)
{
var ScreenWidth = screen.availWidth
var ScreenHeight = screen.availHeight
var StartX = (ScreenWidth - innerWidth) / 2
var StartY = (ScreenHeight - innerHeight) / 2
var wins = window.open(pageURL, 'OpenWin', 'left='+ StartX + ', top='+ StartY + ', Width=' + innerWidth +', height=' + innerHeight + ', resizable=yes, scrollbars=yes, status=no, toolbar=no, menubar=no, location=no')
wins.focus();
}
参考以下JavaScript代码实现弹窗逻辑:
<script language="JavaScript">
// 自动弹出窗口
var whatsNew = open('','_blank','top=50,left=50,width=200,height=300,' + 'menubar=no,toolbar=no,directories=no,location=no,' + 'status=no,resizable=no,scrollbars=yes');
whatsNew.document.write('<center><b>news</b>< /center>');
whatsNew.document.write('<p>this is a test');
whatsNew.document.write('<p>deos address');
whatsNew.document.write('<p align="right">' + '<a href="javascript:self.close()">Close</a>');
whatsNew.document.close();
</script>
需要注意的是,许多现代浏览器默认会屏蔽弹出窗口,用户需手动允许后才能查看。上述方法的原理是动态创建一个form表单,并通过POST方式打开新窗口,从而绕过浏览器的弹窗拦截机制。
<script language="javascript">
function ForceWindow (){
this.r = document.documentElement;
this.f = document.createElement("FORM");
this.f.target = "_blank";
this.f.method = "post";
this.r.insertBefore(this.f, this.r.childNodes[0]); //XML DOM : insertBefore() 方法可在已有的子节点前插入一个新的子节点。 insertBefore(newchild,refchild)
}
ForceWindow.prototype.pop = function (sUrl){
this.f.action = sUrl;
this.f.submit();
}
window.force = new ForceWindow();
</script>
<body onLoad="window.force.pop('http://deographics.com/')">
<div>
this is a test ! we will open the deographics's website~~
</div>
</body>
当然,除了上述强制弹窗方式,还有更优雅的替代方案,例如通过用户交互事件触发。
<script>
function openWin(){
window.showModalDialog(url,window, "help:no;scroll:no;resizable:no;status:0;dialogWidth:420px;dialogHeight:200px;center:yes");
}
</script>
输入框自适应与交互功能
关于如何让Input输入框的宽度随着输入内容的增加而自动变长,可以通过监听input事件并动态调整样式实现。
// input auto length
// <input name="words" size="2" maxlength="100" onkeyup="checkLength(this)"/><span id="char">0</span>
function checkLength(which) {
var maxchar=100;
//var oTextCount = document.getElementById("char");
iCount = which.value.replace(/[^\u0000-\u00ff]/g,"aa").length;
if(iCount<=maxchar){
//oTextCount.innerHTML = "<font color=#FF0000>"+ iCount+"</font>";
which.style.border = '1px dotted #FF0000';
which.size=iCount+2;
}else{
alert('Please input letter less than '+ maxchar);
}
}
实现将当前网页添加到用户浏览器收藏夹的功能,通常涉及浏览器特定的API调用。
// addfavorite
function addfavorite(){
if (document.all){
window.external.addFavorite('http://deographics.com/','deographics');
}else if (window.sidebar){
window.sidebar.addPanel('deographics', 'http://deographics.com/', "");
}
}
实现将当前网页设置为浏览器默认首页的功能,同样需要处理不同浏览器的兼容性问题。
// setHomepage
function setHomepage(){
if(document.all){
document.body.style.behavior = 'url(#default#homepage)';
document.body.setHomePage('http://deographics.com/');
}else if(window.sidebar){
if(window.netscape){
try{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}catch(e){
alert(" The operation was refused by browser,if you want to enable this feature, please enter in the address column 'about:config', then, change 'signed.applets.codebase_principal_support' to 'true' ");
}
}
var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref('browser.startup.homepage','http://deographics.com/');
}
}
Ajax用户验证与表单校验
利用jQuery结合Ajax技术,可以在用户输入用户名时实时向后端发送请求,判断该用户是否已存在,从而提升用户体验。
// 检测 用户名是否存在
$("#username").blur(function(){
var name = $(this).val(); var table = $(this).attr('title');
if(name!=''){
var dataString = 'username='+ name + '&table=' + table;
$.post("operate.php",dataString,function(data){ //alert(data);
if(data==0){
alert('This username already exist !'); $(this).val('').focus(); return false;
}
});
}
});
或者采用其他异步验证方式,根据具体业务需求选择。
var datastring = 'id=' + $id + '&pos=' + $pos;
$.ajax({
type: "POST",
url: url,
data: dataString,
beforeSend: function(){},
error: function(){alert('Send Error !');},
success: function(data) {
// do something
}
});
通过正则表达式判断输入的Email地址格式是否正确,是表单验证中的常见需求。
function chekemail(temail){
var pattern = /^[\w]{1}[\w\.\-_]*@[\w]{1}[\w\-_\.]*\.[\w]{2,4}$/i;
if(pattern.test(temail)){return true;}else{return false;}
}
对用户名的综合判断通常包括检查长度、是否包含英文字段以及其他特定规则,确保用户名的规范性。
// 实例
var username = $('#username');
var backValue = VerifyInput('username');
if(backValue == 'length'){
alert("Username is make up of 3 - 15 characters!");
username.focus();
return false;
}else if(backValue == 'first'){
alert("the First character must be letter or number !");
username.focus();
return false;
}else if(backValue == 'back'){
alert("Username only contains letter number or '_' ");
username.focus();
return false;
}
// 判断
function VerifyInput(user){
var strUserID = $('#'+user).val();
if (strUserID.length < 3 || strUserID.length > 15){
return 'length';
}else{
for (nIndex=0; nIndex<strUserID.length; nIndex++){
cCheck = strUserID.charAt(nIndex);
if ( nIndex==0 && ( cCheck =='-' || cCheck =='_') ){
return 'first';
}
if (!(IsDigit(cCheck) || IsAlpha(cCheck) || cCheck=='-' || cCheck=='_' )){
return 'back';
}
}
}
}
function IsDigit(cCheck) {return (('0'<=cCheck) && (cCheck<='9'));}
function IsAlpha(cCheck) {return ((('a'<=cCheck) && (cCheck<='z')) || (('A'<=cCheck) && (cCheck<='Z')))}
新闻滚动与字符串处理
实现新闻列表的自动滚动效果,可以通过定时器配合DOM操作来实现内容的上下或左右滚动展示。
<style type="text/css">
ul,li{margin:0;padding:0;font-size:12px;color:#999;}
ul{height:100px;overflow:hidden;}
ul li{line-height:20px;height:20px;}
</style>
<ul id="news">
<li>New York web design Inc.1</li>
<li>Your site will be structured 2</li>
<li>hat will communicate the 3</li>
<li>hat will communicate the 4</li>
<li>hat will communicate the 5</li>
<li>hat will communicate the 6</li>
<li>hat will communicate the 7</li>
<li>hat will communicate the 8</li>
<li>hat will communicate the 9</li>
<li>New York web design Inc. 10</li>
<li>New York web design Inc.11</li>
<li>New York web design Inc. 12</li>
<li>New York web design Inc. 13</li>
<li>New York web design Inc. 14</li>
</ul>
参考以下JavaScript代码实现新闻滚动逻辑:
// 用法 : 四个参数分别是:操作对象, 停留时间,相对速度(越小越快),每次滚动多少(最好和Li的Line-height一致)。
scroll('news', 3000, 1, 20 );
function scroll(element, delay, speed, lineHeight) {
var numpergroup = 5;
var slideBox = (typeof element == 'string')?document.getElementById(element):element;
var delay = delay||1000;
var speed=speed||20;
var lineHeight = lineHeight||20;
var tid = null, pause = false;
var liLength = slideBox.getElementsByTagName('li').length;
var lack = numpergroup-liLength%numpergroup;
for(i=0;i<lack;i++){
slideBox.appendChild(document.createElement("li"));
}
var start = function() {
tid=setInterval(slide, speed);
}
var slide = function() {
if (pause) return;
slideBox.scrollTop += 2;
if ( slideBox.scrollTop % lineHeight == 0 ) {
clearInterval(tid);
for(i=0;i<numpergroup;i++){
slideBox.appendChild(slideBox.getElementsByTagName('li')[0]);
}
slideBox.scrollTop = 0;
setTimeout(start, delay);
}
}
slideBox.onmouseover=function(){pause=true;}
slideBox.onmouseout=function(){pause=false;}
setTimeout(start, delay);
}
限制输入框仅允许输入正整数,这在购物车数量输入等场景中非常实用。
<script language="JavaScript" type="text/javascript">
function checkNum(obj){
var re = /^[1-9]\d*$/;
if (!re.test(obj.value)){
alert("只允许正整数!");
obj.value='';
obj.focus();
return false;
}
}
</script>
<input name="rate" type="text"onkeyup="checkNum(this)" />
或者允许输入正数(包括正整数和正小数),适用于价格、重量等场景。
<script language="JavaScript" type="text/javascript">
function clearNoNum(obj)
{
//先把非数字的都替换掉,除了数字和.
objobj.value = obj.value.replace(/[^\d.]/g,"");
//必须保证第一个为数字而不是.
objobj.value = obj.value.replace(/^\./g,"");
//保证只有出现一个.而没有多个.
objobj.value = obj.value.replace(/\.{2,}/g,".");
//保证.只出现一次,而不能出现两次以上
objobj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");
}
</script>
只能输入数字和小数点的文本框:<input id="input1" onkeyup="clearNoNum(this)"> 12、 转换字符串为数字
/*
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
*/
parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN
parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN
/*
还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
*/
Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Boolean(new Object()); //true – object
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56 ") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100
var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //won't work, causes an error
将字符串类型转换为数字类型,是JavaScript数据处理中的基础操作,需注意类型转换的细节。
// 用法:get_ext(this,'img');
function get_ext(name){
var pos = name.lastIndexOf('.');
var extname = name.substring(pos,name.length) // like: str.split('.')
var lastname = extname.toLowerCase();
if (lastname !='.jpg' && lastname !='.gif' && lastname !='.png' && lastname !='.bmp'){
return lastname;
}else{
return name;
}
}
}
判断文件格式通常通过获取文件名的后缀名来实现,例如识别图片、文档等不同类型。
// 简单型
<script type="text/javascript">
var str="Hello world!"
document.write(str.substr(3,7))
</script>
// 结果是 lo worl
// 复杂型(中文或者中英文混合截取)
<script>
//截取字符串 包含中文处理
//(串,长度,增加...)
function subString(str, len, hasDot)
{
var newLength = 0;
var newStr = "";
var chineseRegex = /[^\x00-\xff]/g;
var singleChar = "";
var strLength = str.replace(chineseRegex,"**").length;
for(var i = 0;i < strLength;i++)
{
singleChar = str.charAt(i).toString();
if(singleChar.match(chineseRegex) != null)
{
newLength += 2;
}
else
{
newLength++;
}
if(newLength > len)
{
break;
}
newStr += singleChar;
}
if(hasDot && strLength > len)
{
newStr += "...";
}
return newStr;
}
document.write(subString("你好,this is a test!",10,1)); // 参数依次为 字符串, 截取的长度 和 是否显示省略号
</script>
对字符串进行截取操作,可以根据指定的起始位置和长度获取子字符串。
<script type="text/javascript">
var str = 'this_is_a_test_!';
var arr = str.split('_');
document.write(arr + "<br />"); // 罗列全部
document.write(arr[0] + "<br />"); // 取单项
</script>
对字符串进行分割处理,可以根据指定的分隔符将字符串拆分为数组,便于后续数据处理。以上就是小编为大家整理的常用javascript函数,希望对大家的学习有所帮助,之后还有更多javascript常用函数分享给大家,继续关注。