【问题标题】:how to get the caller element in href javascript function?如何在href javascript函数中获取调用者元素?
【发布时间】:2014-02-26 19:46:54
【问题描述】:

我在 html 中有一个锚标记元素,例如:

<a href="javascript:handleEvent(this, 'abc')"></a>

现在在javascript函数中,我写了:

function handleEvent(sourceElement, txt) {
    console.log(sourceElement);
}

在这种情况下,控制台元素将作为窗口出现。 我尝试了 sourceElement.document.activeElement 但它似乎在 chrome 中不起作用,它作为 body 元素出现。

我无法将锚标记的结构更改为“onClick”功能,因为它来自其他来源。 在这种情况下有什么方法可以找到调用元素吗?

【问题讨论】:

标签: javascript jquery html anchor href


【解决方案1】:

这里真正的答案是更改 HTML,你说过你不能这样做。如果可以的话,我会反击。如果你在写函数,而且函数名在 HTML 中,那你怎么不能改 HTML??

但如果你真的真的不能,你可以在 DOM 加载后更新它:

var list = document.querySelectorAll('a[href^="javascript:"]');
var x, link;
for (x = 0; x < list.length; ++x) {
    link = list[x];
    link.onclick = new Function(link.href.substring(11));
    link.href = "javascript:;";
}

Live Copy | Live Source

这很调皮,因为它使用了Function 构造函数(与eval 非常相似),但是如果您信任HTML 的来源,那应该没问题。

当然,如果您不必使用 href 中的任何内容,只需在上面的代码中连接您的事件处理程序,不要使用 new Function

【讨论】:

    【解决方案2】:

    尝试这样的事情,使用jQuery

    只需使用选择器选择链接标签

            $(function(){
                var href = $('a').attr('href');
                href = href.replace('javascript:','');
                $('a').attr('href','#');
                $('a').attr('onclick',href);
            })
    

    这只是临时解决方案。

    【讨论】:

    • onclickhref 不等价。 href 可以与键盘一起使用。 onclick 只能通过鼠标使用。
    【解决方案3】:

    如果你可以访问 js,你可以这样做:

    document.addEventListener('DOMContentLoaded', function(){
        var link = document.querySelectorAll('a');
        link[0].addEventListener('click', function(e){
            console.log(e.target);
        });
    });
    

    有了这个,你就不会对内联 href 事件做任何事情,而只是附加你自己的处理程序。

    【讨论】:

    • 这个答案在各个层面上都是错误的:添加侦听器不会使另一段事件处理代码神奇地消失。这也不会将处理程序绑定到 all 元素,而只会绑定到 DOM 的第一个锚元素。 querySelectorAll 也比一些较新的 getElementsBy* 函数(例如 getElementsByClassName)得到更好的支持,尽可能使用它。另外最好指定传递给addEventListener的第三个参数
    • @EliasVanOotegem 关于您的评论的一些事情:1)我从未说过添加事件侦听器会使内联声明消失。我明确表示 OP 将简单地忽略内联声明。 2)OP说他有一个锚元素;因此索引为0。显然,如果他想绑定到所有锚点,那将是一个不同的过程。 3) 更新为使用querySelectorAll
    • "这样,你将忽略内联 href"
    【解决方案4】:

    如果这里没有其他答案适合您因为您无法在加载后更新 DOM(如果您想修改 squarespace lightbox,请尝试执行其中任何一个 - 并不是说​​不可能,但是...),这是一个开箱即用的想法:

    有时会有一些提示a href 在哪里。所以你可以使用它。

    <div class="hint current">
        <a href="javascript:handleEvent('.hint')">
    

    就我而言,我什至不需要参数就知道提示,这让事情变得更加简单:

    function handleEvent (hint) {
        if(!hint) {
            hint = $("div.current");
        }
        hrefElement = $(hint).find('a[href^=javascript]');
    }
    

    如果您的 DOM 不断被您无权访问的脚本更改,这当然是有意义的。

    但即使a href 上没有任何提示,您仍然可以执行以下操作:

    <a href="javascript:var x=1;handleEvent(1)">
    
    function handleEvent (uniqueId) {
        hrefElement = $('a[href^=javascript:var x='+uniqueId);
    }
    

    【讨论】:

    • Cawas,据我了解,这个答案对于简单的html很有效,但是我当时遇到的html真的很复杂。有 100 个没有任何类/id 的元素,看起来完全一样,但不同之处在于 href 事件。在这种情况下,您不能使用 .find 来获取元素,因为我们不知道是哪一个调用了该函数。这就是将其更改为 onclick 的原因,因为我可以轻松获取元素。
    • squarespace灯箱没有什么简单的,但它组织得很好。我想这只是不同的情况。就我而言,没有其他答案有效。 ;)(现在我知道我应该改写这个想法并专注于此,谢谢)
    • 完全同意!!!顺便说一句,如果你想查看的话,我得到的 html 是一份 Jaspersoft 报告。
    • 很酷的东西。重新阅读您的评论,我有了一个想法……即使唯一的提示是您在href 上写的任何内容,您仍然可以使用它。更棒的部分是它变得可以自我暗示!我会再次编辑答案。
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2011-03-07
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多