有没有办法在jQuery中基于DOM元素生成CSS选择器

时间:2010-09-03 23:50:23

标签: jquery dom jquery-selectors

有没有办法获取DOM对象并推断出一个可用于稍后查找该元素的CSS选择器。

示例:

<ul class="items">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>

<script type="text/javascript">
var second = $('.items li:eq(1)');
console.log(get_css_selector(second));
</script>

get_css_selector会返回类似于.items li:eq(1)的内容,或者至少是一个可以用来选择元素的字符串。

如果有一种基于以下方法生成CSS选择器的方法,那就是奖励:

<script type="text/javascript">
var third = document.getElementsByTagName('li')[2];
console.log(get_css_selector(third));
</script>

2 个答案:

答案 0 :(得分:3)

好像您正在尝试使用原始选择器。我是对的吗?或者我过度简化了什么?

原始选择器存储在您创建的jQuery对象中。

试一试: http://jsfiddle.net/9JUJL/

var second = $('.items li:eq(1)');
var selector = second.selector;

或者奖金,这个? http://jsfiddle.net/9JUJL/2/

function get_css_selector(elem) {
    var tag = elem.tagName.toLowerCase();
    return tag + ':eq(' + $(tag).index(elem) + ')';
}

答案 1 :(得分:1)

function createElementSelector(elm, containedInEle) {
    containedInEle = typeof(containedInEle) != 'undefined' ? containedInEle : document;

    var segs = [];

    for (; elm && elm !== containedInEle; elm = elm.parentNode) 
    { 
        segs.unshift(':nth-child(' + childNumber(elm) + ')'); 
    }; 
    return '#' + elm.id + ' ' + segs.join(' '); 
}; 

function childNumber(child) { 
    var i = 0;
    while( child.nodeType == 1 && (child = child.previousSibling) != null) {
      i++;
    }
    return i + 1; 
};