- 浏览: 147172 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
jackroomage:
-HashMap 类 (除了不同步和允许使用 null ...
map,set,list,等JAVA中集合解析 -
bin_1715575332:
讲得很形象,呵呵。
Spring如何实现IOC与AOP的 -
love_miaohong:
表达的很清晰!
map,set,list,等JAVA中集合解析 -
Wuaner:
引用 4,sleep必须捕获异常,而wait,notify和n ...
sleep() 和 wait() 的区别 -
javawen:
dadsdddddd
java 异常类
jQuery插件的开发包括两种:
一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。
1、类级别的插件开发
类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展:
1.1 添加一个新的全局函数
添加一个全局函数,我们只需如下定义:
Java代码
1. jQuery.foo = function() {
2. alert('This is a test. This is only a test.');
3. };
jQuery.foo = function() {
alert('This is a test. This is only a test.');
};
1.2 增加多个全局函数
添加多个全局函数,可采用如下定义:
Java代码
1. jQuery.foo = function() {
2. alert('This is a test. This is only a test.');
3. };
4. jQuery.bar = function(param) {
5. alert('This function takes a parameter, which is "' + param + '".');
6. };
7. 调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');
jQuery.foo = function() {
alert('This is a test. This is only a test.');
};
jQuery.bar = function(param) {
alert('This function takes a parameter, which is "' + param + '".');
};
调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');
1.3 使用jQuery.extend(object);
Java代码
1. jQuery.extend({
2. foo: function() {
3. alert('This is a test. This is only a test.');
4. },
5. bar: function(param) {
6. alert('This function takes a parameter, which is "' + param +'".');
7. }
8. });
jQuery.extend({
foo: function() {
alert('This is a test. This is only a test.');
},
bar: function(param) {
alert('This function takes a parameter, which is "' + param +'".');
}
});
1.4 使用命名空间
虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
Java代码
1. jQuery.myPlugin = {
2. foo:function() {
3. alert('This is a test. This is only a test.');
4. },
5. bar:function(param) {
6. alert('This function takes a parameter, which is "' + param + '".');
7. }
8. };
9. 采用命名空间的函数仍然是全局函数,调用时采用的方法:
10. $.myPlugin.foo();
11. $.myPlugin.bar('baz');
jQuery.myPlugin = {
foo:function() {
alert('This is a test. This is only a test.');
},
bar:function(param) {
alert('This function takes a parameter, which is "' + param + '".');
}
};
采用命名空间的函数仍然是全局函数,调用时采用的方法:
$.myPlugin.foo();
$.myPlugin.bar('baz');
通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。
2、对象级别的插件开发
对象级别的插件开发需要如下的两种形式:、
形式1:
Java代码
1. (function($){
2. $.fn.extend({
3. pluginName:function(opt,callback){
4. // Our plugin implementation code goes here.
5. }
6. })
7. })(jQuery);
(function($){
$.fn.extend({
pluginName:function(opt,callback){
// Our plugin implementation code goes here.
}
})
})(jQuery);
形式2:
Java代码
1. (function($) {
2. $.fn.pluginName = function() {
3. // Our plugin implementation code goes here.
4. };
5. })(jQuery);
(function($) {
$.fn.pluginName = function() {
// Our plugin implementation code goes here.
};
})(jQuery);
上面定义了一个jQuery函数,形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.
2.1 在JQuery名称空间下申明一个名字
这是一个单一插件的脚本。如果你的脚本中包含多个插件,或者互逆的插件(例如: $.fn.doSomething() 和 $.fn.undoSomething()),那么你需要声明多个函数名字。但是,通常当我们编写一个插件时,力求仅使用一个名字来包含它的所有内容。我们的示例插件命名为“highlight“
Java代码
1. $.fn.hilight = function() {
2. // Our plugin implementation code goes here.
3. };
4. 我们的插件通过这样被调用:
5. $('#myDiv').hilight();
$.fn.hilight = function() {
// Our plugin implementation code goes here.
};
我们的插件通过这样被调用:
$('#myDiv').hilight();
但是如果我们需要分解我们的实现代码为多个函数该怎么办?有很多原因:设计上的需要;这样做更容易或更易读的实现;而且这样更符合面向对象。 这真是一个麻烦事,把功能实现分解成多个函数而不增加多余的命名空间。出于认识到和利用函数是javascript中最基本的类对象,我们可以这样做。就像其他对象一样,函数可以被指定为属性。因此我们已经声明“hilight”为jQuery的属性对象,任何其他的属性或者函数我们需要暴露出来的,都可以在"hilight" 函数中被声明属性。稍后继续。
2.2 接受options参数以控制插件的行为
让我们为我们的插件添加功能指定前景色和背景色的功能。我们也许会让选项像一个options对象传递给插件函数。例如:
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. var defaults = {
4. foreground: 'red',
5. background: 'yellow'
6. };
7. // Extend our default options with those provided.
8. var opts = $.extend(defaults, options);
9. // Our plugin implementation code goes here.
10. };
11. 我们的插件可以这样被调用:
12. $('#myDiv').hilight({
13. foreground: 'blue'
14. });
// plugin definition
$.fn.hilight = function(options) {
var defaults = {
foreground: 'red',
background: 'yellow'
};
// Extend our default options with those provided.
var opts = $.extend(defaults, options);
// Our plugin implementation code goes here.
};
我们的插件可以这样被调用:
$('#myDiv').hilight({
foreground: 'blue'
});
2.3 暴露插件的默认设置
我们应该对上面代码的一种改进是暴露插件的默认设置。这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. // Extend our default options with those provided.
4. // Note that the first arg to extend is an empty object -
5. // this is to keep from overriding our "defaults" object.
6. var opts = $.extend({}, $.fn.hilight.defaults, options);
7. // Our plugin implementation code goes here.
8. };
9. // plugin defaults - added as a property on our plugin function
10. $.fn.hilight.defaults = {
11. foreground: 'red',
12. background: 'yellow'
13. };
14. 现在使用者可以包含像这样的一行在他们的脚本里:
15. //这个只需要调用一次,且不一定要在ready块中调用
16. $.fn.hilight.defaults.foreground = 'blue';
17. 接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:
18. $('#myDiv').hilight();
// plugin definition
$.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);
// Our plugin implementation code goes here.
};
// plugin defaults - added as a property on our plugin function
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
现在使用者可以包含像这样的一行在他们的脚本里:
//这个只需要调用一次,且不一定要在ready块中调用
$.fn.hilight.defaults.foreground = 'blue';
接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:
$('#myDiv').hilight();
如你所见,我们允许使用者写一行代码在插件的默认前景色。而且使用者仍然在需要的时候可以有选择的覆盖这些新的默认值:
// 覆盖插件缺省的背景颜色
$.fn.hilight.defaults.foreground = 'blue';
// ...
// 使用一个新的缺省设置调用插件
$('.hilightDiv').hilight();
// ...
// 通过传递配置参数给插件方法来覆盖缺省设置
$('#green').hilight({
foreground: 'green'
});
2.4 适当的暴露一些函数
这段将会一步一步对前面那段代码通过有意思的方法扩展你的插件(同时让其他人扩展你的插件)。例如,我们插件的实现里面可以定义一个名叫"format"的函数来格式化高亮文本。我们的插件现在看起来像这样,默认的format方法的实现部分在hiligth函数下面。
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. // iterate and reformat each matched element
4. return this.each(function() {
5. var $this = $(this);
6. // ...
7. var markup = $this.html();
8. // call our format function
9. markup = $.fn.hilight.format(markup);
10. $this.html(markup);
11. });
12. };
13. // define our format function
14. $.fn.hilight.format = function(txt) {
15. return '<strong>' + txt + '</strong>';
16. };
// plugin definition
$.fn.hilight = function(options) {
// iterate and reformat each matched 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>';
};
我们很容易的支持options对象中的其他的属性通过允许一个回调函数来覆盖默认的设置。这是另外一个出色的方法来修改你的插件。这里展示的技巧是进一步有效的暴露format函数进而让他能被重新定义。通过这技巧,是其他人能够传递他们自己设置来覆盖你的插件,换句话说,这样其他人也能够为你的插件写插件。
考虑到这个篇文章中我们建立的无用的插件,你也许想知道究竟什么时候这些会有用。一个真实的例子是Cycle插件.这个Cycle插件是一个滑动显示插件,他能支持许多内部变换作用到滚动,滑动,渐变消失等。但是实际上,没有办法定义也许会应用到滑动变化上每种类型的效果。那是这种扩展性有用的地方。 Cycle插件对使用者暴露"transitions"对象,使他们添加自己变换定义。插件中定义就像这样:
$.fn.cycle.transitions = {
// ...
};
这个技巧使其他人能定义和传递变换设置到Cycle插件。
2.5 保持私有函数的私有性
这种技巧暴露你插件一部分来被覆盖是非常强大的。但是你需要仔细思考你实现中暴露的部分。一但被暴露,你需要在头脑中保持任何对于参数或者语义的改动也许会破坏向后的兼容性。一个通理是,如果你不能肯定是否暴露特定的函数,那么你也许不需要那样做。
那么我们怎么定义更多的函数而不搅乱命名空间也不暴露实现呢?这就是闭包的功能。为了演示,我们将会添加另外一个“debug”函数到我们的插件中。这个 debug函数将为输出被选中的元素格式到firebug控制台。为了创建一个闭包,我们将包装整个插件定义在一个函数中。
Java代码
1. (function($) {
2. // plugin definition
3. $.fn.hilight = function(options) {
4. debug(this);
5. // ...
6. };
7. // private function for debugging
8. function debug($obj) {
9. if (window.console && window.console.log)
10. window.console.log('hilight selection count: ' + $obj.size());
11. };
12. // ...
13. })(jQuery);
(function($) {
// plugin definition
$.fn.hilight = function(options) {
debug(this);
// ...
};
// private function for debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
// ...
})(jQuery);
我们的“debug”方法不能从外部闭包进入,因此对于我们的实现是私有的。
2.6 支持Metadata插件
在你正在写的插件的基础上,添加对Metadata插件的支持能使他更强大。个人来说,我喜欢这个Metadata插件,因为它让你使用不多的"markup”覆盖插件的选项(这非常有用当创建例子时)。而且支持它非常简单。更新:注释中有一点优化建议。
Java代码
1. $.fn.hilight = function(options) {
2. // ...
3. // build main options before element iteration
4. var opts = $.extend({}, $.fn.hilight.defaults, options);
5. return this.each(function() {
6. var $this = $(this);
7. // build element specific options
8. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
9. //...
$.fn.hilight = function(options) {
// ...
// build main options before element iteration
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;
//...
这些变动行做了一些事情:它是测试Metadata插件是否被安装如果它被安装了,它能扩展我们的options对象通过抽取元数据这行作为最后一个参数添加到JQuery.extend,那么它将会覆盖任何其它选项设置。现在我们能从"markup”处驱动行为,如果我们选择了“markup”:
调用的时候可以这样写: jQuery.foo(); 或 $.foo();
Java代码
1. <!-- markup -->
2. <div class="hilight { background: 'red', foreground: 'white' }">
3. Have a nice day!
4. </div>
5. <div class="hilight { foreground: 'orange' }">
6. Have a nice day!
7. </div>
8. <div class="hilight { background: 'green' }">
9. Have a nice day!
10. </div>
11. 现在我们能高亮哪些div仅使用一行脚本:
12. $('.hilight').hilight();
<!-- 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();
2.7 整合
下面使我们的例子完成后的代码:
Java代码
1. // 创建一个闭包
2. (function($) {
3. // 插件的定义
4. $.fn.hilight = function(options) {
5. debug(this);
6. // build main options before element iteration
7. var opts = $.extend({}, $.fn.hilight.defaults, options);
8. // iterate and reformat each matched element
9. return this.each(function() {
10. $this = $(this);
11. // build element specific options
12. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
13. // update element styles
14. $this.css({
15. backgroundColor: o.background,
16. color: o.foreground
17. });
18. var markup = $this.html();
19. // call our format function
20. markup = $.fn.hilight.format(markup);
21. $this.html(markup);
22. });
23. };
24. // 私有函数:debugging
25. function debug($obj) {
26. if (window.console && window.console.log)
27. window.console.log('hilight selection count: ' + $obj.size());
28. };
29. // 定义暴露format函数
30. $.fn.hilight.format = function(txt) {
31. return '<strong>' + txt + '</strong>';
32. };
33. // 插件的defaults
34. $.fn.hilight.defaults = {
35. foreground: 'red',
36. background: 'yellow'
37. };
38. // 闭包结束
39. })(jQuery);
// 创建一个闭包
(function($) {
// 插件的定义
$.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
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};
// 私有函数:debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
// 定义暴露format函数
$.fn.hilight.format = function(txt) {
return '<strong>' + txt + '</strong>';
};
// 插件的defaults
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
// 闭包结束
})(jQuery);
这段设计已经让我创建了强大符合规范的插件。我希望它能让你也能做到。
3、总结
jQuery为开发插件提拱了两个方法,分别是:
jQuery.fn.extend(object); 给jQuery对象添加方法。
jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。
3.1 jQuery.fn.extend(object);
fn 是什么东西呢。查看jQuery代码,就不难发现。
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {//....
//......
};
原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1") 会生成一个 jQuery类的实例。
jQuery.fn.extend(object); 对jQuery.prototype进得扩展,就是为jQuery类添加“成员函数”。jQuery类的实例可以使用这个“成员函数”。
比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:
$.fn.extend({
alertWhileClick:function(){
$(this).click(function(){
alert($(this).val());
});
}
});
$("#input1").alertWhileClick(); //页面上为:<input id="input1" type="text"/>
$("#input1") 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。
3.2 jQuery.extend(object);
为jQuery类添加添加类方法,可以理解为添加静态方法。如:
$.extend({
add:function(a,b){return a+b;}
});
便为 jQuery 添加一个为 add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,$.add(3,4); //return 7
一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。
1、类级别的插件开发
类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展:
1.1 添加一个新的全局函数
添加一个全局函数,我们只需如下定义:
Java代码
1. jQuery.foo = function() {
2. alert('This is a test. This is only a test.');
3. };
jQuery.foo = function() {
alert('This is a test. This is only a test.');
};
1.2 增加多个全局函数
添加多个全局函数,可采用如下定义:
Java代码
1. jQuery.foo = function() {
2. alert('This is a test. This is only a test.');
3. };
4. jQuery.bar = function(param) {
5. alert('This function takes a parameter, which is "' + param + '".');
6. };
7. 调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');
jQuery.foo = function() {
alert('This is a test. This is only a test.');
};
jQuery.bar = function(param) {
alert('This function takes a parameter, which is "' + param + '".');
};
调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');
1.3 使用jQuery.extend(object);
Java代码
1. jQuery.extend({
2. foo: function() {
3. alert('This is a test. This is only a test.');
4. },
5. bar: function(param) {
6. alert('This function takes a parameter, which is "' + param +'".');
7. }
8. });
jQuery.extend({
foo: function() {
alert('This is a test. This is only a test.');
},
bar: function(param) {
alert('This function takes a parameter, which is "' + param +'".');
}
});
1.4 使用命名空间
虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
Java代码
1. jQuery.myPlugin = {
2. foo:function() {
3. alert('This is a test. This is only a test.');
4. },
5. bar:function(param) {
6. alert('This function takes a parameter, which is "' + param + '".');
7. }
8. };
9. 采用命名空间的函数仍然是全局函数,调用时采用的方法:
10. $.myPlugin.foo();
11. $.myPlugin.bar('baz');
jQuery.myPlugin = {
foo:function() {
alert('This is a test. This is only a test.');
},
bar:function(param) {
alert('This function takes a parameter, which is "' + param + '".');
}
};
采用命名空间的函数仍然是全局函数,调用时采用的方法:
$.myPlugin.foo();
$.myPlugin.bar('baz');
通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。
2、对象级别的插件开发
对象级别的插件开发需要如下的两种形式:、
形式1:
Java代码
1. (function($){
2. $.fn.extend({
3. pluginName:function(opt,callback){
4. // Our plugin implementation code goes here.
5. }
6. })
7. })(jQuery);
(function($){
$.fn.extend({
pluginName:function(opt,callback){
// Our plugin implementation code goes here.
}
})
})(jQuery);
形式2:
Java代码
1. (function($) {
2. $.fn.pluginName = function() {
3. // Our plugin implementation code goes here.
4. };
5. })(jQuery);
(function($) {
$.fn.pluginName = function() {
// Our plugin implementation code goes here.
};
})(jQuery);
上面定义了一个jQuery函数,形参是$,函数定义完成之后,把jQuery这个实参传递进去.立即调用执行。这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.
2.1 在JQuery名称空间下申明一个名字
这是一个单一插件的脚本。如果你的脚本中包含多个插件,或者互逆的插件(例如: $.fn.doSomething() 和 $.fn.undoSomething()),那么你需要声明多个函数名字。但是,通常当我们编写一个插件时,力求仅使用一个名字来包含它的所有内容。我们的示例插件命名为“highlight“
Java代码
1. $.fn.hilight = function() {
2. // Our plugin implementation code goes here.
3. };
4. 我们的插件通过这样被调用:
5. $('#myDiv').hilight();
$.fn.hilight = function() {
// Our plugin implementation code goes here.
};
我们的插件通过这样被调用:
$('#myDiv').hilight();
但是如果我们需要分解我们的实现代码为多个函数该怎么办?有很多原因:设计上的需要;这样做更容易或更易读的实现;而且这样更符合面向对象。 这真是一个麻烦事,把功能实现分解成多个函数而不增加多余的命名空间。出于认识到和利用函数是javascript中最基本的类对象,我们可以这样做。就像其他对象一样,函数可以被指定为属性。因此我们已经声明“hilight”为jQuery的属性对象,任何其他的属性或者函数我们需要暴露出来的,都可以在"hilight" 函数中被声明属性。稍后继续。
2.2 接受options参数以控制插件的行为
让我们为我们的插件添加功能指定前景色和背景色的功能。我们也许会让选项像一个options对象传递给插件函数。例如:
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. var defaults = {
4. foreground: 'red',
5. background: 'yellow'
6. };
7. // Extend our default options with those provided.
8. var opts = $.extend(defaults, options);
9. // Our plugin implementation code goes here.
10. };
11. 我们的插件可以这样被调用:
12. $('#myDiv').hilight({
13. foreground: 'blue'
14. });
// plugin definition
$.fn.hilight = function(options) {
var defaults = {
foreground: 'red',
background: 'yellow'
};
// Extend our default options with those provided.
var opts = $.extend(defaults, options);
// Our plugin implementation code goes here.
};
我们的插件可以这样被调用:
$('#myDiv').hilight({
foreground: 'blue'
});
2.3 暴露插件的默认设置
我们应该对上面代码的一种改进是暴露插件的默认设置。这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. // Extend our default options with those provided.
4. // Note that the first arg to extend is an empty object -
5. // this is to keep from overriding our "defaults" object.
6. var opts = $.extend({}, $.fn.hilight.defaults, options);
7. // Our plugin implementation code goes here.
8. };
9. // plugin defaults - added as a property on our plugin function
10. $.fn.hilight.defaults = {
11. foreground: 'red',
12. background: 'yellow'
13. };
14. 现在使用者可以包含像这样的一行在他们的脚本里:
15. //这个只需要调用一次,且不一定要在ready块中调用
16. $.fn.hilight.defaults.foreground = 'blue';
17. 接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:
18. $('#myDiv').hilight();
// plugin definition
$.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);
// Our plugin implementation code goes here.
};
// plugin defaults - added as a property on our plugin function
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
现在使用者可以包含像这样的一行在他们的脚本里:
//这个只需要调用一次,且不一定要在ready块中调用
$.fn.hilight.defaults.foreground = 'blue';
接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:
$('#myDiv').hilight();
如你所见,我们允许使用者写一行代码在插件的默认前景色。而且使用者仍然在需要的时候可以有选择的覆盖这些新的默认值:
// 覆盖插件缺省的背景颜色
$.fn.hilight.defaults.foreground = 'blue';
// ...
// 使用一个新的缺省设置调用插件
$('.hilightDiv').hilight();
// ...
// 通过传递配置参数给插件方法来覆盖缺省设置
$('#green').hilight({
foreground: 'green'
});
2.4 适当的暴露一些函数
这段将会一步一步对前面那段代码通过有意思的方法扩展你的插件(同时让其他人扩展你的插件)。例如,我们插件的实现里面可以定义一个名叫"format"的函数来格式化高亮文本。我们的插件现在看起来像这样,默认的format方法的实现部分在hiligth函数下面。
Java代码
1. // plugin definition
2. $.fn.hilight = function(options) {
3. // iterate and reformat each matched element
4. return this.each(function() {
5. var $this = $(this);
6. // ...
7. var markup = $this.html();
8. // call our format function
9. markup = $.fn.hilight.format(markup);
10. $this.html(markup);
11. });
12. };
13. // define our format function
14. $.fn.hilight.format = function(txt) {
15. return '<strong>' + txt + '</strong>';
16. };
// plugin definition
$.fn.hilight = function(options) {
// iterate and reformat each matched 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>';
};
我们很容易的支持options对象中的其他的属性通过允许一个回调函数来覆盖默认的设置。这是另外一个出色的方法来修改你的插件。这里展示的技巧是进一步有效的暴露format函数进而让他能被重新定义。通过这技巧,是其他人能够传递他们自己设置来覆盖你的插件,换句话说,这样其他人也能够为你的插件写插件。
考虑到这个篇文章中我们建立的无用的插件,你也许想知道究竟什么时候这些会有用。一个真实的例子是Cycle插件.这个Cycle插件是一个滑动显示插件,他能支持许多内部变换作用到滚动,滑动,渐变消失等。但是实际上,没有办法定义也许会应用到滑动变化上每种类型的效果。那是这种扩展性有用的地方。 Cycle插件对使用者暴露"transitions"对象,使他们添加自己变换定义。插件中定义就像这样:
$.fn.cycle.transitions = {
// ...
};
这个技巧使其他人能定义和传递变换设置到Cycle插件。
2.5 保持私有函数的私有性
这种技巧暴露你插件一部分来被覆盖是非常强大的。但是你需要仔细思考你实现中暴露的部分。一但被暴露,你需要在头脑中保持任何对于参数或者语义的改动也许会破坏向后的兼容性。一个通理是,如果你不能肯定是否暴露特定的函数,那么你也许不需要那样做。
那么我们怎么定义更多的函数而不搅乱命名空间也不暴露实现呢?这就是闭包的功能。为了演示,我们将会添加另外一个“debug”函数到我们的插件中。这个 debug函数将为输出被选中的元素格式到firebug控制台。为了创建一个闭包,我们将包装整个插件定义在一个函数中。
Java代码
1. (function($) {
2. // plugin definition
3. $.fn.hilight = function(options) {
4. debug(this);
5. // ...
6. };
7. // private function for debugging
8. function debug($obj) {
9. if (window.console && window.console.log)
10. window.console.log('hilight selection count: ' + $obj.size());
11. };
12. // ...
13. })(jQuery);
(function($) {
// plugin definition
$.fn.hilight = function(options) {
debug(this);
// ...
};
// private function for debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
// ...
})(jQuery);
我们的“debug”方法不能从外部闭包进入,因此对于我们的实现是私有的。
2.6 支持Metadata插件
在你正在写的插件的基础上,添加对Metadata插件的支持能使他更强大。个人来说,我喜欢这个Metadata插件,因为它让你使用不多的"markup”覆盖插件的选项(这非常有用当创建例子时)。而且支持它非常简单。更新:注释中有一点优化建议。
Java代码
1. $.fn.hilight = function(options) {
2. // ...
3. // build main options before element iteration
4. var opts = $.extend({}, $.fn.hilight.defaults, options);
5. return this.each(function() {
6. var $this = $(this);
7. // build element specific options
8. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
9. //...
$.fn.hilight = function(options) {
// ...
// build main options before element iteration
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;
//...
这些变动行做了一些事情:它是测试Metadata插件是否被安装如果它被安装了,它能扩展我们的options对象通过抽取元数据这行作为最后一个参数添加到JQuery.extend,那么它将会覆盖任何其它选项设置。现在我们能从"markup”处驱动行为,如果我们选择了“markup”:
调用的时候可以这样写: jQuery.foo(); 或 $.foo();
Java代码
1. <!-- markup -->
2. <div class="hilight { background: 'red', foreground: 'white' }">
3. Have a nice day!
4. </div>
5. <div class="hilight { foreground: 'orange' }">
6. Have a nice day!
7. </div>
8. <div class="hilight { background: 'green' }">
9. Have a nice day!
10. </div>
11. 现在我们能高亮哪些div仅使用一行脚本:
12. $('.hilight').hilight();
<!-- 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();
2.7 整合
下面使我们的例子完成后的代码:
Java代码
1. // 创建一个闭包
2. (function($) {
3. // 插件的定义
4. $.fn.hilight = function(options) {
5. debug(this);
6. // build main options before element iteration
7. var opts = $.extend({}, $.fn.hilight.defaults, options);
8. // iterate and reformat each matched element
9. return this.each(function() {
10. $this = $(this);
11. // build element specific options
12. var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
13. // update element styles
14. $this.css({
15. backgroundColor: o.background,
16. color: o.foreground
17. });
18. var markup = $this.html();
19. // call our format function
20. markup = $.fn.hilight.format(markup);
21. $this.html(markup);
22. });
23. };
24. // 私有函数:debugging
25. function debug($obj) {
26. if (window.console && window.console.log)
27. window.console.log('hilight selection count: ' + $obj.size());
28. };
29. // 定义暴露format函数
30. $.fn.hilight.format = function(txt) {
31. return '<strong>' + txt + '</strong>';
32. };
33. // 插件的defaults
34. $.fn.hilight.defaults = {
35. foreground: 'red',
36. background: 'yellow'
37. };
38. // 闭包结束
39. })(jQuery);
// 创建一个闭包
(function($) {
// 插件的定义
$.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
markup = $.fn.hilight.format(markup);
$this.html(markup);
});
};
// 私有函数:debugging
function debug($obj) {
if (window.console && window.console.log)
window.console.log('hilight selection count: ' + $obj.size());
};
// 定义暴露format函数
$.fn.hilight.format = function(txt) {
return '<strong>' + txt + '</strong>';
};
// 插件的defaults
$.fn.hilight.defaults = {
foreground: 'red',
background: 'yellow'
};
// 闭包结束
})(jQuery);
这段设计已经让我创建了强大符合规范的插件。我希望它能让你也能做到。
3、总结
jQuery为开发插件提拱了两个方法,分别是:
jQuery.fn.extend(object); 给jQuery对象添加方法。
jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法。
3.1 jQuery.fn.extend(object);
fn 是什么东西呢。查看jQuery代码,就不难发现。
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {//....
//......
};
原来 jQuery.fn = jQuery.prototype.对prototype肯定不会陌生啦。虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1") 会生成一个 jQuery类的实例。
jQuery.fn.extend(object); 对jQuery.prototype进得扩展,就是为jQuery类添加“成员函数”。jQuery类的实例可以使用这个“成员函数”。
比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:
$.fn.extend({
alertWhileClick:function(){
$(this).click(function(){
alert($(this).val());
});
}
});
$("#input1").alertWhileClick(); //页面上为:<input id="input1" type="text"/>
$("#input1") 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。
3.2 jQuery.extend(object);
为jQuery类添加添加类方法,可以理解为添加静态方法。如:
$.extend({
add:function(a,b){return a+b;}
});
便为 jQuery 添加一个为 add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,$.add(3,4); //return 7
- jQuery插件开发.pdf (92.6 KB)
- 下载次数: 0
发表评论
-
Javascript Function()扩展(转)
2011-08-31 16:17 976Javascript Function()扩展 1、概述 ... -
全世界最短的IE判定()
2010-04-30 13:32 584以前最短的IE判定借助于IE不支持垂直制表符的特性搞出来的。 ... -
JavaScript高级培训-自定义对象(转载)
2010-04-29 11:18 643一,概述 在Java语言中,我们可以定义自己的类,并 ... -
用javascript怎么取到当前月第一天、最后一天,本周第一天、最后一天(转)
2010-04-26 16:27 1858<script language=javascrip ... -
Javascript继承(转)
2010-03-07 11:19 573Javascript本身是从Perl语 ... -
JavaScript高效去掉数组中的重复元素
2010-03-02 21:32 867function unique(data){ data = ... -
JS 中面向对象的5钟写法
2010-01-15 15:15 861JS 中面向对象的5钟写法 //第1种写法 func ...
相关推荐
### jQuery插件开发全解析知识点 #### 1. jQuery插件开发概述 在jQuery插件开发中,开发者可以创建两种类型的插件:类级别的插件和对象级别的插件。类级别的插件允许开发者为jQuery对象添加新的全局函数,类似于在...
在《jQuery插件开发全解析.pdf》这份文档中,作者可能详细阐述了插件开发的各个步骤,包括如何封装私有函数、如何处理回调函数、如何利用jQuery的data方法存储插件状态,以及如何优化性能。此外,还可能涉及如何与...
内容概要:本文详细介绍了A*搜索算法和DWA(动态窗口法)算法的基本原理及其在机器人路径规划中的融合应用。A*算法用于全局路径规划,通过启发式搜索找到从起点到目标点的最短路径;DWA算法则专注于局部动态环境下的实时避障,确保机器人在移动过程中能够灵活避开障碍物。两者结合可以在复杂环境中提供高效的路径规划解决方案。文中提供了详细的Python代码实现,帮助读者理解和实践这两种算法的融合方法。 适合人群:对机器人路径规划感兴趣的初学者和技术爱好者,尤其是有一定编程基础的小白。 使用场景及目标:适用于需要在静态和动态环境中进行路径规划的机器人项目。主要目标是使机器人能够在复杂环境中安全、高效地到达目标位置,同时避免障碍物。具体应用场景包括但不限于室内导航、无人驾驶车辆等。 其他说明:文章不仅讲解了理论知识,还给出了具体的代码实现和调试技巧,如启发函数的选择、速度空间采样的优化、评分权重的调整等。此外,还提到了一些常见问题及解决方法,如机器人在遇到突发情况时的行为调整。
ELK日志架构部署与应用指南:构建高效、可靠的日志管理与分析系统 本指南全面介绍ELK(Elasticsearch、Logstash、Kibana)日志架构的部署实践与优化策略,旨在帮助技术团队构建可扩展、高容错的日志处理平台。内容涵盖ELK核心组件(Filebeat、Logstash、Kafka、Elasticsearch、Kibana)的工作原理、架构设计、配置案例及最佳实践,重点解析以下关键内容: ● 架构选型与演进:从基础架构到分布式集群,对比单节点、轻量级(Filebeat+Logstash)及引入Kafka的高可用架构优劣,指导根据实际场景选择合适的部署模型。 ● 组件深度解析:详细讲解Filebeat轻量级采集、Logstash灵活处理、Kafka消息缓冲、Elasticsearch分布式索引及Kibana可视化分析的实现机制与性能调优。 ● 日志规范与实战:明确日志打印格式标准(时间、级别、组件、用户信息等),结合配置示例(如Nginx日志采集到Kafka的动态Topic生成)演示数据流转全过程。 ● 运维与扩展:涵盖集群高可用设计、负载均衡策略、日志实时监控及异常报警机制,为系统稳定性与后续扩展提供完整解决方案。 本指南适合日志管理需求的中大型企业技术团队,可作为从架构设计到落地实施的实操手册,助力提升日志分析效率与系统运维能力。
内容概要:本文详细介绍了基于T型三电平逆变器的虚拟同步机(VSG)控制技术,涵盖VSG的核心算法、中点电位平衡策略以及LCL滤波器的双闭环控制设计。首先探讨了VSG控制的基本原理,包括虚拟惯量和阻尼特性的模拟,以及有功-频率和无功-电压下垂控制的具体实现。针对T型三电平拓扑特有的中点电位漂移问题,提出了多种平衡控制方法。对于LCL滤波器,讨论了其参数设计和双闭环控制策略,特别是电流环PI参数的选择和避免谐振的方法。文中还提供了多个实用的经验公式和调试技巧,并引用了相关领域的权威文献作为理论支持。 适合人群:从事电力电子、新能源并网系统研究和开发的技术人员,尤其是有一定电力电子基础的研发人员。 使用场景及目标:适用于需要深入了解和掌握VSG控制技术和LCL滤波器设计的研究人员和技术开发者。主要目标是帮助读者理解和实现T型三电平逆变器的VSG控制,提高系统的稳定性和性能。 其他说明:文中不仅提供了详细的理论解释,还有具体的代码实现和调试建议,便于读者进行实际操作和验证。同时强调了调试过程中需要注意的安全事项和常见问题的解决方案。
内容概要:本文介绍了Go语言(又称Golang)的特点、应用场景和发展背景。Go语言由Google团队于2007年设计,2009年发布,以其简洁的语法、高效的编译性能和强大的并发支持著称。它摒弃了复杂的面向对象特性,采用接口和组合的方式实现代码复用。作为编译型语言,Go语言通过严格的类型检查确保代码质量,并内置了高效的垃圾回收机制。Go语言广泛应用于服务器端开发、云计算和微服务架构等领域,如Google、Docker和Uber等公司均采用Go语言构建后端服务。此外,Go语言拥有丰富的学习资源,包括官方文档、社区支持以及权威书籍和在线课程。; 适合人群:对编程有一定了解,特别是对高性能后端开发感兴趣的开发者。; 使用场景及目标:①希望掌握一门适用于服务器端开发、云计算和微服务架构的编程语言;②想深入了解并发编程和支持高并发场景的开发技术。; 其他说明:学习Go语言不仅可以提升编程技能,还能借助其活跃的社区和丰富的学习资源,快速适应现代互联网应用开发的需求。
Ollama0.6.2安装文件-2
内容概要:本文详细介绍了Java并发编程中的多个重要概念和技术,包括CountDownLatch、CyclicBarrier、Semaphore等同步工具类,深入探讨了线程的创建方式、运行状态及线程安全问题。文章还讲解了原子性、可见性、有序性三大特性及其解决方案,如锁机制和原子类的应用。此外,文中对比了悲观锁和乐观锁的特点与适用场景,并阐述了线程池的核心参数配置。最后,简要介绍了Spring框架的核心技术,如IOC、AOP及事务管理的基本概念。 适合人群:具备一定Java编程基础,尤其是对并发编程和Spring框架有一定了解的研发人员。 使用场景及目标:①帮助开发者理解Java并发编程中的同步工具类、线程管理及线程安全问题;②指导开发者在实际项目中选择合适的锁机制和线程池配置;③加深对Spring框架中IOC、AOP及事务管理的理解,提升开发效率。 其他说明:本文不仅提供了理论知识,还结合了代码示例,便于读者理解和实践。建议读者在学习过程中结合实际项目需求进行调试和验证,以更好地掌握相关技术。
内容概要:Rust是一种由Mozilla研究院开发的现代系统编程语言,专注于安全、并发和性能。其设计哲学是“零成本抽象”,即在不影响性能的前提下提供高级抽象。Rust通过所有权系统确保内存安全,避免了垃圾回收的需求,有效防止了悬垂指针、数据竞争和无效内存访问等问题。它提供了强大的并发原语,如线程、通道和原子操作,使并发编程更加简单和安全。此外,Rust编译为机器码,性能接近C/C++,并且支持多种操作系统和架构,包括Windows、Linux、macOS以及嵌入式系统。Rust还拥有活跃的社区和丰富的生态系统,提供了大量涵盖多个领域的库和工具。Rust适用于高性能和安全性的系统级应用,如操作系统、数据库、网络服务器和嵌入式系统,同时也被广泛应用于WebAssembly、区块链和人工智能等领域。; 适合人群:对系统编程感兴趣,尤其是希望在保证性能的同时提升代码安全性的开发者。; 使用场景及目标:①需要开发高性能、安全的系统级应用,如操作系统、数据库、网络服务器等;②希望深入理解内存管理和并发编程的最佳实践;③探索WebAssembly、区块链和人工智能等新兴技术领域。; 阅读建议:Rust不仅适合有经验的系统程序员,也适合希望通过学习现代编程语言提升技能的新手。官方教程《The Rust Programming Language》、实践指南《Rust by Example》和练习项目《Rustlings》都是很好的学习资源,建议结合这些资源进行实践和调试。
内容概要:本文介绍了一种基于一致性算法的直流微电网均流均压二级控制方案。该方案采用分布式二级控制器,通过邻居间的通信来计算控制动作,从而实现高效稳定的均流和均压控制。文中详细讨论了恒功率负载平衡点的存在条件,并介绍了即插即用特性的实现。此外,通过MATLAB/Simulink仿真验证了该方案的电压稳定性和鲁棒性。 适合人群:从事电力电子、微电网控制领域的研究人员和技术人员,尤其是对分布式控制系统感兴趣的读者。 使用场景及目标:适用于直流微电网的设计与优化,旨在提高系统的稳定性和效率,特别是在应对非线性负载和突发扰动的情况下。 其他说明:该方案在理论和实践中展现了显著的优势,如更高的均流精度和更快的动态响应时间。然而,仿真运行时间较长,需考虑计算资源的分配。
电子仿真教程,从基础到精通,每个压缩包15篇教程,每篇教程5000字以上。
内容概要:本文档《互联网大厂200道高频Javascript面试题.pdf》涵盖了广泛的JavaScript知识点,针对200道高频面试题进行了详细解析。内容涉及JavaScript的核心概念(如闭包、原型链、事件循环)、异步编程(如Promise、async/await)、数据类型(如BigInt、Symbol)、DOM操作(如EventTarget、MutationObserver)、性能优化(如防抖、节流)、以及最新的ES提案特性(如import.meta、top-level await)。每个问题不仅提供了简明的答案,还深入探讨了背后的原理和应用场景,帮助读者全面掌握JavaScript的各种特性和最佳实践。 适合人群:具备一定编程基础,特别是对JavaScript有初步了解的前端开发人员,以及准备面试互联网大厂的求职者。 使用场景及目标:①巩固JavaScript基础知识,理解语言内部机制;②掌握常见面试题及其解答技巧,为技术面试做准备;③通过实际案例和代码示例加深对JavaScript特性的理解,提高编程能力。 阅读建议:此资源内容详实,建议读者根据自身水平选择重点章节进行学习,同时结合实际项目或练习题进行实践,以达到更好的学习效果。对于复杂的概念,可以多次阅读并查阅相关资料,确保彻底理解。
内容概要:本文详细介绍了C#编程语言的基础知识和学习路径。首先阐述了C#的背景和优势,强调其广泛的应用领域和良好的就业前景。接着指导读者如何准备学习环境,包括安装Visual Studio等开发工具。文中深入讲解了C#的基础语法,如数据类型、运算符、流程控制语句等,并探讨了面向对象编程的核心概念,包括类与对象、封装、继承、多态等。此外,还介绍了异常处理机制,并通过一个控制台版的学生管理系统项目,帮助读者将理论应用于实践。最后,推荐了一系列学习资源,鼓励读者持续学习和探索C#的高级特性。 适合人群:对编程有兴趣的初学者,尤其是希望从事软件开发或提升编程技能的人士。 使用场景及目标:①帮助读者从零开始系统学习C#,掌握基本语法和核心概念;②通过实战项目巩固所学知识,培养解决实际问题的能力;③为后续深入学习C#的高级特性和应用领域打下坚实基础。 其他说明:本文不仅提供了详尽的知识点讲解,还注重实践操作和项目经验积累,适合自学或作为培训教材使用。建议读者跟随文章步骤逐步实践,并利用推荐的学习资源深化理解。
内容概要:本文详细介绍了使用COMSOL软件建立液氮压裂的热-流-固-损伤耦合模型的方法和技术细节。液氮压裂作为一种环保高效的油气开采方法,能够利用低温特性减少地层污染并提高裂缝扩展效率。文中探讨了模型的关键组件,如传热、达西流、固体力学以及自定义的损伤演化方程,并展示了如何将这些元素整合在一个统一的多物理场环境中进行仿真。此外,还讨论了网格划分、求解器设置、边界条件处理等方面的具体实现方法,以及如何通过后处理手段来分析和展示仿真结果。 适合人群:从事油气田开发、地质工程、计算力学等相关领域的科研人员和技术专家。 使用场景及目标:适用于需要深入理解液氮压裂过程中复杂的物理机制的研究项目,旨在为优化压裂工艺提供理论支持和技术指导。 其他说明:文中提供了大量具体的数学公式和代码片段,帮助读者更好地理解和重现所描述的技术流程。同时强调了不同参数选择对于最终仿真结果的影响,提醒使用者注意实际应用中的各种挑战。
内容概要:本文探讨了AI如何重塑企业价值,特别是通过DeepSeek和Manus这两个技术的推动。DeepSeek以其低成本、高质量的特性,打破了AI应用的技术和成本壁垒,实现了AI赋能平权。Manus作为通用智能体,通过全链路自主执行和多智能体协同架构,显著提升了企业效率并降低了成本。文章详细介绍了AI在多个行业(如金融分析、人力资源、零售运营等)的具体应用案例,展示了AI如何通过数据驱动、自动化和智能化手段,帮助企业实现降本增效、商业模式创新和产品迭代。此外,文中还提出了企业在拥抱AI过程中面临的挑战和应对策略,强调了数据基础、技术选择和组织能力建设的重要性。 适合人群:企业高管、AI技术从业者、数字化转型顾问及对AI感兴趣的创业者。 使用场景及目标:①了解AI技术在企业中的应用场景及其带来的变革;②为企业制定AI战略和实施路径提供参考;③帮助企业识别潜在的AI赋能机会,优化业务流程,提升竞争力。 其他说明:文章通过大量实际案例和数据支持,强调了AI技术在企业中的巨大潜力和现实可行性。同时,提醒企业在拥抱AI时需谨慎规划,避免盲目跟风,确保AI项目的成功落地。
c语言学习资料,共208页
内容概要:本文详细探讨了基于人工势场的无人车避障路径规划算法。主要内容包括三个主要势场的建立及其MATLAB代码实现:引力势场用于吸引无人车向目标点移动;障碍车斥力势场用于使无人车避开障碍物;道路边界势场确保无人车保持在车道内行驶。此外,文中还介绍了如何通过调整不同势场的增益系数、引入朝向因子和动量项等手段优化路径规划性能,提高路径平滑性和安全性。最终形成了完整的路径规划流程,即计算合力、确定方向并迭代推进,使得无人车能够在复杂环境中顺利导航。 适合人群:对无人驾驶技术和路径规划算法感兴趣的科研人员、工程师及高校相关专业学生。 使用场景及目标:适用于模拟和实际测试无人车在静态或动态环境中的避障能力和路径选择行为,旨在提高无人车的安全性和智能水平。 其他说明:文中提供的MATLAB代码仅为简化版本,实际应用中可根据具体需求进一步调整和完善。
内容概要:本文详细探讨了分布式电源(如光伏、风能、燃料电池等)接入电网时对电压产生的影响。通过具体的潮流计算模型,展示了不同类型的分布式电源(DG)在接入电网时所采用的不同节点类型(PQ节点、PV节点等),并分析了它们对电压稳定性的影响。文中还提供了基于Python的Pandapower库构建的测试电网实例,以及MATLAB中的节点类型动态切换逻辑,进一步解释了不同节点类型在实际应用中的表现及其优缺点。 适合人群:从事电力系统研究、分布式能源规划的技术人员和研究人员。 使用场景及目标:帮助技术人员理解分布式电源接入电网时的电压波动机制,优化分布式电源的接入方式,提高电网电压稳定性和可靠性。 其他说明:文章强调了在进行电网规划时,应根据实际情况选择合适的节点类型,避免盲目依赖理想化模型。同时,提出了混合模式作为一种有效的解决方案,能够在不同工况下保持较好的电压质量。
三星轮爬楼车sw18可编辑_三维3D设计图纸_包括零件图_机械3D图可修改打包下载_三维3D设计图纸_包括零件图_机械3D图可修改打包下载.zip