谈一谈JS和Jquery初始化的问题

今天在做一个拖拽的demo时候遇到了一个bug,我的代码和源码一模一样,但是却没有效果,经过数小时琢磨发现,是jquery初始化的问题;现在贴上我的代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	*{
		margin: 0;
		padding: 0;
	}
	#wrap{
		height: 400px;
		width: 500px;
		background: red;
		position: relative;
		left: 50%;
		top:100px;
		margin-left: -250px;
	}
    h3{
    	padding-top: 15px;
		font-size: 24px;
		font-weight: bold;
		text-align: center;
		}
	ul{ 
		width: 400px;
		left: 50%;
		margin-left: -200px;
		position:absolute; 
        margin-top: 10px;
		list-style: none;
		border-right:2px dotted green;
		border-left:2px dotted green;
	}
	ul li{
		line-height: 40px;
		border-top:2px dotted green;
		font-size: 24px;
		text-align: center;
	}
	ul li:last-child{
		border-bottom:2px dotted green;
	}
	ul li:first-child{
		color: yellow;
	}
	</style>
<script src="bootstrap/js/jquery-3.1.1.js"></script>
</head>
<body>
	<div id="wrap">
	<h3>使用拖拽更改支付宝的默认付款样式</h3>
	<ul id="card">
		<li draggable="true">招商信用卡</li>
		<li draggable="true">交通信用卡</li>
		<li draggable="true">中信信用卡</li>
		<li draggable="true">建行储蓄卡</li>
		<li draggable="true">蚂蚁花呗</li>
		<li draggable="true">余额宝</li>
		<li draggable="true">余额</li>
	</ul>
</div>
	<script type="text/javascript">
		(function(){
			var dragSrc;
			$("li").each(function(index,ele){
				ele.ondragstart=function(e){
					dragSrc=this;
          e.dataTransfer.setData('text/html', this.innerHTML);
				}
				ele.ondragover = function(e){
					e.preventDefault();
				}
				ele.ondrop = function(e){
					if(dragSrc!=this){
						dragSrc.innerHTML=this.innerHTML;
						this.innerHTML=e.dataTransfer.getData("text/html");
					}
				}
			});
		});
	</script>
</body>
</html>

下面是源码的Jquery部分:

<script>
    (function($) {
      
      var dragSrc;
      
      $('li').each(function(index, ele) {
        ele.ondragstart = function(e) {
          dragSrc = this;
          e.dataTransfer.setData('text/html', this.innerHTML);
        }
        ele.ondragover = function(e) {
          e.preventDefault();
        }
        ele.ondrop = function(e) {
          if (dragSrc!= this) {
            dragSrc.innerHTML = this.innerHTML;
            this.innerHTML = e.dataTransfer.getData('text/html');
          }
        }
      });
    })(jQuery);
    
  </script>

对比发现,我和源码最大的区别就是Jquery部分,源码最后有一个“(jQuery)",于是我在我的代码出加上这个“(jQuery)",bug解决,于是找到了问题的根源——我对js/jquery页面初始化的概念以及方法非常模糊;下面从html加载顺序首先讲一讲为什么需要初始化:

这是无初始化情况下html的加载顺序(p.s.转载自博客园--id风雨前行)

1,用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
2,浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
3,浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
4,浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
5,浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
6,服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
7,浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
8,Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
9,终于等到了</html>的到来,浏览器泪流满面……
10,等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
11,浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

初始化意思是指在html加载完之后才载入js/jquery,避免出现上述情况;

那么js和jquery的初始化方法有哪些?又有何区别?

一.js 页面加载初始化方法

// 1.在body里面写初始化方法.
<body onload='init()'>
</body>

<script type="text/javascript">
    function init(){
         // 初始化内容       
    }
</script>
// 2.window.onload=function(){}
<script type="text/javascript">
    window.onload=function(){ 
        // 初始化内容 
    }
</script> 
// 3.写初始化方法,页面顺序执行到初始化方法时初始化
<script type="text/javascript">
    function init() { 
        // 初始化内容
    }; 
    init(); 
</script>

二.jquery 页面加载初始化方法

// 1.$(function(){})
<script type="text/javascript">
    $(function() {// 初始化内容
    });  
</script>
// 2.$(document).ready(function(){})
<script type="text/javascript">
    $(document).ready(function(){  
        // 初始化内容
    });  
</script>


// ready()函数有以下三种等价的形式
function handler(){
    //这里是需要执行的代码
}

// 形式一
$(document).ready( handler );
// 形式二
$( ).ready( handler ); // 不推荐该形式
// 形式三
$( handler );
// 3.jQuery(function($){})
<script type="text/javascript">
    jQuery(function($){  
        // 初始化内容
    });  
</script>

p.s.这里很明显可以看出来源码中使用的是第三种jquery的初始化方法,不过源码是将"(jQuery)"写在函数末尾,上面方法中是写在函数开头,亲测两种方法都可以,但是要注意这里"(jQuery)"是严格区分大小写的;

最后谈一下js和jquery在初始化方面的区别:

jquery:等待页面加载完数据,以及页面部分元素(不包括图片、数据),

js:是页面全部加载完成才执行初始化加载。

猜你喜欢

转载自blog.csdn.net/qq_42209411/article/details/82777272