如何从父元素触发 href 点击事件
使用以下代码,我尝试从父
li
标签单击
a
标签单击事件。但它给了我这个错误:
为什么我要这样做:
当我单击
PHP PDO
链接时,我们需要将光标移到该文本而不是
li
标签。我正尝试使用此方法修复它。但我知道我们可以通过获取
a href
属性并将其设置为
window.location.href
,从
li
单击事件中调用该
href
。但是当我单击
li
标签时仍尝试触发
a href
单击事件。
HTML
<li class="tags" style="cursor: pointer;">
<a class="link_em" href="?l=1" id="1">List1</a>
</li>
Jquery:
$('li.tags').on('click', function (e) {
$(this).children('a').click();
return false;
});
错误:
当我使用上述代码时出现此错误。
Uncaught RangeError: Maximum call stack size exceeded
UI:
https://jsfiddle.net/k92dep45/
已编辑:
I done this ugly thing, but I am still looking proper solution:
$('li.tags a').on('click', function (e) {
e.stopPropagation();
});
$('li.tags').on('click', function (e) {
window.location.href = $(this).children('a.link_em').attr('href');
e.preventDefault();
});
您可以将以下版本用于上述代码
$('li.tags').on('click', 'a', function (e) {
// Do your stuff.
e.preventDefault();
window.location.href= thishref;
});
这里的第二个参数是 jQuery 的 click 事件中的子元素“a”。
问题是您不断调用同一个元素,这会导致
超出最大调用堆栈大小
。
请看以下示例。
function foo(){
foo();
}
foo();
在上面的代码中,我们一次又一次地调用
foo()
,它也会产生相同的结果。
您需要在
a
元素上添加
event.stopPropagation()
并防止事件“冒泡”,否则您将创建无限循环,这就是您收到该错误的原因。
$('li.tags').on('click', function() {
$(this).children('a').click();
});
$('li.tags a').click(function(e) {
e.stopPropagation()
e.preventDefault() // This is just for demo
console.log($(this).text())
})
a {
border: 1px solid black;
}
li {
padding: 50px;
border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li class="tags" style="cursor: pointer;">
<a class="link_em" href="?l=1" id="1">List1</a>
</li>
</ul>
您可以通过将
window
的
href
更改为存储在
a
标签中的
href
来执行不同的操作,使用以下指令获取:
$(this).children('a').attr("href");
尝试实施或运行以下代码片段以确认它是否解决了您的问题并获得预期的渲染效果:
$('li.tags').on('click', function (e) {
window.location.href= $(this).children('a').attr("href");
return false;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li class="tags" style="cursor: pointer;">
<a class="link_em" href="?l=1" id="1">List1</a>
</li>