从jquery对象中提取onclick location.href作为字符串

时间:2012-04-03 19:15:09

标签: jquery string onclick

我正在试图劫持button元素,以便我可以在新窗口中打开它的链接。我添加了一个新属性,需要在名为data-ext-link="true"的新窗口中打开这些元素。在某些情况下,button元素的onclick包含我需要将用户发送到的location.href。如何使用jquery抓取location.href,以便我可以将其提供给我的函数中的window.open

下面的函数非常适用于锚元素,但是它位于我的is('button') if语句中,它会变得毛茸茸并且不起作用,因为attr()返回一个对象而不是一个字符串。它返回的对象如下:

我的按钮代码:

<button data-ext-link="true" onclick="location.href='http://website/url_i_want'" class="btn2">Open it up</button>

$。attr('onclick')回复:

function onclick(event) {
    location.href = "http://website.com/url_i_want";
}

我的功能:

function extLinks() {
    var extLinks = $('a[data-ext-link="true"], button[data-ext-link="true"]');

    $.each(extLinks, function(){
        if($(this).is('button')){
            var link = $(this).attr('onclick'); // Here it needs to be a string.
            link = link.match(/location.href='(.*)'/); //Won't work because it's an object.
            link = link[1];
        } else {
            var link = $(this).attr('href');
        }
        $(this).unbind('click.extLink').bind('click.extLink',function(e){
            e.preventDefault();
            window.open(link);
        });
    });
}

更新:

我发现了以下相关问题,建议使用$.live弃用我会使用$.delagate()代替,但这并不能完全解决我需要告诉此按钮打开的问题一个新窗口,使用location.href内的onclick值作为目标。

SOLUTION:

function extLinks() {
    var extLinks = $('a[data-ext-link="true"], button[data-ext-link="true"]');

    $.each(extLinks, function(){
        if($(this).is('button')){
            var link = this.onclick.toString().match(/location\.href\s*=\s*['"]([^'"]*)['"]/)[1];
        } else {
            var link = $(this).attr('href');
        }
        $(this).unbind('click.extLink').bind('click.extLink',function(e){
            e.preventDefault();
            window.open(link);
        });
    });
}

1 个答案:

答案 0 :(得分:0)

尝试将函数转换为字符串:

var link = $(this).attr('onclick').toString();

注意 - 我不知道这是否适用于所有浏览器。虽然在Firefox和IE7中适用于我。


此外,您可能需要修改正则表达式 - 它不适用于您发布的示例。试试这个:

/location\.href\s*=\s*['"]([^'"]*)['"]/

我已经确认此解决方案对我有用。这是一个示例页面:http://nylen.tv/test-onclick.html