当前位置:  编程技术>WEB前端
本页文章导读:
    ▪JavaScript高级程序设计学习笔记--事件(一)(事件流、事件处理程序/事件侦听器)      1、事件流事件冒泡IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。事件捕获.........
    ▪PHP,JS互相调用       1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="text/javascript" src=/blog_article/"b/action/test/quot;/gt;/lt;/script/gt;.html <script type=".........
    ▪html5 canvas 自制小游戏系列之 【贪吃蛇】。      【我理解的游戏】在我的理解里,游戏就是可以交互的动画。所以游戏的原理跟动画是差不多的。相信动画的原理大家都知道,就是通过一系列的变化来让静态的图片达到动的效果。不过游戏.........

[1]JavaScript高级程序设计学习笔记--事件(一)(事件流、事件处理程序/事件侦听器)
    来源:    发布时间: 2013-11-06

1、事件流

事件冒泡

IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

事件捕获

事件捕获的思想是不太具体的节点应该更早的接收到事件,而最具体的节点应该在最后接收到节点。事件捕获的用意在于事件到达预定目标之前捕获它。

DOM事件流

“DOM2级事件流”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件作出响应。以简单的HTML页面为例,单击<div>元素会按照下图顺序触发事件

 

 

在DOM事件流中,实际的目标(<div>元素)在捕获阶段不会接收到事件。这意味着在捕获阶段,事件从document到<html>再到<body>后就停止了。下一个阶段是“处于目标”阶段,于是事件在<div>上发生,并在事件处理中被看成冒泡阶段的一部分。然后冒泡阶段发生,事件又传播回文档。

多数支持DOM事件流的浏览器都实现了一种特定行为;即使“DOM2级事件”规范明确要求捕获阶段不会涉及事件的目标,但Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两个机会在目标对象上面操作事件。

Opera、Firefox、Chrome和Safari都支持DOM事件流;IE不支持DOM事件流。

 

2、事件处理程序(或事件侦听器)

事件是用户或浏览器自身执行的某种动作。诸如click、load和mouseover,都是事件的名字。 而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。事件处理程序的名字以“on”开头,因此click事件的事件处理程序就是onclick等。为事件指定处理程序的方式有好几种。

HTML事件处理程序

某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性指定。如:

<input type="button" value="Click me" onclick="alert('Clicked')"/>
<script type="text/javascript">
function showMessage(){
alert("Hello World!");
}
</script>
<input type="button" value="Click me" onclick="showMessage()"/>

在HTML中指定事件有两个缺点。首先,存在一个时差问题。因为用户可能在HTML元素一出现在页面上就触发相应的事件,但当时事件处理程序有可能尚不具备执行条件。例如前面的例子,假设showMessage函数在按钮下方页面最底部定义的,如果用户在页面解析showMessage函数之前就单击了按钮,就会引发报错。第二个确定是HTML与JavaScript代码紧密耦合。如果要更换事件处理程序,就要改动两个地方。

DOM0级事件处理程序

通过JavaScript指定事件处理程序的传统方式,就是讲一个函数赋值给一个事件处理程序属性。要使用JavaScript指定事件处理程序,首先必须取得一个要操作的对象的引用。

每个元素(包括window和document)都有自己的事件处理程序属性,这些属性通常小写,例如onclick。将这种属性的值设置成一个函数,就可以指定事件处理程序。

使用DOM0级方法指定的事件处理程序被认为是元素的方法,因此是在元素的作用域中运行,换句话说,程序中的this引用当前元素。

var btn = document.getElementById("myBtn");
btn.onclick = function(){
alert(this.id); //"myBtn"
};

可以在事件处理程序中通过this访问元素的任何属性和方法,以这种方式添加的事件处理程序会在事件流中的冒泡阶段被处理。

可以删除通过DOM0级方法指定的事件处理程序,只要将事件处理程序属性的值设为null即可。

btn.onclick = null; //删除事件处理程序

DOM2级事件处理程序

“DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()。所有DOM节点中都包含这两个方法,并且它们都接受三个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

与DOM0级方法一样,DOM2级方法天际的事件处理程序也是在其依附的元素的作用域中进行。使用DOM2级方法添加事件处理程序的主要好处是可以添加多个事件处理程序。来看下面的例子:

btn.addEventListener("click",function(){
alert(this.id);
},false);
btn.addEventListener("click",function(){
alert("Hello World!");
},false);

这里为按钮多添加了两个事件处理程序。这两个事件处理程序会按照添加它们的顺序触发,因此首先会显示元素ID,其次会显示“Hello World!”消息。

通过addEventListener()添加的事件处理程序只能使用removeEventListener来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数将无法移除,如下:

var btn = document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(this.id);
},false);
btn.removeEventListener("click",function(){ //没有用!
alert(this.id);
},false);
var btn = document.getElementById("myBtn");
var handler = function(){
alert(this
    
[2]PHP,JS互相调用
    来源: 互联网  发布时间: 2013-11-06

1 JS方式调用PHP文件并取得php中的值
举一个简单的例子来说明:
如在页面a.html中用下面这句调用:
<script type="text/javascript" src=/blog_article/"b/action/test/quot;/gt;/lt;/script/gt;.html
<script type="text/javascript" >
alert(jstext);
</script>
在b.php中有这样一段PHP代码:
<? $action=$_GET['action']; //echo "var jstext='$action'"; //输出一句JS语句,生成一个JS变量,并赋颠值为PHP变量 $action的值 //echo "var jstext='aa'"; echo "var jstext="."'$action'"; ?>
当执行a.html文件时,就会调用b.php文件,并将b.php文件的输出作为JS语句来执行,所以此处会弹出一个提示框,内容为JS变量jstext的值,也就是在PHP文件中赋给jstext的值.
小结:
在HTML里用JS 调用文件的方式调PHP文件,则PHP文件的输出将会被调用页作为JS的代码来用.
2 php调用js中的值
在z.php页面中有这样一段代码:
<script type="text/javascript" > var url="aaaa*"; </script> <? $key="<script type=text/javascript>document.write(url)</script>"; echo $key; ?>
3 php调用js中的方法(函数)
<script type="text/javascript"> function test() { var t1=3; t1 = t1+2; alert(t1); //return t1; } </script>
<?php echo "<script type='text/javascript'>test();</script>"; ?>
4 JS调用PHP变量
(1)
<?php
$userId=100;
?> <script>
var userId;
userId=document.getElementByIdx_x_x_x("userId").value;
alert (userId);
</script>
<input type="text" name="userId" id="userId" value="<?php echo $userId; ?>">
(2)
<?php
$url = '变化的网址'; //定义变量
?>
<script type="text/javascript">
//js调用php变量
var ds ="<?php echo $url?>" ; //赋值 alert(ds); //输出效果 </script>
5 -------------------------------
<script language="JavaScript"> <!--
var Y=<?php echo date('Y')?>,M=<?php echo date('n')?>,D=<?php echo date('j')?>;
-->
</script>
6 自己写的js和php互相调用
1.php内容:
<?php
//echo "<script LANGUAGE='javascript'>alert('$php变量');</script>"; //最简单的php调用js
//echo "<a href=#><img width=50 src='/blog_article/$fruit_pic_array[$i]/index.html' onMouseOver=’javascript:a();‘></a>";
//echo "<a href='/blog_article/3.html'>aaaa</a>"; //php中超链接
//echo "<script type='text/javascript' language='javascript'>phpmake('PHP建站学习笔记网');</script>"; //有时候需要在PHP执行过程中,需要调用JavaScript自定义函数(验证时出错)
echo "function ok(msg){alert(msg);}";
?>
<HTML>
<HEAD>
<TITLE> php调用js文件的好办法</TITLE>
</HEAD>
<BODY>
<!--js调用php中定义的js-->
<scrīpt language=''javascrīpt'' type=''text/javascrīpt'' src=''1.php''></scrīpt>
<scrīpt>
ok("aaaaaa!");
</scrīpt>
</script>
</BODY>
</HTML>
2.php内容:
<!--js调用php-->
<?php
$userId=100;
?>
<script>
var userId;
userId=document.getElementByIdx_x("userId").value;
alert (userId);
</script>
<input type="text" name="userId" id="userId" value="<?php echo $userId; ?>">
<!--js调用php-->
<?php
if($_GET["action"]=="ok")
{
echo "I'm OK!";
}
else
{
echo "I'm not OK!";
}
?>
<SCRIPT Language = "JavaScript">
function func()
{
if(confirm("Are you OK with this?"))
{
this.location = "ok.php?action=ok";
}
else
{
this.location = "ok.php?action=cancel";
}
}
</SCRIPT>
<html>
<head>
</head>
<body>
<a href=/blog_article/"/index.html href=/blog_article/"/index.html onClick="javascript:func();">Please Click</a>
</body>
</html>
<!--js调用php-->
<html>
<head>
<script>
function isMail(PostString)
{
re=//w*/
if(re.test(PostString))
{
return true;
}
else
{
return false;
}
}
function test(){
if (isMail(<?php echo $email?>))
{document.write("<?php echo "N";?>");}
else
{document.write('<?php echo 'Y';?>');}
}
</script>
</head>
<body>
<?php
$email="aa";
?>
<input type=button value=click onclick=
    
[3]html5 canvas 自制小游戏系列之 【贪吃蛇】。
    来源:    发布时间: 2013-11-06

【我理解的游戏】

在我的理解里,游戏就是可以交互的动画。所以游戏的原理跟动画是差不多的。

相信动画的原理大家都知道,就是通过一系列的变化来让静态的图片达到动的效果。

不过游戏与动画不同的是,游戏是可以交互的。也就是说,用户对游戏有一定的控制权。游戏也会根据用户的操作来反馈给用户不同的动画,当然也会记录用户在整个游戏中的表现。一般会用分数显示的反馈给用户,他在整个游戏中的表现。

大多数的canvas游戏,是通过不断的擦除canvas然后重绘被擦除的部分。并改变被擦除前那一部分的所有元素的位置或者颜色来达到动画的效果。当然也有部分游戏是根据用户的某个操作来激活某个动作。比如五子棋,就是通过用户在棋盘上的点击来添加一个新的棋子来构成游戏。

当然既然是canvas游戏,对canvas的一些API就一定要熟悉啦,不过不熟悉也没关系拉。 在游戏中用到的API我都会逐一介绍它的用法和用处。下面就正式开始进入游戏开发的过程吧。

【游戏结构】

既然是做游戏,大家可以先想一想。游戏都有哪些基本元素。简单分析一下应该有如下几点是每个游戏都共有 。

开始,暂停,结束。 这三点应该是大多游戏都有的,然后如果要整个游戏运转,肯定会对游戏里面的画面进行更新。  如此一来,就又多了一个更新。这四点应该就是游戏的基础配置了,如此一来我们就可以根据以上四点来搭建一个游戏的基本结构了。 为了以后的游戏也可以同样的使用,我把它写成了一个父函数,可以供游戏的具体函数来继承。 我称它为gamebase

。下面是gamebase函数的所有代码。

/**
* @author cat
*/

function GameBase(){
this.event = { //存储游戏事件
death : function(){},
updates : []
};
this.FPS = 1000 / 60; //游戏刷新速度
this.play = false; //是否开始
}

GameBase.prototype = {
constructor : GameBase,

//游戏更新的单步骤
step : function(){
throw new Error('此方法必须被覆盖!');
},

//是否在运行
isPlay : function(){
return this.play;
},

//添加事件
bind : function(listen, callback, time){
if(listen == 'death'){
this.event['death'] = callback;
}else if(listen == 'update'){
this.event['updates'] ? true : this.event['updates'] = [];
time || (callback.time == time, callback.timer = 0);
this.event['updates'].push(callback);
}
return this;
},

//删除事件
unbind : function(listen, fn){
if(listen == 'death'){
this.event['death'] = function(){};
}else if(listen == 'update'){
var i = 0, len = this.event.updates.length;
for(; i < len && fn == this.event.updates[i]; i++){
this.event.updates.splice(i, 1);
}
}
return this;
},

//游戏开始函数
start : function(){
var self = this;
self.startTime = new Date().getTime();
if(!self.isPlay()){ //避免重复开始
self.timer = self.timer = setInterval(function(){
self.step();
},self.FPS);
self.play = true;
}
},

//游戏停止函数
stop : function(){
this.play = false;
clearInterval(this.timer);
},

//游戏结束函数
death : function(){
this.stop();
this.event['death'].call(this);
},

//游戏更新函数
update : function(){
var updates = this.event['updates'], i = 0, len = updates.length, now = new Date().getTime(), update, time;
for(; update = updates[i], i < len; i++){
update.time ? (now - (update.timer || 0) > update.time) && (update.timer == now, update.call(this)) : update.call(this);
}
}
}

//两个工具方法
var lynx = {
extend : function(parent, child){
var fn = function(){};
fn.prototype = parent.prototype;
child.prototype = new fn();
child.prototype.constructor = child;
return
    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3