相信很多同学都写过html和javascript,而由html转向javascript的第一步都少不了写script这个标签。这么简单的标签为什么还要拿来讲呢,因为它有时候非常的有用:
第一个小栗子:
<!DOCTYPE html>
<head>
<script type="text/javascript">document.write("Hello World!")</script>
</head>
<body>
</body>
</html>
这个是w3c上js入门的一个小例子,相信大家都知道运行的结果是会在网页上出现一个Hello World!;那么刨根问底,为什么它会出现一个hello world,想要知道原因,需要先了解下javascript的运行机制。
当我们用浏览器运行包含上面这段html代码的文件的时候,浏览器就会自动解析这个文件里面的代码。文件里面的代码一行行往下执行,当碰到script这个标签的时候,浏览器就会自动运行js解析器来解析下面的这段代码,当碰到</script>这个标签的时候,js解析器停止运行。
那有人可能就想了;<div>这个html是讲<script>标签用法的</div>;把这个div放网页中,这里的<script>要是被js解析器开始执行,那不就尴尬了。确实是存在这样的问题,上面这个运行的结果是<script>标签后面的内容都不显示,在编辑器中还会报错。为了将标签和文本区分开,引入了< 和 >;上面这段代码可以写成<div>这个html是讲<script>标签用法的</div>,也就是html特殊字符的转义。
js解析器在运行js脚本的过程中,碰到 var,function,document等内置的词汇后会执行相应的解析代码,像上面的document.write就会在文档中写入一个hello wrold!。
script标签自身属性:
- async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本有效。
- charset:可选。表示通过src属性指定的代码的字符集。由于大多数浏览器会忽略它的值,因此这个属性很少有人用。
- defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本有效。
- language:已废弃。
- src:可选。表示包含要执行代码的外部文件。
- type:可选。可以看成是language的替代属性;表示编写代码使用的脚本语言的内容类型(也称为MIME类型)。
最常用的也就是 src属性,也是比较有效的;
最简单的例子:在项目开发中,经常需要引入jquery文件,大多数是这样写的:<script src="./src/
jquery-1.7.2.min.js
" />,这个也是比较常见的script的引入方式,这里引入的是相对url。有时候,简单的想试试某个demo,也可以引入某个网站的jquery.min.js文件,这就是第一种方式。
script的src可以引用两种文件:
1)绝对 URL - 指向其他站点(比如 src="
http://code.jquery.com/jquery-1.7.2.min.js
")
2)相对 URL - 指向站点内的文件(比如 src="/src/
jquery-1.7.2.min.js
")
src引入某个js文件其实是将引入的那个js文件里面的内容加载到前的html或js中;利用srcript的src属性可以获取绝大多数网站的数据,而你不用担心跨域问题。看下面一段代码
<!DOCTYPE html>
<head>
<meta http-equiv="refresh" content="20">
</head>
<body></body>
<script type="text/javascript" src="http://hq.sinajs.cn/list=sh600365" charset="gb2312"></script>
<script type="text/javascript">
var tongpu=hq_str_sh600365.split(",");
console.log("tongpu", tongpu);
</script>
</html>
这个是在新浪网获取某只股票的数据,并且每20秒刷新一次页面,script也会从新加载,就能实现获取某只股票的实时价格。这里src可以换成你想要获取数据的任意网站接口,获取到数据后可以进行加工。如果这里<meta http-equiv="refresh" content="20">的content设置一个很小的值,就会频繁的请求一个网站的接口,增加该网站服务器的压力,不过一般网站都会自动屏蔽过于频繁请求的ip,防止这种DOS攻击。当然把接口写在script的src中很多时候是无奈之举。因为利用ajax请求网站更方便可控。下面是之前写的一个ajax请求
$.ajax({
type: "GET",
url: "http://hq.sinajs.cn/list=sh600365",
// data:{},//数据
async: false,//同步
dataType: 'application/x-javascript; charset=GBK',
// jsonp: 'callback',
// jsonpCallback: 'handleResponse',
success: function (response, status, xhr) {
alert(JSON.stringify(response))
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
console.log("XMLHttpRequest", XMLHttpRequest )
}
});
这种写法通常会碰到跨域问题,而这基本都需要修改服务端代码,在请求别人网站这基本是不可能实现的。所以,在这种情况下可以用script的src方法获取数据。