标签归档:JavaScript

【转载】call,apply,arguments,callee,caller介绍


//1.call 作用于的对象this是第一个参数,后面的不定长参数是作为参数传递过去的。

//2.apply 作用于的对象this是第一个参数, 第二个参数是一个数组,表示传递的所有参数

//3.arguments 表示函数调用过程中到结束之前,传递给函数的所有参数的集合, 类似于数组,但是不是数组,

//使用数组的下标方法进行访问

//arguments[0]表示第一个参数

//arguments[1]表示第二个参数

//arguments[2]表示第三个参数

//4. arguments.callee 表示当前正在执行的函数,在无名函数的递归调用时能够派上用场。

//5.arguments.callee.caller 表示当前正在执行的函数是由什么函数调用的,返回调用当前执行函数的函数的引用

//6.arguments.caller 表示调用当前函数的函数的arguments对象。



这个ie上有,ff上没有,太傻比了

原文:http://shuaigg-babysky.iteye.com/blog/737184

JavaScript函数闭包的实例程序

最近在学习JavaScript,一直感觉这个语言很诡异,和其他的语言有些不同。最近暑假期间补充知识,正好来学习一下。今天提供一个关于JavaScript中函数闭包的一个实例程序。先来解释下什么是函数闭包:

函数闭包-即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。

下面的两个实例程序的作用是给一组标签添加鼠标事件函数,当点击一个节点是,弹出一个对话框显示节点的序号。
实例一:未利用函数闭包错误的实例
var add_the_handlers=function (nodes){
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick=function(e){
alert(i);
};
}
}
add_the_handlers(document.getElementsByTagName(“div”));
实例二:利用函数闭包正确的实例
var add_the_handlers=function (nodes){
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick=function(i){
//alert(i);
return function (e){
alert(i);
};
}(i);
}
}
add_the_handlers(document.getElementsByTagName(“div”));
PS:学习笔记只用,不做深入解释(功力不够,继续修炼)。

javascript数组-DOM节点数组

最近发现JavaScript还是一门很有意思的语言,值得好好学习一下。前些天调试一个简单程序时,发现一个问题或者说自己犯了一个简单的错误。

下面我举一个简单的例子说明一下遇到的问题:

我有个HTML文档如下

tomheng
住在webfuns 趣味互联网

我想要删除里面的table节点元素,注意HTML文档中有两个以上的Table节点于是写了如下的代码。

  tb=document.getElementsByTagName("table");
  for(var i=0;i=tb.length;i++){
      document.body.removeChild(tb[i]);
  }

问题分析

有没有发现问题啊?上面的代码是没有错误的,但是就是不能实现我想要的效果,上面的代码不能删除最后一个元素。如果元素多了,你能想出他是怎样删除的吗?

我们都知道数组的复制在大多数语言中都是引用传值的,在JavaScript中也不例外,而且数组的存储结构一般都是采用栈的形式,所以上面的问题就很好解释了。tb变量实质上得到的是DOM中的Table节点数组的引用,我们在For循环中删除Table节点元素同样也会反应在tb这个数组中,这样以来,每删除一个元素数组的长度就会发生变化,根据栈结构的特点,元素自动向上弹出,所以我们使用这样的删除方式只能删除索引为奇数的元素。既然知道的了原因,那么解决起来就比较简单了。

正确代码如下:

   tb=document.getElementsByTagName("table");
  while(tb.length){
     document.body.removeChild(tb[0]);
 }
/*充分利用栈结构的特点,总是删除第一个元素,直到为空*/

WordPress外部调用插件(js方式)-Ecall插件更新至1.12.15

wordpress外部调用插件-Ecall插件主页

(1)主要更新:改变外部调用的方式

原先是在根目录下建立一个文件,外部调用这个文件来实现文章的外部调用。这种方式有很多的弊端,首先是有的虚拟机主机可能目录权限不够,导致程序不能把api.php文件拷贝至根目录,只能手动来拷贝文件。另外还可能产生安全性和效率上的问题。

现在采用的hook方式,截获url,分析如果是外部调用的url则进行处理,否则放行,由WordPress进行正常的处理。

现在的调用方式改为:

<script type=’text/javascript’ src=’http://domain/index.php?key=15e3f539603bee92e0d5c6f2718a02e3&cid=0&rows=6&len=4′></script>

或者

<script type=’text/javascript’ src=’http://domain/?key=15e3f539603bee92e0d5c6f2718a02e3&cid=0&rows=6&len=4′></script>

(2)调用代码支持使用len参数来控制标题的字符数目

Len是个可选的参数可以不添加,默认值为120个字节。截取字符支持单字节和双字节混合截取。

可以再调用的代码后面加len=?来控制标题字符的显示数目

<script type=’text/javascript’ src=’http://domain/index.php?key=15e3f539603bee92e0d5c6f2718a02e3&cid=0&rows=6&len=4′></script>

HTML5新特性学习-自定义数据

此文章属翻译作品,如果看的不通顺或者看不懂,请翻看原文!

原文链接HTML 5 data- Attributes

自定义数据属性是在HTML5中新加入的一个特性。对于规范来说,好像有点怪异–但他的确提供了一些便利。

简单来说,自定义数据属性规范规定任何以data-开头的属性都将被视为私有数据的存储区域(”私有”在这里的意思是最终用户无法看到他-他不会影响页面的布局和表现)

这允许你书写有效的HTML标记的同时,嵌入数据到你的网页中去。简单示例如下:

<li class=”user”   data-name=”John Resig”  data-city=”Bostondata-lang=”js”  data-food=”Bacon>

<b>John says:</b> <span>Hello, how are you?</span>

</li>

上面的代码完全符合HTML5的规范。对所有的javascript开发者来说这是一个很受欢迎的新特性。一直以来我们都在需求一种最好的用有效地方式添加元数据到htmL元素的方法,框架用各种不同的方式去解决这一问题。一下是两种解决方案:

1)使用HTML,但自定义DTD。

2)使用XHTML,与特定的命名空间。

The addition of this prefix completely routes around both issues (including any extra markup for validation or needing to be valid XHTML) with this effective addition.

On top of this a simple JavaScript API is presented to access these attribute values (in addition to the normal get/setAttribute):

var user = document.getElementsByTagName(“li”)[0];
var pos = 0, span = user.getElementsByTagName(“span”)[0];

var phrases = [
{name: “city“, prefix: “I am from},
{name: “food“, prefix: “I like to eat},
{name: “lang“, prefix: “I like to program in}
];

user.addEventListener( “click”, function(){
var phrase = phrases[ pos++ ];
// Use the .dataset property
span.innerHTML = phrase.prefix + user.dataset[ phrase.name ];
}, false);

这种.dataset用法看起来很像.attributes的用法(但是他只是作为key-value 对),由于现在还没浏览器实现这一DOM特性,对他的需求并不是很大-因此上面的代码可以被替代为:

span.innerHTML = phrase.prefix + user.getAttribute(“data-” + phrase.name );

我认为最令人兴奋的是我们可以在所有的浏览器去实现这些特性之前就可以使用它们。现在在你的网页上使用这种特性,那你可以很明确的知道他们在未来可以继续有效。当HTML验证完全整合到W3C的认证当中的时候,你的网站讲兼容他们(当然,假设你已经通过HTML5的验证并且正在使用HTML5的Doctype)

js方式外部调用wordpress文章插件Ecall更新1.12.7版本

js方式外部调用wordpress文章插件Ecall已更新到1.12.7版本

下载 wordpress Ecall 插件主页

更新日志

(1)调整了cid为0时的bug。修改后cid=0和隐藏分类组合可以使wordpress站外调用更灵活

目前cid有以下几种用法。

A)cid=某个分类的id

示例:

<script type=’text/javascript’ src=’http://blog.webfuns.net/api.php?key=b32154b43d6332afcb130b3a633c6ce4&cid=7&rows=6′></script>

这样可以实现站外调用某个具体分类下的文章

B)cid=0 不隐藏任何分类

<script type=’text/javascript’ src=’http://blog.webfuns.net/api.php?key=b32154b43d6332afcb130b3a633c6ce4&cid=0&rows=6′></script>

这样可以站外调用所有的分类下的文章

C)cid=0 隐藏某些分类

以趣味互联网为例:

Google(cid=1)

WordPress(cid=2)

LAMP(cid=3)

My Project(cid=4)

如果把Google隐藏了,

<script type=’text/javascript’ src=’http://blog.webfuns.net/api.php?key=b32154b43d6332afcb130b3a633c6ce4&cid=0&rows=6′></script>

这样站外调用将显示Wordpress、LAMP、My Project三个分类下的文章

如果再把Wordpress隐藏了,就显示LAMP、My Project两个分类下的文章,以此类推,如果全部隐藏了,就不会显示任何调用。

2)  增加了错误提示

3)  修复了Cache time 无法设置为空的问题

4)修复了隐藏目录不能全部同时取消的问题

5)模板中不再支持content调用

原因是大文本调用容易出现不可预测的字符,从而导致js调用出错,此外大文本的外部调用浪费系统资源且价值不是很大。