2012-04-03 41 views
1

我试图劫持button元素,因此我可以在新窗口中打开它的链接。我添加了一个新属性,这些属性需要在名为data-ext-link="true"的新窗口中打开。在某些情况下,button元素有一个onclick,其中包含我需要发送给用户的location.href。我怎样才能抓住使用jquery location.href,所以我可以在我的函数中提供给window.open从jquery对象提取onclick location.href作为字符串

下面的函数对锚元素非常适用,但它在我的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); 
     }); 
    }); 
} 

更新:

我发现了以下关系ted问题,建议使用$.live哪些被弃用我会用$.delagate()来代替,但是这并没有完全解决这个问题,我需要通过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); 
     }); 
    }); 
} 
+0

这里一定有其他事情发生。你可以发布一个按钮的HTML代码,这种方法不起作用吗?此外,您可能需要修改您的正则表达式 - 它不适用于您提供的示例。 – jnylen 2012-04-03 19:41:37

+0

@jnylen:我为我的问题添加了更多细节。 – 2012-04-03 21:15:32

+0

我已确认我的解决方案适用于我。请参阅http://nylen.tv/test-onclick.html。另外,如果您控制整个页面的HTML,那么重构代码就不那么需要这种体操(例如,使用URL的字典,或将URL放入一个'data-url '按钮或链接元素的属性)。 – jnylen 2012-04-03 21:29:44

回答

1

尝试将功能转换为字符串:

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

注 - 我不知道这是否会在所有的浏览器。尽管在Firefox和IE7中适用于我。


此外,你可能需要修改你的正则表达式 - 它不会为您发布的例子工作。试试这个:

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

我确认这解决方案确实为我工作。以下是一个示例页面:http://nylen.tv/test-onclick.html

+0

我认为即使添加了toString(),它仍然会返回一个对象。 – 2012-04-03 19:25:49

+0

避免创建一个jQuery对象会更容易些,只需使用'this.onclick.toString()'?顺便说一句,JS Fiddle演示确认最终结果是一个字符串:http://jsfiddle.net/davidThomas/WKycw/ – 2012-04-03 19:29:33

+0

是的,这个。onclick'可以工作,但jQuery将使用“W3C首选”方式获取属性。 – jnylen 2012-04-03 19:38:37