这是我的情况。我在整个网站上都有一些链接。其中一些看起来像这样:
<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,除非我这样做:(
答案 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中测试过。如果它适用于你,请告诉我。