复制元素的Onclick事件

时间:2012-10-20 11:59:57

标签: javascript jquery

嗨,我有一个有趣的问题

是否可以复制像这样的元素的onclick事件

$('#ElementId').attr('OldOnClick',$('#ElementId').attr('OnClick'));

如果有任何办法,请指导我。

我正在尝试禁用表单上存在的所有元素的点击事件,在某些其他点上我必须恢复它们,所以我试图用其他属性名称保存onclick

5 个答案:

答案 0 :(得分:4)

是的,您可以访问处理函数。在jquery中执行此操作的方式是:

$('#specialbutton').click(function(){ console.log("peaches");};

var handlerFunction = $('#specialbutton').data("events").click[0].handler;

$('#specialbutton').click(); // "peaches"
handlerFunction(); // "peaches"

然后你会把它分配给另一个这样的元素:

$('#otherelement').click(handlerFunction);
$('#otherelement').click(); // "peaches"

答案 1 :(得分:3)

我已经编写了用于复制事件的jQuery插件。但是,它仅适用于动态添加的事件,而不适用于添加了“on”功能的事件。

我希望这会对某人有所帮助。

参数:

eventType - “click”,“mouseover”等。

destination - jQuery对象,dom元素或选择器

clearCurrent - 如果为true,它将清除目标处的当前处理程序 - 默认为false

    (function($){
            $.fn.copyEventTo = function(eventType, destination, clearCurrent) {
            var events = [];
            this.each(function(){
                var allEvents = jQuery._data(this, "events");
                if (typeof allEvents === "object") {
                    var thoseEvents = allEvents[eventType];
                    if (typeof thoseEvents === "object") {
                        for (var i = 0; i<thoseEvents.length; i++){
                            events.push(allEvents[eventType][i].handler);
                        }           
                    }
                }
            });
            if (typeof destination === "string") {
                destination = $(destination);
            } else if (typeof destination === "object") {
                if (typeof destination.tagName === "string") {
                    destination = $(destination);
                }
            }
            if (clearCurrent === true) destination.off(eventType);
            destination.each(function(){
                for(var i = 0; i<events.length; i++) {
                    destination.bind(eventType, events[i]); 
                }
            });
            return this;
        }
    })(jQuery);

答案 2 :(得分:0)

听起来你可能会错过下面的第二行。你正在复制时想要做一个动作。

$('#ElementId').attr('oldonclick', $('#ElementId').attr('onclick') )
               .removeAttr('onclick');

答案 3 :(得分:0)

以下将删除元素数据中的“onclick”存储,并允许您稍后从数据中使用它。使用A标记的示例

DEMO http://jsfiddle.net/u4eVW/1/

/* remove "onclick" and store */
$('a').each(function() {
    var onclick = $(this).attr('onclick')
    $(this).data('oldClick', onclick)
    $(this).removeAttr('onclick')

})

/* initialize handlers from data */
$('a').click(function() {
        eval($(this).data('oldClick'))
 }) 

如果您希望更改单个“onclick”中的内容,则需要将属性值视为字符串并使用正则表达式方法进行修改。

<a href="#" onclick="alert('foo')"> Link 1</a>

var onclick=$(selector).attr('onclick').replace('foo', 'bar')

答案 4 :(得分:0)

显然您不应该再这样做了,

无论如何,这都是您可以做到的(感谢this answer):

searchTitle

然后,如ChuckE的答案所示:

var handlerFunction = jQuery._data( $('#ElementId').get(0), "events" ).click[0].handler;

不要告诉任何人...