【问题标题】:Return XPath location with jQuery? Need some feedback on a function用 jQuery 返回 XPath 位置?需要一些关于函数的反馈
【发布时间】:2011-05-23 05:05:23
【问题描述】:

对于以下项目,我将使用 PHP 和 jQuery。

我有以下代码:

$('*').onclick(function(){

});

一旦用户点击一个元素,我希望它返回该元素的 XPath 位置。

我想要做的基本上是在 jQuery 的帮助下建立一个过滤系统。

PHP 将使用 PHP 从外部来源检索文档,使用 jQuery 用户单击该文档的元素/相关部分。此 jQuery 函数将返回用户单击位置的 XPath 位置,并将其存储并与该文档相关联。

如果将来更新该文档,使用 XPath,PHP 将只检索用户之前选择的 XPath,而不是整个文档。

我还需要这个 jQuery 函数来返回元素属性,例如 <p> 中的标题或锚链接中的 href 位置。

长话短说:我的问题是,这在 jQuery 中是否可行?返回所选元素的 XPath 位置及其属性?我不知道这在 jQuery 中会是什么样子,因此我们将不胜感激。

任何其他额外的反馈也会很棒。据我所知,我可能使用了错误的工具......或其他东西。谢谢。

【问题讨论】:

  • 你应该永远使用$('*').eventhandler,它会为DOM中的每一个元素附加一个处理程序,这只是......糟糕,非常糟糕。跨度>
  • 别担心,这不是生产代码,只是为了表达想法。

标签: jquery


【解决方案1】:

Gaby aka G. Petrioli

的修复

为孩子添加了“nd”

.children(nd)

满:

$(document).delegate('*','click',function(){
        var path = $(this).parents().andSelf();
        var xpath=''; // firebug xpath starts with '/html'
        for (var i = 0; i < path.length; i++) {
            var nd = path[i].nodeName.toLowerCase();
            if (nd =="tbody") continue;  // php DOMxpath ignores tbody? or browser fixes html?
            xpath += '/';
            if (nd != 'html' && nd != 'body')
            {xpath += nd+'['+ ($(path[i-1]).children(nd).index(path[i])+1) +']';} //! saving time ha?
            else
            {xpath += nd;}                    
        }
        alert(xpath);
        return false;
    });

【讨论】:

    【解决方案2】:

    您可以使用.parents() 方法,获取被点击元素的所有祖先。

    $(document).delegate('*','click',function(){
      var path = $(this).parents().andSelf();
      return false;
    });
    

    然后提取你想要的信息。

    使用.delegate 方法处理事件,因此您不需要将其附加到所有元素。并且还使用.andSelf() 方法将被点击的项目也包含在路径中。


    一个更完整的例子

    $(document).delegate('*','click',function(){
        var path = $(this).parents().andSelf();
        var xpath='/';
        for (var i = 0; i < path.length; i++)
        {
            var nd = path[i].nodeName.toLowerCase();
            xpath += '/';
            if (nd != 'html' && nd != 'body')
            {xpath += nd+'['+ ($(path[i-1]).children().index(path[i])+1) +']';}
            else
            {xpath += nd;}                    
        }
        alert(xpath);
        return false;
    });
    

    http://www.jsfiddle.net/gaby/hsv97/1/播放的测试html示例


    更新 idclass 也显示:http://www.jsfiddle.net/gaby/hsv97/2/

    【讨论】:

    • 他是否也不需要获取每个父母内部的兄弟姐妹的索引
    • 是的,这只是为了指出正确的方向。可能有很多优化,比如如果层次结构中有一个id,它可以从那里开始,等等。但是从这个例子中,你有一个 xpath 中所有元素的列表,你可以开始提取你想要的信息每个人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 2011-04-25
    • 2021-11-01
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多