代码之家  ›  专栏  ›  技术社区  ›  Bravax

如何确定用javascript单击的HTML?

  •  1
  • Bravax  · 技术社区  · 16 年前

    是否可以使用javascript或其他技术来确定用户单击了哪个超链接,而不更改超链接源代码。

    例如: 您可以单击“标记”按钮,然后单击托管在不同iframe中的超链接,并能够计算用户单击的超链接,而不更改该iframe中的任何源代码吗?

    7 回复  |  直到 15 年前
        1
  •  4
  •   Shaun    16 年前

    使用jquery,您可以设置所选内容的上下文。即

    $('a',$('iframe id'))。单击(function()…);

    然后,您可以实现一个事件处理程序来处理iframe超链接单击。这个 “这个” 处理程序中的属性将允许您查询超链接并获取诸如InnerText等属性。

        2
  •  1
  •   Moran Helman    16 年前

    你需要在每个链接上放置一个事件, 然后您将获得有关特定单击的所有信息。

    这只在某些文档中有效, 因此,如果您尝试在iframe中的链接和页面中的链接之间进行测试,您将不会获得iframe链接的事件。

    为了附加您需要在页面中的所有链接上运行的所有链接的事件, 最好的方法是使用jquery选择器。或其他JS框架,如yui

    $(“A”)。单击(函数()。{ 警报(“”) (});

    getElementsByTagname(“A”)—将提供页面中的所有链接。

        3
  •  0
  •   Bravax    16 年前

    我只是想了一个解决方案,这是否有效,或者还有其他的选择?

    解决方案是代理iframe soruce页面的内容,用代码替换href以调用一个javascript函数,该函数将标识单击的是哪个href。

    然后,可以将其与标记单击一起使用,以准确标记链接。

    这也意味着原始数据源根本不需要更改。

        4
  •  0
  •   roenving    16 年前

    你需要什么?-)

    如果您得到了一个iframe,您就可以将其用作链接的目标,您必须进行一些服务器端处理或向链接的URL添加一些内容,这些内容可以在页面加载时读取…

    但是,检测页面加载时间需要页面中的脚本,即iframe中的脚本,或者一个函数,该函数以短时间间隔测试iframe中页面中元素的可用性…

    --但是,只有当页面来自与主页相同的域时,您才能成功,因为跨域脚本是非法的,因此是不可能的!-)

        5
  •  0
  •   extraneon    16 年前

    我认为这是可能的。可以从外部文档(嵌入iframe的页面)访问iframe的内容,因此您应该能够在加载iframe之后在这些元素上添加事件处理程序(请参阅其他答案)。

    也见 Wikipedia on Iframe 它给出了一些示例和框架,这些示例和框架实际上处理iframe中的内容。

        6
  •  0
  •   bobince    16 年前

    出于明显的安全原因,您可以将代码注入到iframe中,但前提是该iframe与您要注入的页面位于同一域中。

    <iframe id="framedpage" src="framedpage.html"></iframe>
    <button type="button" id="tagbutton">Tag</button>
    <script type="text/javascript">
        function framedclicks_bind() {
            var f= document.getElementById('framedpage');
            var fdoc= f.contentDocument;
            if (!fdoc) fdoc= f.contentWindow.document; // for IE
            if (fdoc)
                for (var i= fdoc.links.length; i-->0;)
                    fdoc.links[i].onclick= framedclicks_click; // bind to all links
        }
        function framedclicks_click() {
            alert('You clicked on '+this.href);
            return false; // don't follow link
        }
        document.getElementById('tagbutton').onclick= framedclicks_bind;
    </script>
    

    可能需要根据应用程序需要进行清理(例如,确保在尝试绑定之前始终加载帧,或者可能发生绑定,或者记住来自原始链接的任何onclick),但这将是事物的一般形状。

        7
  •  0
  •   pawel    16 年前

    找到单击哪个元素的好方法是使用 事件委托 . 如果使用循环(通过document.links或document.getElementsByTagname)将事件侦听器附加到每个元素,则有两个问题: -浏览器有许多要维护的侦听器 -当调用循环时,事件仅附加到DOM中的元素;以后动态添加的任何元素都没有事件侦听器。

    事件委托的简单示例:

    document.onclick = function(e){
        e = e || window.event;
        var t = e.target || e.srcElement;
        if(t.nodeName=='A'){
            alert( t.href );
        }
    }
    

    如果要在iframe中找到单击的链接,只需使用iframe的contentdocument而不是document。