在 jQuery():

要点:如果传递第二个参数,则第一个参数中的HTML字符串必须表示没有属性的简单元素.从jQuery 1.4开始,可以传入任何event type,并且可以调用以下jQuery方法:val,css,html,text,data,width,height或offset.

从jQuery 1.8开始,任何(强调添加)jQuery实例方法(jQuery.fn的方法)都可以用作传递给第二个参数的对象的属性:

将animate作为属性传递时,该元素似乎立即设置css属性

var div = $("<div></div>",{
     id: "foo","class": "a",animate: {
        fontSize:"22px"
     },data: {
        fontSize: "12px"
     },text: "click",on: {
       "click": function(e) {
         $(this).css($(this).data())
       }
     }
   });

   $("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>

尝试以两种方式设置动画的持续时间

animate: {fontSize:"22px",duration:5000}

似乎没有识别持续时间属性,和

animate: {fontSize:"22px",{duration:5000}}

记录Uncaught SyntaxError:Unexpected token {error to console.

设置css:{transition:font-size 5s}确实会返回预期的结果

var div = $("<div></div>",animate: {
       fontSize:"22px"},data: {
       fontSize: "12px"
     },css:{
       transition: "font-size 5s"
     },on: {
       "click": function(e) {
         $(this).css($(this).data())
       }
     }
   });

   $("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>

应该可以将options对象传递给animate方法
直.

题:

如何将其他属性传递给动画或其他接受多个对象属性作为参数的jQuery方法;例如,在jQuery()的第二个参数中定义的.animate()方法的持续时间或步骤?

解决方法

animate方法的默认持续时间为400毫秒.如果你运行你发布的第一个片段,你会看到CSS在那么短的时间内(0.4秒)被动画化了.

但是持续时间的特定值只能通过第二个参数传递给所有可用的jQuery方法签名中的动画.

jQuery不支持将多个参数传递给在作为第二个参数传递给jQuery()的普通对象中指定为属性的函数.

这可以从这个代码片段中看到,该代码片段取自jQuery v1.12.0 sources附近的2912行:

// HANDLE: $(html,props)
if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
    for ( match in context ) {

        // Properties of context are called as methods if possible
        if ( jQuery.isFunction( this[ match ] ) ) {
            this[ match ]( context[ match ] );   // <-------------

        // ...and otherwise set as attributes
        } else {
            this.attr( match,context[ match ] );
        }
    }
}

因此,没有办法以这种方式将持续时间传递给.animate,因此 – 在.animate的情况下 – 默认持续时间为400毫秒.

解决方法1:覆盖默认值

当然可以选择将默认持续时间更改为所需的持续时间,并在$(html,plainobject)调用之后立即恢复:

$.fx.speeds._default = 5000; // change default
var div = $("<div></div>",{
    animate: {
        fontSize:"100px",},text: "animated text",});
$.fx.speeds._default = 400; // restore;

$("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

但是你可以更好地链接animate方法:

解决方法2:链接动画调用

var div = $("<div></div>",{
    text: "animated text",}).animate({
    fontSize:"100px",5000);

$("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

解决方法3:创建插件

您还可以定义一个插件,该插件将接受每个方法的参数数组,而不只是一个参数:

$.fn.multiargs = function(arg) {
    for (key in arg) {
        $.fn[key].apply(this,arg[key]);
    }
};

现在,您可以使用2nd-arg-object完成所有操作,使用数组作为method-properties的值:

$.fn.multiargs = function(arg) {
    for (var key in arg) {
        $.fn[key].apply(this,arg[key]);
    }
    return this;
};

var div = $("<div></div>",{
    multiargs: {
        text: ["animated text"],animate: [{
            fontSize:"100px",{
            duration: 5000,done: function() {
                $(this).text('Done');
            }
        }]
    }
});

$("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

解决方法4:修补jQuery库

如果在我的答案开头引用的jQuery代码将被修改,以便这行:

this[ match ].apply(this,context[ match ]);

……被这个取代:

if ( jQuery.isArray( context[ match ] ) ) {
            this[ match ].apply(this,context[ match ]);
        } else {
            this[ match ]( context[ match ] );
        }

然后你可以这样写:

var div = $("<div></div>",animate: [{
        fontSize:"100px",{
        duration: 5000,done: function() {
            $(this).text('Done');
        }
    }]
});

并且您将获得与变通方法3相同的结果.

但请注意,当jQuery方法确实需要将数组作为第一个参数时,它可能会产生不良影响.所以这段代码需要进行一些调整才能正确处理这种情况.

另请注意,如果您要使用jQuery的修改版本,则只要您想要升级到更新的jQuery版本,就需要重新应用该更改.

解决方法5:在运行时重新定义$.fn.init

您可以在运行时替换$.fn.init,并且对于它提供的所有其他功能,您可以依赖它的原始版本:

var prev_$_init = $.fn.init;
var init = jQuery.fn.init = function( selector,context,root ) {
    var match,elem,// redefine regexes that are private to jQuery:
        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );

    // Handle HTML strings
    if ( typeof selector === "string" ) {
        if ( selector[ 0 ] === "<" &&
            selector[ selector.length - 1 ] === ">" &&
            selector.length >= 3 ) {

            // Assume that strings that start and end with <> are HTML and skip the regex check
            match = [ null,selector,null ];

        } else {
            match = rquickExpr.exec( selector );
        }

        // Match html or make sure no context is specified for #id
        if ( match && ( match[ 1 ] || !context ) ) {

            // HANDLE: $(html) -> $(array)
            // Patch: do not treat jQuery object as context here:
            if ( match[ 1 ] && !(context instanceof jQuery)) {
                // Option to run scripts is true for back-compat
                // Intentionally let the error be thrown if parseHTML is not present
                // Patch: simplify this call,as context is not jQuery:
                jQuery.merge( this,jQuery.parseHTML(
                    match[ 1 ],document,true
                ) );

                // HANDLE: $(html,props)
                if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
                    for ( match in context ) {

                        // Properties of context are called as methods if possible
                        if ( jQuery.isFunction( this[ match ] ) ) {
                            // Patch:
                            if ( jQuery.isArray( context[ match ] ) ) {
                                this[ match ].apply(this,context[ match ]);
                            } else {
                                this[ match ]( context[ match ] );
                            }

                        // ...and otherwise set as attributes
                        } else {
                            this.attr( match,context[ match ] );
                        }
                    }
                }

                return this;
            }
        }  
    }
    // Patch: forward call to original fn.init
    return prev_$_init.apply(this,arguments);
};
init.prototype = jQuery.fn;
    
var div = $("<div></div>",done: function() {
            $(this).text('Done');
        }
    }]
});

$("body").append(div);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

这是有效的,但是它从原始的$.fn.init代码中复制了一些代码,并且需要重新定义jQuery库在$.fn.init方法之外定义的一些私有变量.我在评论中用“Path”标记,我修改了原始代码.

很明显,$.fn.init并没有像这样被推翻.

最后,我觉得这种方法的缺点比它带来的优势3更重要.

如何将选项对象作为参数传递给jQuery()的第二个参数的方法集?的更多相关文章

  1. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Canvas图片分割效果的实现

    这篇文章主要介绍了Canvas图片分割效果的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5 Canvas实现放大镜效果示例

    这篇文章主要介绍了HTML5 Canvas实现放大镜效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)

    这篇文章主要介绍了Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. canvas实现圆形进度条动画的示例代码

    这篇文章主要介绍了canvas实现圆形进度条动画的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. 手把手教你实现一个canvas智绘画板的方法

    这篇文章主要介绍了手把手教你实现一个canvas智绘画板的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. 使用canvas来完成线性渐变和径向渐变的功能的方法示例

    这篇文章主要介绍了使用canvas来完成线性渐变和径向渐变的功能的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部