当前位置:嗨网首页>书籍在线阅读

30-解决方案

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.7.2 解决方案

编写一个 .toggleCheck() 插件,工作方式与jQuery核心中的 .toggle().toggleClass() 方法类似,可以用它设置、清除或者切换一个(或者一组)复选框:

//选中或者反选jQuery对象中选择的所有复选框元素,如果check参数省略,切换每个元素的选中状态
jQuery.fn.toggleCheck = function( check ) {
   return this.toggleAttr( 'checked', true, false, check );
};

然后可以这样启用一组按钮:

$('.toggleme').toggleCheck( true );

或者禁用它们:

$('.toggleme').toggleCheck( false );

也可以切换所有按钮的状态,每个都独立于其余按钮:

$('.toggleme').toggleCheck();

这个 .toggleCheck() 方法是在更通用的 .toggleAttr() 方法(可用于任何属性)的基础上构建的:

// 对于这个jQudery对象中选择的每个元素
//根据on的值将'name'属性设置为'onValue' 或 'offValue'
//如果'on'省略,独立地在'onValue' 和 'offValue'之间切换该属性
//如果选中的值('onValue' 或'offValue')为null或者undefined,删除该属性
jQuery.fn.toggleAttr = function( name, onValue, offValue, on ) {
   function set( $element, on ) {
     var value = on ? onValue : offValue;
     return value == null ?
        $element.removeAttr( name ) :
        $element.attr( name, value );
   }
   return on !== undefined ?
     set( this, on ) :
     this.each( function( i, element ) {
        var $element = $(element);
        set( $element, $element.attr(name) !== onValue );
     });
};

为什么要花这么多精力去构建这么通用的函数?现在我们可以几乎毫不费力地为其他属性编写相似的切换器.假定你需要和 .toggleCheck() 相同的功能,但是现在你所要禁用和启用的是输入控件。可以用一行代码写出一个 .toggleEnable()

//启用或者禁用这个jQuery对象选择的所有输入元素
//如果省略enable参数,切换所有元素的启用状态
jQuery.fn.toggleEnable = function( enable ) {
   return this.toggleAttr( 'disabled', false, true, enable );
};

请注意是如何按照 onValueoffValue 参数切换 truefalse 属性值的,这种用法更容易说明元素的“启用”,代替 disabled 属性提供的不太直观的“禁用”功能。

另举一个例子,假定需要切换一个 foo 属性,该属性的“开启”状态是字符串值bar,“关闭”状态是删除该属性。这仍然可以用一行代码完成:

//添加或者删除属性foo="bar"
//如果省略add参数,切换该属性的存在
jQuery.fn.toggleFoo = function( add ) {
   return this.toggleAttr( 'foo', 'bar', null, add );
};