整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JS中获取元素属性的8大方法

天想聊聊在Web前端开发中经常用到的技术:获取元素属性的一系列方法【innerHTML、outerHTML、innerText 、outerText、value、text()、html(),val()】

这些方法,大家应该用过,如果让你说出它们的一些区别和联系,能答得上来吗?接下来让我们一起来温故下。

首先我们需要把它们归类下:

innerHTML、outerHTML、innerText 、outerText、value 属于原生javascript的方法。

text()、html(),val()属于jQuery中的方法。

1、innerHTML 属性

在读模式下,innerHTML属性返回与调用元素的所有子节点(包括元素、注释和文本节点)对应的 HTML 标记。在写模式下,innerHTML 会根据指定的值创建新的 DOM 树,然后用这个 DOM 树完全替换调用元素原先的所有子节点。下面是一个例子:


<div id="content">
 <p>This is a <strong>paragraph</strong> with a list following it.</p>
 <ul>
 <li>Item 1</li>
 <li>Item 2</li>
 <li>Item 3</li>
 </ul>
</div>

对于上面的<div>元素来说,它的 innerHTML 属性会返回如下字符串。


<p>This is a <strong>paragraph</strong> with a list following it.</p>
<ul>
 <li>Item 1</li>
 <li>Item 2</li>
 <li>Item 3</li>
</ul>


2、outerHTML 属性

在读模式下,outerHTML 返回调用它的元素及所有子节点的 HTML 标签。在写模式下,outerHTML 会根据指定的 HTML 字符串创建新的 DOM 子树完全替换调用元素。下面是一个例子。


<div id="content">
 <p>This is a <strong>paragraph</strong> with a list following it.</p>
 <ul>
 <li>Item 1</li>
 <li>Item 2</li>
 <li>Item 3</li>
 </ul>
</div>

如果在<div>元素上调用 outerHTML,会返回与上面相同的代码,包括<div>本身。

使用 outerHTML 属性以下面这种方式设置值:


div.outerHTML = "<p>This is a paragraph.</p>";

这行代码完成的操作与下面这些 DOM 脚本代码一样:


var p = document.createElement("p");
p.appendChild(document.createTextNode("This is a paragraph."));
div.parentNode.replaceChild(p, div);

结果,就是新创建的<p>元素会取代 DOM 树中的<div>元素。

replaceChild() 方法用新节点替换某个子节点。

语法:


node.replaceChild(newnode,oldnode)

3、innerText 属性

通过 innerText 属性可以操作元素中包含的所有文本内容,包括子文档树中的文本。在通过 innerText 读取值时,它会按照由浅入深的顺序,将子文档树中的所有文本拼接起来。在通过 innerText 写入值时,结果会删除元素的所有子节点,插入包含相应文本值的文本节点。下面是一个例子:


<div id="content">
<p>This is a <strong>paragraph</strong> with a list following it.</p>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</div>

对于这个例子中的 <div> 元素而言,其中 innerText 属性会返回下列字符串:


This is a paragraph with a list following it.
Item 1
Item 2
Item 3

使用 innerText 属性设置这个<div>元素内容,则只需一行代码:


div.innerText = "Hello world!";

执行这行代码后,页面的 HTML 代码就会变成如下所示:


<div id="content">Hello world!</div>

设置 innerText 属性移除了先前存在的所有子节点,完全改变了 DOM 树。

设置 innerText 永远只会生成当前节点的一个子文本节点,而为了确保只生成一个字文本节点,就必须要对文本进行 HTML 编码。利用这一点,可以通过 innerText 属性过滤掉 HTML 标签。方法是将 innerText 设置等于 innerText,这样就可以去掉所有 HTML 标签,比如:


div.innerText = div.innerText;

执行这行代码后,就用原来的文本内容替换了容器元素中的所有内容(包括子节点,因而也就去掉了 HTML 标签)。举个栗子:


<label id="lab">请输入北京今天空气质量:<input id="aqi-input" type="text"></label>

输出:

4、outerText 属性

除了作用范围扩大到了包含 调用它的节点之外,outerText 与innerText 基本上没有多大区别。在读取文本值时,outerText 与 innerText 的结果完全一样。但在写模式下,outerText 就完全不同了:outerText 不只是替换调用它的元素的子节点,而是会替换整个元素(包括子节点)。比如:


div.outerText = "Hello world!";

这行代码实际上相当于如下两行代码:


var text = document.createTextNode("Hello world!");
div.parentNode.replaceChild(text,div);

本质上,新的文本节点会完全取代调用 outerText 的元素。此后,该元素就从文档中被删除,无法访问。

5、value 属性

属性可设置或返回密码域的默认值。获取文本框的值。

6、text():设置或者获取所选元素的文本内容

1)无参text():

取得所有匹配元素的内容。结果是由所有匹配元素包含的文本内容组合起来的文本。返回的是一个String。

2)有参text(val):

设置所有匹配元素的文本内容,与 html() 类似, 但将编码 HTML (将 "<" 和 ">" 替换成相应的HTML实体).返回一个jquery对象。

7、html():设置或者获取所选元素的内容(包括html标记)

1)无参html():

取得第一个匹配元素的html内容。这个函数不能用于XML文档。但可以用于XHTML文档,返回的是一个String。

2)有参html(val):

设置每一个匹配元素的html内容。这个函数不能用于XML文档。但可以用于XHTML文档。返回一个jquery对象。

8、val()方法

主要用于获取表单元素的值如input, select 和 textarea。当在一个空集合上调用,它返回undefined;

1)无参 val() :

获取匹配的元素集合中第一个元素的当前值。例子:

HTML代码:


<input type="text" value="你好啊">
<input type="text" value="啊哈哈哈">
<input type="text" value="嘻嘻嘻嘻">

控制台输出:

2)有参val(val):

设置每一个匹配元素的值。返回一个jquery对象。

总结

对于这八大方法:innerHTML、outerHTML、innerText 、outerText、value、text()、html(),val()。您现在是否已经很清晰了?

我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。

原文链接:https://mp.weixin.qq.com/s/K7SyPeuZedmuj-a4HwoYfQ

作者: 前端大牛爱好者

面的表格列出了所有用于处理 HTML 和 CSS 的 jQuery 方法。

下面的方法适用于 HTML 和 XML 文档。除了:html() 方法。

方法描述
addClass()向被选元素添加一个或多个类名
after()在被选元素后插入内容
append()在被选元素的结尾插入内容
appendTo()在被选元素的结尾插入 HTML 元素
attr()设置或返回被选元素的属性/值
before()在被选元素前插入内容
clone()生成被选元素的副本
css()为被选元素设置或返回一个或多个样式属性
detach()移除被选元素(保留数据和事件)
empty()从被选元素移除所有子节点和内容
hasClass()检查被选元素是否包含指定的 class 名称
height()设置或返回被选元素的高度
html()设置或返回被选元素的内容
innerHeight()返回元素的高度(包含 padding,不包含 border)
innerWidth()返回元素的宽度(包含 padding,不包含 border)
insertAfter()在被选元素后插入 HTML 元素
insertBefore()在被选元素前插入 HTML 元素
offset()设置或返回被选元素的偏移坐标(相对于文档)
offsetParent()返回第一个定位的祖先元素
outerHeight()返回元素的高度(包含 padding 和 border)
outerWidth()返回元素的宽度(包含 padding 和 border)
position()返回元素的位置(相对于父元素)
prepend()在被选元素的开头插入内容
prependTo()在被选元素的开头插入 HTML 元素
prop()设置或返回被选元素的属性/值
remove()移除被选元素(包含数据和事件)
removeAttr()从被选元素移除一个或多个属性
removeClass()从被选元素移除一个或多个类
removeProp()移除通过 prop() 方法设置的属性
replaceAll()把被选元素替换为新的 HTML 元素
replaceWith()把被选元素替换为新的内容
scrollLeft()设置或返回被选元素的水平滚动条位置
scrollTop()设置或返回被选元素的垂直滚动条位置
text()设置或返回被选元素的文本内容
toggleClass()在被选元素中添加/移除一个或多个类之间切换
unwrap()移除被选元素的父元素
val()设置或返回被选元素的属性值(针对表单元素)
width()设置或返回被选元素的宽度
wrap()在每个被选元素的周围用 HTML 元素包裹起来
wrapAll()在所有被选元素的周围用 HTML 元素包裹起来
wrapInner()在每个被选元素的内容周围用 HTML 元素包裹起来
$.escapeSelector()转义CSS选择器中有特殊意义的字符或字符串
$.cssHooks提供了一种方法通过定义函数来获取和设置特定的CSS值

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

奖和开盲盒性质一样的都是通过ajax读取后台的随机数据。

图1 转轮盘抽奖

图2 转轮盘抽奖结果

1、转轮盘

本来是想直接绘图实现轮盘,但是没有找到怎么填充文字,只好把轮盘弄成了背景图,通常用于游戏抽道具,商城积分抽奖,公司年末员工抽奖

  1. 点击抽奖触发jquery的click事件;
  2. 通过ajax获取后台的随机数;
  3. 后台通过mt_rand得到随机奖项(角度),返回给前台;
  4. 通过jquery改变css transform、transition属性,旋转背景,也就是轮盘;

html代码

<style>
.box{
    width:500px;height:500px;border:0px solid #DDD;margin:100px;position:relative;
}
.beij{
    background:url(cjbg.jpg) no-repeat center center;width:100%;height:100%;
}
.pointer{
    cursor:pointer;position:absolute;top:50%;left:50%;margin-left:-40px;margin-top:-48px;background:url(c1.png) no-repeat center center;width:80px;height:96px;z-index:21;
}
</style>

<div  class='box' >
    <div  class='beij'></div>
    <div  class='pointer'></div>
</div>

js代码

<script>
$(document).ready(function() {
	var time=0.4;//转一圈所需时间 s
	var count=10;//默认多转几圈
	/*
	var angle=new Array();
	angle[0]=23;
	angle[1]=53;
	angle[2]=83;
	angle[3]=110;
	angle[4]=133;
	angle[5]=163;
	angle[6]=223;
	*/
	var i=1;
    $(".pointer").click(function(){ 
		$.ajax({
			url: "/public/man/index.php/api/choujiang",
			data:'',
			type: "post",
			dataType: "json",
			success: function(result) {
				//console.log(result.msg);
				$('.beij').css({'transform':"rotate("+(i*count*360+result.angle)+"deg)","transition":" All "+(time*(5+result.angle/360))+"s ease-in-out"});
				//弹窗提示
        //setTimeout("alert('"+result.msg+"');",time*1000*(5+result.angle/360));
        setTimeout("console.log('"+result.msg+"');",time*1000*(5+result.angle/360));
			}
		})
		i++;
	});
});
</script>

说明:

  1. 因为改变css进行旋转,开始的时候,直接执行了弹窗或者是console.log,这并不符合我们的要求,加入了setTimeout,在旋转完成以后,再给出提示;
  2. time*1000*(5+result.angle/360) 是总得旋转时间;

后台接口程序

    public function choujiang(){
		/*
		    id   奖品编号
			title  中奖提示
			prec  中奖概率
			angle  旋转角度
		*/
		$arr[0]=array('id'=>1,'title'=>'恭喜抽中一等奖:苹果手机一部!','prec'=>1,'angle'=>23);
		$arr[1]=array('id'=>2,'title'=>'恭喜抽中二等奖:Ipad','prec'=>2,'angle'=>68);
		$arr[2]=array('id'=>3,'title'=>'恭喜抽中三等奖:','prec'=>25,'angle'=>113);
		$arr[3]=array('id'=>4,'title'=>'恭喜抽中四等奖','prec'=>50,'angle'=>155);
		$arr[4]=array('id'=>5,'title'=>'恭喜抽中五等奖','prec'=>80,'angle'=>202);
		$arr[5]=array('id'=>6,'title'=>'恭喜抽中六等奖','prec'=>150,'angle'=>245);
		$arr[6]=array('id'=>7,'title'=>'恭喜抽中七等奖','prec'=>240,'angle'=>290);
		$arr[7]=array('id'=>8,'title'=>'获得50元优惠券,还需加油哦!','prec'=>380,'angle'=>337);

        //中奖几率求和
		$cmun=0;
		for($i=0;$i<=count($arr)-1;$i++){
			$cmun+=$arr[$i]['prec'];
		}
        //中奖随机数
        $smrand=mt_rand(1,$cmun);
        $this->getRand(1,0,$arr,count($arr),$smrand);			
	}

    public function getrand($m,$im,$arr,$count,$smrand){
		/*
		    $m  起始数
			$im  第几个数组元素
			$count  数组总得元素个数
			$arr  原始数组
			$smrand  中奖随机数
		*/

        //已经中奖
		if($smrand>=$m&&$smrand<=$arr[$im]['prec']+$m-1){
				//中奖返回
				$msg=array('msg'=>$arr[$im]['title'],'angle'=>$arr[$im]['angle'],'smrand'=>$smrand);
				exit(json_encode($msg,JSON_UNESCAPED_UNICODE));			   
		}else{
		   //最后一个不需要判断  直接返回
		   if($im+1==$count-1){
				$msg=array('msg'=>$arr[$count-1]['title'],'angle'=>$arr[$count-1]['angle'],'smrand'=>$smrand);
				exit(json_encode($msg,JSON_UNESCAPED_UNICODE));		
		   }else{
		       //起始数字
			   $start=$arr[$im]['prec']+$m;
			   //递归  再次调用数组  读取下一个数组元素
			   $this->getrand($start,$im+1,$arr,$count,$smrand);
		   }
		}
	
	}

说明:

  1. 以上概率算法采用的是所有概率求和做分母、出现的概率做分子,如果才有百分比,实现方式是一样的;
  2. 采用递归,依次判断每一次的起始数字和结束数字,中奖的随机数是否在该范围内,在,就是中得该奖项,否则没中,再判断下一个;
  3. 最后一个数组元素是不需要判断的,前边的都不是,最后一个一定就是中奖;
  4. 记录谁获得了什么奖项,应该是在后台返回数据之前,不能是前台弹窗以后通过ajax通知后台中奖信息;

2、随机抽取一个幸运员工

点击开始抽奖,单行文本框循环显示员工,抽奖按钮文字变为停止,点击停止的时候,抽中的员工显示在获奖名单。

图3 随机抽取幸运员工

html代码

<style>
body{
    background:#DDD;
}
.title{
    height:40px;line-height:40px;font-size:14px;font-weight:bold;margin:100px 0 0 100px;
}
.box{
    width:700px;height:200px;border:1px solid #EEE;border-radius:8px;background:#FFF;margin-left:100px;
}
.box li{height:30px;line-height:30px;}
.cjbtn{
    margin:10px 0 0 100px;
}
#ygname{
    padding:3px 5px;;
}

</style>
<div class='title'>获奖名单</div>
<div  class='box' >
  <ul>
  </ul>
</div>
<div class='cjbtn'><input type='text' id='ygname' /> <button id='choujiang'>开始抽奖</button></div>

js代码

<script>
    var t;
	var yuangong=new Array();
	$.ajax({
			url: "/public/man/index.php/api/yuangong",
			data:'',
			type: "post",
			dataType: "json",
			success: function(result) {
				yuangong=result.msg

			}
	})

  
$(document).ready(function() {

    $("#choujiang").click(function(){ 
		if($(this).html()=='开始抽奖'){
          if(yuangong.length>=3){
			$(this).html("停止");
			start();
		  }
		}else{
		    $(this).html("开始抽奖");
			stop();
		}
	});
});

function start() {
	num = Math.floor(Math.random() * (yuangong.length-1));
	$('#ygname').val(yuangong[num]['title']);
	t = setTimeout(start, 0);
}
function stop() {
	clearInterval(t);
	//数组中删除中奖员工信息防止重复中奖
	yuangong.splice($.inArray(yuangong[num], yuangong), 1);
	$(".box  ul").append("<li>"+$('#ygname').val()+"</li>");

}

</script>

说明:

num = Math.floor(Math.random() * (yuangong.length));

  1. yuangong.length员工数组长度;
  2. Math.random() 0到1的小数,包含0,不包含1;
  3. Math.floor 小数向下取整,可以为0;

综上:num得到的是0到数组下标的随机数。

clearInterval(t):用于停止t = setTimeout(start, 0);

后台php接口程序

    public function yuangong(){
		$yuangong[0]=array('id'=>1,'title'=>'业务部【张三】');
		$yuangong[1]=array('id'=>2,'title'=>'技术部【李四】');
		$yuangong[2]=array('id'=>3,'title'=>'技术部【逍遥】');
		$yuangong[3]=array('id'=>4,'title'=>'会计部【薛嫣】');
		$yuangong[4]=array('id'=>5,'title'=>'行政部【王五】');
		$yuangong[5]=array('id'=>6,'title'=>'行政部【王天林】');
		$yuangong[6]=array('id'=>7,'title'=>'行政部【李笑和】');

		$msg=array('msg'=>$yuangong);
		exit(json_encode($msg,JSON_UNESCAPED_UNICODE));	
	}

3、随机抽取多个幸运员工

没有想到什么效果,只是单纯地获取了随机数

html代码

<style>
body{
    background:#DDD;
}
.title{
    height:40px;line-height:40px;font-size:14px;font-weight:bold;margin:100px 0 0 100px;
}
.box{
    width:700px;height:200px;border:1px solid #EEE;border-radius:8px;background:#FFF;margin-left:100px;
}
.box li{height:30px;line-height:30px;}
.cjbtn{
    margin:10px 0 0 100px;
}
#ygname{
    padding:3px 5px;;
}

</style>
<div class='title'>获奖名单</div>
<div  class='box' >
  <ul>
  </ul>
</div>
<div class='cjbtn'> <button id='choujiang'>开始抽奖</button></div>

js代码

<script>
var yuangong=new Array();
var ygstr='';//存取获奖员工
var ygrs=5;//一次抽几个
var t;
$.ajax({
			url: "/public/man/index.php/api/yuangong",
			data:'',
			type: "post",
			dataType: "json",
			success: function(result) {
				yuangong=result.msg

			}
})

$(document).ready(function() {
    $("#choujiang").click(function(){ 
		if(yuangong.length>=ygrs){
		    start(1);
		}
	});
});

function start(ms) {
   //ms  第几次获取员工信息
   num = Math.floor(Math.random() * (yuangong.length));
   console.log(num);
   ygstr+="<li>"+yuangong[num]['title']+"</li>";
   if(ms>=ygrs){
	   $(".box  ul").html(ygstr);
	   ygstr="";
   }else{
	   yuangong.splice($.inArray(yuangong[num], yuangong), 1);
       start(ms+1);
   }
    	
}
</script>

4、在线开盲盒

需要我们点击抽奖的时候通过ajax读取后台获得的盲盒信息,直接显示到前台,前台显示同上边的,都是一样,说一下后台程序。

使用array_rand().随机获取几个数组元素

array_rand($arr,$count).用法

  1. $arr目标数组;
  2. $count随机的个数;

返回值是原数组的下标。

    public function manghe(){
	
		$goods[0]=array('id'=>1,'title'=>'手机');
		$goods[1]=array('id'=>2,'title'=>'毛绒玩具');
		$goods[2]=array('id'=>3,'title'=>'化妆品');
		$goods[3]=array('id'=>4,'title'=>'啫喱水');
		$goods[4]=array('id'=>5,'title'=>'面膜');
		$goods[5]=array('id'=>6,'title'=>'学习用品');
		$goods[6]=array('id'=>7,'title'=>'电脑');

		$getarr=array_rand($goods,3);
		$i=0;
		foreach($getarr as $k){
		    $rearr[$i]=$goods[$k];
			$i++;
		}

		$msg=array('msg'=>$rearr);
		exit(json_encode($msg,JSON_UNESCAPED_UNICODE));	
	}

如果包含特殊奖项,需要满足抽奖多少次,一定抽中,可以达到抽奖次数以后在array_rand内随机数减一,然后把大奖塞进该次抽奖的返回信息。

array_push($rearr,$a)用法:

  1. $rearr目标数组;
  2. $a追加的元素或者是数组
    $tebie[999]=array('id'=>999,'title'=>'特别大奖');
		$goods[0]=array('id'=>1,'title'=>'手机');
		$goods[1]=array('id'=>2,'title'=>'毛绒玩具');
		$goods[2]=array('id'=>3,'title'=>'化妆品');
		$goods[3]=array('id'=>4,'title'=>'啫喱水');
		$goods[4]=array('id'=>5,'title'=>'面膜');
		$goods[5]=array('id'=>6,'title'=>'学习用品');
		$goods[6]=array('id'=>7,'title'=>'电脑');

		$getarr=array_rand($goods,3);
		$i=0;
		foreach($getarr as $k){
		    $rearr[$i]=$goods[$k];
			$i++;
		}
        array_push($rearr,$tebie[999]);

        dump($rearr);

        exit;

输出结果: