在我的javascript中手动触发href或onClick

时间:2012-02-15 17:05:59

标签: javascript jquery html

我正在定制一个由其他人使用WYSIWYG构建的网站。我坚持使用带有javascript的href。

如何点击此锚标记,捕获href,将其值更改为#,preventDefault,然后实际运行最初要运行的内容?我知道这有点奇怪,但它目前导致IE错误,我相信它会修复它。

HTML:

<a class="cpMonthNavigation" href="javascript:CP_refreshCalendar(3,1,2012);">&lt;&lt;</a>

jQuery的:

$(document).click({namespace: this}, function (e) {
    var t = e.data.namespace;

    if ($(e.target).is($(".cpMonthNavigation"))) {
        e.preventDefault();

        $(e.target).attr("href").replace(/javascript:/i, "");
        // This is where I need to manually run the function that was in the HREF
    }
}

请注意,我无法编辑HTML。我坚持不懈,这很可怕。

我需要阻止默认,以便供应商代码运行但仍然运行href中的实际内容。供应商代码中的幕后有很多事情与点击此锚点绑定。

3 个答案:

答案 0 :(得分:1)

试试这段jQuery代码:

$(".cpMonthNavigation").click(function (e) {
    e.preventDefault();
    var expression = $(this).attr("href"); 
    eval(expression);
    $(this).attr("href", "#");
};

答案 1 :(得分:1)

我可能会比需要更简单,但只需运行该函数,防止默认值:

$(document).on('click', 'a.cpMonthNavigation', function(e) {
    e.preventDefault();
    var myHref = $(this).attr("href");
    myHref = myHref.replace(/javascript:/i, "");
    var myNewFunc = myHref.replace(/javascript:/i, /""/i);
    eval(myNewFunc);
});

这里有一个工作示例: http://jsfiddle.net/MarkSchultheiss/Vta56/

编辑:上述较短版本:

$(document).on('click', 'a.cpMonthNavigation', function(e) {
    e.preventDefault();
    eval($(this).attr("href").replace(/javascript:/i, ""));
});

答案 2 :(得分:0)

您可以使用eval来调用该功能。但这在Javascript Programming中被认为是一种不好的做法。

我能想到的另一种方法是,在对象中定义函数,如

var operations = {
    CP_refreshCalendar : function(mm, dd, yyyy){
                              //your code
    }
}

然后,从click事件处理程序中,您可以执行

$(document).click({namespace: this}, function (e) {
var t = e.data.namespace;

if ($(e.target).is($(".cpMonthNavigation"))) {
    e.preventDefault();

    var hrefVal = $(e.target).attr("href").replace(/javascript:/i, "");
    var funcName = hrefVal.substring(0, hrefVal.indexOf('(') - 1);
    var args = hrefVal.substring(hrefVal.indexOf('('), hrefVal.index(')') - 1);
    args = args.split(',');
    if(funcName in operations){
         operations[funcName].apply(window, args);
    }

}
}

可能是我正在制作这个复杂的节目。但我不会使用eval

我希望这有帮助。