2013-03-12 51 views
5

我需要能够为页面上的每个元素获取一个unqiue选择器。获取唯一选择器jQuery

例如,当我点击一个元素我想要做这样的事情:

$(document).click(function(){ 
    var sel = getUniqueSel(this); 
}); 

所以,在数据库存储sel值后,我可以得到价值,简单地通过

访问元素

var el = $(sel);

我不能改变的,不知道有关页面的HTML结构任何东西,我不能简单地添加唯一的ID(使用JS)的每个元素,因为这将是低效的。

+1

为什么你不能给你有兴趣的ID的人?只是好奇?你真的对页面上的每一个对象感兴趣吗? – mplungjan 2013-03-12 12:19:44

+0

http://stackoverflow.com/questions/5442767/returning-the-full-path-to-an-element – mplungjan 2013-03-12 12:20:31

+0

@mplungjan我想存储页面上的所有点击元素的选择器:),这个脚本将包括在许多页面上。 – Cristy 2013-03-12 12:21:13

回答

6

另一种方法可能是徘徊DOM树,创造的元素,你可以保存并稍后再使用它作为一个选择的路径,虽然ŧ帽子可能不是防弹的,但也许它是一个可以开始的地方。

编辑:更新了答案在评论你的建议,现在它返回的ID(如果可用)

只需访问上JSBin的例子,然后单击document两次。 但要注意什么得到强调..

jQuery.fn.getPath = function() { 
    if (this.length != 1) throw 'Requires one element.'; 
    var path, node = this; 
    if (node[0].id) return "#" + node[0].id; 
    while (node.length) { 
     var realNode = node[0], 
      name = realNode.localName; 
     if (!name) break; 
     name = name.toLowerCase(); 
     var parent = node.parent(); 
     var siblings = parent.children(name); 
     if (siblings.length > 1) { 
      name += ':eq(' + siblings.index(realNode) + ')'; 
     } 
     path = name + (path ? '>' + path : ''); 
     node = parent; 
    } 
    return path; 
}; 
var sel; 
$(document) 
    .click(function (e, a) { 
    if (!sel) { 
     sel = $("#comment-21702402") 
      .getPath(); 
     alert("Path is: " + sel + ", hiding the Element -> Click again to highlight"); 
    } else { 
     $(sel) 
      .css("background-color", "yellow"); 
    } 
}); 
+0

我也可以检查'ID',所以如果div有一个ID定义的ID作为选择器,否则获取路径。我想这会节省一些数据库存储空间。 – Cristy 2013-03-12 13:12:44

0

完成此操作的一种方法是获取所有可以在单击元素上获得的信息。 所以,当你把它保存到数据库中,你可以将其保存,例如文本: 如果你点击的元素是:<div> I'm a div </div>

$(document).click(function(){ 
    var tagName = $(this).prev().prop('tagName'); 
    var attributes = {}; 
    if(this.length) { 
     $.each(this[0].attributes, function(index, attr) { 
      attributes[ attr.name ] = attr.value; 
     }); 
    } 
    var elText=$(this).html(); 
    saveToDB(tagName,attributes,elText); 
}); 

您可以使用属性,你有或者干脆使用后发现该元素

$(tagName+'['+attribute+'="'+value+'"]:contains("'+elText+'")') 

我想这应该有助于

+1

保存元素内容的效率真的很低。 – Cristy 2013-03-12 13:11:12