您的位置:

首页 >

腾博会官方网 >

腾博会官方网:js给onclick事件赋值,动态传参数实例解说 >

腾博会官方网:js给onclick事件赋值,动态传参数实例解说

2016-09-06 15:04:13

分类:腾博会官方网

我们先看看错误的例子 Html代码 复制代码 代码如下: <body> <input id="certid" type="text" value="123456" > <input id="btn" type="button" value="button" onclick=""> </body> Javascript代码 复制代码 代码如下: <script> function show(value) { alert(value); } btn.onclick = show(certid.value); <script> 以上代码执行起来是有错误的,因为show(certid.value)这句,直接就执行了show方法,而没有正确把这个方法对象赋给btn.onclick事件. 如果我们改成这样 复制代码 代码如下: btn.onclick = show; 参数又无法传递. 所以正确的代码应该这样写,我们加一个参数以看得更明白一些: Html代码 复制代码 代码如下: <body> <input id="certid" type="text" value="123456" > <input id="btn" type="button" value="button" onclick=""> </body> Javascript代码 复制代码 代码如下: <script> function show(value1,value2) { alert(value1+","+value2); } var i = 10; btn.onclick = function(){ show(certid.value,i); }; <script> 这样就实现了动态给onclick事件句柄赋值,

JQuery Plugin插件,如果大家不明白什么是JQuery插件或都不清楚如何编写可以查看其官方的网站:jQuery Authoring Guidelines 好了,下面有一些我觉得想做一个好的插件必须应有的要求: 1、在JQuery命名空间下声明只声明一个单独的名称 2、接受options参数,以便控制插件的行为 3、暴露插件的默认设置 ,以便外面可以访问 4、适当地将子函数提供给外部访问调用 5、保持私有函数 6、支持元数据插件 下面将逐条地过一遍: 只声明一个单独的名称 这表明是一个单独的插件脚本。如果你的脚本包含多个插件或者是互补的插件(像$.fn.doSomething()和$.undoSomething()),那么你可以根据要求声明多个名称。但一般情况下,力争用单一的名称来维持插件现实的所有细节。 在本例中,我们将声明一个叫“hilight”的名称 复制代码 代码如下: // 插件的定义 $.fn.hilight = function( options ){ // 这里就是插件的实现代码了... }; 然后我们可以像这样调用它: $("divTest").hilight(); 接受一个options参数,以便控件插件的行为 复制代码 代码如下: $.fn.hilight = function(options){ var defaults = { foreground : 'red', background : 'yellow' }; //Extends out defaults options with those privided 扩展我们默认的设置 $.extend(defaults,options); }; 而我们可以这样使用它: 复制代码 代码如下: $('#myDiv').hilight({ foreground: 'blue' }); 暴露插件的默认设置 ,以便外面可以访问 作为插件的提升和优化,我们应该将上面的代码暴露出来作为插件的默认设置。 这非常重要,这样做让使用插件的用户可以非常容易地用最少的代码重写或自定义该插件。然而这个我们可以借助JavaScript function对象的优势: 复制代码 代码如下: $.fn.hilight = function(options){ //Extend our default options with those provided //Note that the first arg to extend is an empty object //this is to keep from overriding our "defaults" object var opts = $.extend({},$.fn.hilight.defaults,options); } $.fn.hilight.defaults = { foreground : 'red', background : 'yellow' }; 这里值得注意的是$.extend()第一个参数是一个空的对象,这样可以让我们重写插件的默认设置 用户可以像这样使用插件: 复制代码 代码如下: // override plugin default foreground color $.fn.hilight.defaults.foreground = 'blue'; // ... // invoke plugin using new defaults $('.hilightDiv').hilight(); // ... // override default by passing options to plugin method $('#green').hilight({ foreground: 'green' }); 适当地将子函数提供给外部访问调用 这个例子延续前面的例子,你会发现有一个有趣的方法可以扩展你的插件(然后还可以让其他人扩展你的插件 :))。例如,我们在插件里声明了一个函数叫“format”用来高这显示文本,我们的插件实现代码可能是这样子的: 复制代码 代码如下: $.fn.hight = function(options){ //iterate and reformat each mached element return this.each(function(){ var $this = $(this); //... var markup = $this.html(); //call our format function markup = $.fn.hilight.format(markup); $this.html(markup); }); }; //define our format function $.fn.hilight.format = function(txt){ return '<strong>' + txt + '</strong>'; }; 保持私有函数 暴露插件有部分内容提供重写看上去似乎非常强大,但是你必须认真地考虑你的插件哪一部分是需要暴露出来的。一旦暴露出来,你就需要考虑这些变化点,一般情况下,如果你没有把握哪部分需要暴露出来,那么你可以不这样做。 那如何才能够定义更多的函数而不将其暴露出来呢?这个任务就交给闭包吧。为了证实,我们在插件中添加一个函数叫“debug”,这debug函数将会记录已选择的元素数量到FireBug控制台中。为了创建闭包,我们将插件定义的整部分都包装起来: 复制代码 代码如下: //create closure (function($){ //plugin definition $.fn.hilight = function(options){ debug(this); //... }; //private function for debuggin function debug($obj){ if(window.console && window.console.log){ window.console.log('hilight selection count :' + $obj.size()); } } //... //end of closure })(jQuery); 这样“debug”方法就不能被闭包这外调用了 支持元数据插件 依赖于所写的插件类型,并支持元数据插件会使得其本身更加强大。个人来讲,我喜欢元素据插件,因为它能让你分离标签中重写插件的配置(这在写demo和示例时特别有用)。最重要的是,想现实它特别的容易! 复制代码 代码如下: $.fn.hilight = function(options){ //build main options before element interation var opts = $.extend({},$.fn.hilight.defaults,options); return this.each(function(){ var $this = $(this); //build element specific options var o = $.meta ? $.extend({},opts,$this.data()) : opts; //一般句话,搞定支持元数据 功能 }); } 几行的变化完成了以下几件事: 1、检测元数据是否已经配置 2、如果已配置,将配置属性与额外的元数据进行扩展 复制代码 代码如下: <!-- markup --> <div class="hilight { background: 'red', foreground: 'white' }"> Have a nice day!这是元数据 </div> <div class="hilight { foreground: 'orange' }"> Have a nice day!在标签中配置 </div> <div class="hilight { background: 'green' }"> Have a nice day! </div> 然后我们通过一句脚本就可以根据元数据配置分开地高亮显示这些div标签: 复制代码 代码如下: $('.hilight').hilight(); 最后,将全部代码放在一起: 复制代码 代码如下: // //create closure // (function($){ // // plugin definition // $.fn.hilight = function(options){ debug(this); //build main options before element iteration var opts = $.extend({}, $.fn.hilight.defaults, options); //iterate and reformat each matched element return this.each(function(){ $this = $(this); //build element specific options var o = $.meta ? $.extend({}, opts, $this.data()) : opts; //update element styles $this.css({ backgroundColor: o.background, color: o.foreground }); var markup = $this.html(); //call our format function }); } // // private function for debugging // function debug($obj){ if(window.console && window.console.log){ window.console.log('hilight selection count: ' + $obj.size()); } }; // // define and expose our format function // $.fn.hilight.format = function(txt){ return '<strong>' + txt + '</strong>'; }; // // plugin defaults // $.fn.hilight.defaults = { foreground : 'red', background : 'yellow' }; // // end of clousure // })(jQuery); 转载请注明出处http://samlin.cnblogs.com 比较希望大家开发jquery plugin的时候可以在最后把方法开放出来 return { method1: funcion() {}, method2:

JavaScript中的所有事物都是对象:字符串、数组、数值、函数等。JS中并没有类的概念, 但我们可以利用JS的语法特征,以类的思想来创建对象。 原始方法 复制代码 代码如下: <script type="text/javascript"> var obj = new Object(); obj.name = "Koji"; //为对象添加属性 obj.age = 21; obj.showName = function(){ //为对象添加方法 alert(this.name); } obj.showAge = function(){ alert(this.age); } obj.showName(); //Koji obj.showAge(); //21 </script> 上面的方式通过new关键字生成一个对象,然后根据JS是动态语言的特性添加属性和方法,构 造一个对象。其中的this是表示调用该方法的对象。 这种方式的问题是如果需要多次创建对象,则需要重复代码多次,不利于代码的复用。 工厂方法 复制代码 代码如下: <script type="text/javascript"> function createObj(){ var obj = new Object(); //创建对象 obj.name = "Koji"; obj.age = 21; obj.showName = function(){ alert(this.name); } obj.showAge = function(){ alert(this.age); } return obj; //返回对象 } var obj1 = createObj(); var obj2 = createObj(); obj1.showName(); //Koji obj2.showAge(); //21 </script> 这种方式提高了代码重用率,还可以改变工厂方法,传入参数赋值。 复制代码 代码如下: <script type="text/javascript"> function createObj(name, age){ //构造对象时可以传入初始化参数 var obj = new Object(); //创建对象 obj.name = name; obj.age = age; obj.showName = function(){ alert(this.name); } obj.showAge = function(){ alert(this.age); } return obj; //返回对象 } var obj1 = createObj("Koji", 22); var obj2 = createObj("Luo", 21); obj1.showName(); //Koji obj1.showAge(); //22 obj2.showName(); //Luo obj2.showAge(); //21 </script> 上面的方式虽然可以提高代码的复用率,但和面向对象中类的概念相比有一个很大的缺陷。面 相对象强调对象的属性私有,而对象的方法是共享的。而上面的工厂方法创建对象的时候要为每个 对象创建各自私有的方法。同时由于为每个对象都创建逻辑相同的方法,浪费内存。改进如下 复制代码 代码如下: <span style="font-size:14px;"><script type="text/javascript"> function createObj(name, age){ var obj = new Object(); //创建对象 obj.name = name; obj.age = age; obj.showName = showName; obj.showAge = showAge; return obj; //返回对象 } function showName(){ //函数也是一个对象 alert(this.name); } function showAge(){ alert(this.age); } var obj1 = createObj("Koji", 22); var obj2 = createObj("Luo", 21); obj1.showName(); //Koji obj1.showAge(); //22 obj2.showName(); //Luo obj2.showAge(); //21 </script></span> 上面通过定义连个函数对象,解决了不同对象持有函数对象的私有问题。现在所有对象的方法都 持有上面两个函数的引用。但这么一来的话,对象的函数又和对象成了相互独立,不相干的了。这和 面向对象中特定方法属于特定类的思想不符合。 构造函数方式 复制代码 代码如下: <script type="text/javascript"> //定义一个构造函数,用来生成对应的对象,可以类比Java中的构造函数 function Person(name, age){ //当调用new Person的时候,在执行第一行代码前,先生成一个Person对象,并将对象在内存中的 //索引赋值给this关键字,此时可以通过this关键字操作新生成的对象,如下面的添加属性或方法 this.name = name; //this关键字不能少。为当前对象,即this关键字引用的对象的name属性赋值 //,实际相当于为当前对象添加name属性后,再为其name属性赋值。 this.age = age; this.showName = function(){ //为当前对象添加方法 alert(this.name); } this.showAge = function(){ alert(this.age); } //将当前对象返回给赋值符号左边的变量(不必明确使用return) } var obj1 = new Person("Koji", 22); //生成一个Person对象 var obj2 = new Person("Luo", 21); obj1.showName(); //Koji obj1.showAge(); //22 obj2.showName(); //Luo obj2.showAge(); //21 </script> 构造函数的方式和工厂方式一样,会为每个对象创建独享的函数对象。当然也可以将这些函数 对象定义在构造函数外面,这样又有了对象和方法相互独立的问题。 原型方法:该方法利用的对象的prototype属性 复制代码 代码如下: script type="text/javascript"> function Person(){} //定义一个空构造函数,且不能传递参数 //将所有的属性的方法都赋予prototype属性 Person.prototype.name = "Koji"; //添加属性 Person.prototype.age = 22; Person.prototype.showName = function(){ //添加方法 alert(this.name); } Person.prototype.showAge = function(){ alert(this.age); } var obj1 = new Person(); //生成一个Person对象 var obj2 = new Person(); obj1.showName(); //Koji obj1.showAge(); //22 obj2.showName(); //Koji obj2.showAge(); //22 </script> 当生成Person对象的时候prototype的属性都赋值给了新的对象。那么属性和方法是共享的。 该方法的问题首先是构造函数不能传参,每个新生成的对象都有默认值。其次,方法共享没有 任何问题,但是属性共享就有问题,当属性是可改变状态的对象的时候。 复制代码 代码如下: <script type="text/javascript"> function Person(){} //定义一个空构造函数,且不能传递参数 Person.prototype.age = 22; Person.prototype.array = new Array("Koji", "Luo"); Person.prototype.showAge = function(){ alert(this.age); } Person.prototype.showArray = function(){ alert(this.array); } var obj1 = new Person(); //生成一个Person对象 var obj2 = new Person(); obj1.array.push("Kyo"); //向obj1的array属性添加一个元素 obj1.showArray(); //Koji,Luo,Kyo obj2.showArray(); //Koji,Luo,Kyo </script> 上面的代码通过obj1向obj1的属性array添加元素的时候,obj2的arra属性的元素也跟着受到 影响,原因就在于obj1和obj2对象的array属性引用的是同一个Array对象,那么改变这个Array 对象,另一引用该Array对象的属性自然也会受到影响 混合的构造函数/原型方式 使用构造函数定义对象的属性,使用原型(prototype)定义对象的方法,这样就可以做到属性 私有,而方法共享。 复制代码 代码如下: <script type="text/javascript"> function Person(name, age) { this.name = name; this.age = age; this.array = new Array("Koji", "Luo"); } Person.prototype.showName = function() { alert(this.name); } Person.prototype.showArray = function() { alert(this.array); } var obj1 = new Person("Koji", 22); //生成一个Person对象 var obj2 = new Person("Luo", 21); obj1.array.push("Kyo"); //向obj1的array属性添加一个元素 obj1.showArray(); //Koji,Luo,Kyo obj1.showName(); //Koji obj2.showArray(); //Koji,Luo obj2.showName(); //Luo </script> 属性私有后,改变各自的属性不会影响别的对象。同时,方法也是由各个对象共享。在语义上, 这符合了面相对象编程的要求。 动态原型方法 复制代码 代码如下: <script type="text/javascript"> function Person(name, age) { this.name = name; this.age = age; this.array = new Array("Koji", "Luo"); //如果Person对象中的_initialized为undefined,表明还没有为Person的原型添加方法 if (typeof Person._initialized == "undefined") { Person.prototype.showName = function() { alert(this.name); } Person.prototype.showArray = function() { alert(this.array); } Person._initialized = true; //设置为true,不必再为prototype添加方法 } } var obj1 = new Person("Koji", 22); //生成一个Person对象 var obj2 = new Person("Luo", 21); obj1.array.push("Kyo"); //向obj1的array属性添加一个元素 obj1.showArray(); //Koji,Luo,Kyo obj1.showName(); //Koji obj2.showArray(); //Koji,Luo obj2.showName(); //Luo </script> 这种方法和构造函数/原型方式大同小异。只是将方法的添加放到了构造函数之中,同时在构造 函数Person上添加了一个属性用来保证if语句只能成功执行一次 在实际应用中采用最广泛的是构造函数/原型方法。动态原型方法也很流行,它在功能上和构造 函数/原型方法是等价的。不要单独使用构造函数或原型方法。

复制代码 代码如下: <input type="text"onKeyUp="this.value=this.value.replace(/[^\.\d]/g,'');if(this.value.split('.').length>2){this.value=this.value.split('.')[0]+'.'+this.value.split('.')[1]}"> 1.文本框只能输入数字代码(小数点也不能输入) 复制代码 代码如下: <inputōnkeyup="this.value=this.value.replace(/\D/g,'''')"ōnafterpaste="this.value=this.value.replace(/\D/g,'''')"> 2.只能输入数字,能输小数点. 复制代码 代码如下: <inputōnkeyup="if(isNaN(value))execCommand(''undo'')"ōnafterpaste="if(isNaN(value))execCommand(''undo'')"> <input name=txt1ōnchange="if(/\D/.test(this.value)){alert(''只能输入数字'');this.value='''';}"> 3.数字和小数点方法二 复制代码 代码如下: <input type=text t_value="" o_value=""ōnkeypress="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?$/))this.value=this.t_value;elsethis.t_value=this.value;if(this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/))this.o_value=this.value"ōnkeyup="if(!this.value.match(/^[\+\-]?\d*?\.?\d*?$/))this.value=this.t_value;elsethis.t_value=this.value;if(this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/))this.o_value=this.value"ōnblur="if(!this.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?|\.\d*?)?$/))this.value=this.o_value;else{if(this.value.match(/^\.\d+$/))this.value=0+this.value;if(this.value.match(/^\.$/))this.value=0;this.o_value=this.value}"> 4.只能输入字母和汉字 复制代码 代码如下: <input ōnkeyup="value=value.replace(/[\d]/g,'''')"onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[\d]/g,''''))"maxlength=10 name="Numbers"> 5.只能输入英文字母和数字,不能输入中文 复制代码 代码如下: <inputōnkeyup="value=value.replace(/[^\w\.\/]/ig,'''')"> 6.只能输入数字和英文 复制代码 代码如下: <inputōnKeyUp="value=value.replace(/[^\d|chun]/g,'''')"> 7.小数点后只能有最多两位(数字,中文都可输入),不能输入字母和运算符号: 复制代码 代码如下: <inputōnKeyPress="if((event.keyCode<48 ||event.keyCode>57) &&event.keyCode!=46 ||/\.\d\d$/.test(value))event.returnValue=false"> 8.小数点后只能有最多两位(数字,字母,中文都可输入),可以输入运算符号: 复制代码 代码如下: <inputōnkeyup="this.value=this.value.replace(/^(\-)*(\d+)\.(\d\d).*$/,

当调用元素 A 的 offsetParent 属性时,必须按以下算法返回元素。 以下任一条件为真时,返回 null,并停止本算法。 A 是根元素。 A 是 HTML 的 body 元素。 元素 A 的 position 属性计算值是 fixed。注 1 如果 A 是 HTML 元素 area,并且在其上级元素链中有 HTML 元素 map,返回上级元素链中距 A 最近的 HTML 元素 map,并停止本算法。注 2 如果以下任一条件为真时,返回距 A 最近的符合下述条件的上级元素,并停止本算法。 上级元素的 position 属性计算值不是 static。注 3 上级元素是 HTML 的 body 元素。注 4 A 的 position 属性计算值是 static,上级元素是 td、th 或 table。 返回 null。 前面已经提到,以上是工作草案的内容,所以与现行的浏览器不一定一致,注释如下: 注 1 Firefox 不适用;IE 6 不适用;DOCTYPE 使 IE 7 不支持 fixed 时不适用(以下简称 IE 6 模式)。 注 2 Firefox 不适用。 注 3 上级元素的 position 属性计算值是 fixed,并且 IE 6 或者 IE 6 模式不适用。 注 4 IE 7 模式中,如果元素的 position 属性计算值是 absolute 或 relative,返回元素 HTML,而不是 BODY。 总结 由此看出,获得 offsetParent 在各个浏览器中,各个浏览器的各个版本中,同一版本的不同模式中,都有不同的算法,实在有些麻烦。所以还是建议将其理解为通过 offsetParent 循环和 offsetLeft、offsetTop 可以获得控件在浏览器中的绝对位置即可。 但庆幸的是有一种常见布局在各种浏览器中 offsetParent 是一样的,那就是:外层元素 div 的 position 计算值是 relative、absolute 时,内层元素 div 的 offsetParent 总是外层元素 div。

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 腾博会官网 网站地图

联系我们

827570882

扫描二维码分享到微信