单击链接时,javascript获取href

时间:2012-04-16 23:30:17

标签: javascript onclick

这是我的情况。我在整个网站上都有一些链接。其中一些看起来像这样:

<a target="_blank" onclick="someFunction()" href="/somFile.pdf">some file</a>

有些看起来像这样:

<a target="_blank" href="/somFile.pdf">some file</a>

单击时,所有链接都应调用someFunction()。在onclick属性中具有调用的是旧内容页面。较新的页面附加了一个jQuery click事件,如下所示:

$(document).ready(function(){
  $('a[href$=".pdf"]').click(function() {
    someFunction();
  });
});

所以这就是事情。我可以更新someFunction(),但我无法触及实际链接或jQuery。我需要知道点击链接的href值。我尝试在someFunction()中使用以下内容:

var ev = window.event;
origEl = ev.target || ev.srcElement;
console.log(origEl.href);

但这不起作用。我也试过console.log(window.event)并且什么也没得到,说它是未定义的。知道我在这里缺少什么,或者在调用函数时没有传递对它的引用基本上是不可能的?

编辑:要清楚,我不能作为短期甚至中期的解决方案在onclick或jQuery代码中编辑对someFunction()的调用,所以我不能将它们更改为{{1}或类似的。我不确定是否有可能从someFunction()中获取href,除非我这样做:(

5 个答案:

答案 0 :(得分:9)

除了this.href回调中的click之外,您不需要任何其他内容。

$(document).ready(function()
{    
    function someFunction(foo)
    {
        console.log(foo);
    }

    $('a[href$=".pdf"]').click(function()
    {
        someFunction(this.href);
    });
});

或者,您可以this甚至在<a>内指向someFunction,如下所示:

$(document).ready(function()
{    
    function someFunction()
    {
        console.log(this.href);
        console.log(event);
    }

    $('a[href$=".pdf"]').click(someFunction);
});

如果这不适合您,我们可以通过Function.apply

获得更高的评价
$(document).ready(function()
{    
    function someFunction(event)
    {
        console.log(this.href);
        console.log(event);
    }

    $('a[href$=".pdf"]').click(function (event)
    {
        someFunction.apply(this, event);
    });
});

答案 1 :(得分:6)

这是PURE JavaScript

    //assuming links inside of a shared class "link"
    for(var i in document.getElementsByClassName('link')) {
        var link = document.getElementsByClassName('link')[i];

        link.onclick = function(e) { 
            e.preventDefault();

            //using returned e attributes
            window.location = e.srcElement.attributes.href.textContent;     
        } 
    } 

    //tested on Chrome v31 & IE 11
    //not working in Firefox v29
    //to make it work in all browsers use something like:

    if (e.srcElement === undefined){
    //scrElement is undefined in Firefox and textContent is depreciated

      window.location = e.originalTarget.attributes.href.value;
    } else {
      window.location = e.srcElement.attributes.href.textContent;
    }

    //Furthermore; when you setAttribute("key" "value"); 
    //you can access it with the above node link. 
    //So say you want to set an objectId on something     
    //manually and then grab it later; you can use 

    //Chrome & IE
    //srcElement.attributes.objectid.textContent; 

    //Firefox
    //e.originalTarget.attributes.objectid.value;

    //*Note: for some unknown reason the attribute being defined as "objectId" is changed to "objectid" when it's set.

答案 2 :(得分:2)

所以我让这个煨了一段时间,我确实提出了一个短期的解决方案...它非常hacky我觉得有点脏,但有时你只需要做你必须做的事情,直到你可以做什么你需要做...无论如何,我在这里发布我丑陋的解决方案给其他可能被支持到类似角落的人......

请记住,我允许在OP中触及的唯一代码是someFunction()函数本身。另外,我可以在它所在的位置添加一些额外的代码,这就是我所做的......

基本上,解决方案是创建一个额外的单击侦听器,将href值放入一个暴露给该函数的变量中,然后将someFunction()代码包装在一个小的超时中,以确保新的单击函数可以执行其操作。

<!-- STUFF I CAN'T TOUCH! (located on-page) -->
<a target="_blank" onclick="someFunction()" href="/somFile.pdf">some file</a>
<a target="_blank" href="/somFile.pdf">some file</a>

<script type='text/javascript'>
$(document).ready(function(){
  $('a[href$=".pdf"]').click(function() {
    someFunction();
  });
});
</script>
<!-- END STUFF I CAN'T TOUCH! -->

/*** STUFF I CAN TOUCH! (located in a script include) ***/
// hackjob!
$(document).ready(function(){
  $('a').click(function() {
    if ($(this).attr('href')) someFunction.href = $(this).attr('href');
  });
});

function someFunction(a) {
  // more hackjob!
  window.setTimeout("console.log(someFunction.href);",200);
}
/*** END STUFF I CAN TOUCH!***/

所以无论如何,是的,它是丑陋的,但希望如果他们绝望,它可能会拯救某人的屁股。

答案 3 :(得分:1)

使用this.href或更多适合$(this).attr('href')的jQuery来获取每个链接的值。

答案 4 :(得分:0)

你好。试试这个。根据您的需要进行相应调整(我删除了pdf链接,因为我的小提琴中不存在。)

编辑:在FF和Chrome中测试过。如果它适用于你,请告诉我。

http://jsfiddle.net/lazerblade01/dTVz5/22/