Skip to content

Instantly share code, notes, and snippets.

@OndrejSlamecka
Created January 23, 2012 21:27
Show Gist options
  • Save OndrejSlamecka/1665617 to your computer and use it in GitHub Desktop.
Save OndrejSlamecka/1665617 to your computer and use it in GitHub Desktop.
JavaScript getXPath
/* Ondrej Slamecka 2012
* <img id=loader><tr><a class='ajax highlight parent-tr'>Edit</a></tr>
* When you click the link, it will show the loader, on success it will hide the loader and animate <tr> (because of parent-tr)
* Color animation requires https://github.com/jquery/jquery-color
*/
function processSnippets(snippets)
{
if (snippets)
for (var id in snippets) {
$("#" + id).html(snippets[id]);
}
}
function getXPath( element )
{
var xpath = '';
for ( ; element && element.nodeType == 1; element = element.parentNode )
{
var id = $(element.parentNode).children(element.tagName).index(element) + 1;
id > 1 ? (id = ':nth-child(' + id + ')') : (id = '');
xpath = ' ' + element.tagName.toLowerCase() + id + xpath;
}
return xpath;
}
$(function(){
$loader = $('#loader');
// Ajaxed buttons with highlight (set highlighted element by adding class parent-[tagname])
$('body').on('click', '.ajax.highlight', function(){
$this = $(this);
var path = getXPath(this);
$.ajax($this.attr('href'),
{
beforeSend: function(){
$loader.fadeTo('fast', '1');
},
success: function(payload){
processSnippets(payload.snippets);
$loader.fadeTo('fast', '0');
$this = $(path);
// Get all classes of this element
classes = $this.attr('class').split(/\s+/);
// Find out if there exists class called parent-[tagname]
$wrapper_element = $this;
var wrapper_matcher = /parent?-(\w+)/;
for (var i = 0; i < classes.length; i++) {
if (classes[i].match(wrapper_matcher)) {
match = wrapper_matcher.exec(classes[i]);
// Tables won't get styled, get its contents
if(match[1] === 'tr')
$wrapper_element = $this.closest('tr').contents('*');
else
$wrapper_element = $this.closest(match[1]);
break;
}
}
var original_color = $wrapper_element.css('background-color');
$wrapper_element.css('background-color', '#FFFF88');
$wrapper_element.animate({'background-color': original_color}, 1500);
}
});
return false;
});
});
// A variation of http://stackoverflow.com/a/3454579/247532 producing path which is accepted by jQuery's $(path)
function getXPath( element )
{
var xpath = '';
for ( ; element && element.nodeType == 1; element = element.parentNode )
{
var id = $(element.parentNode).children(element.tagName).index(element) + 1;
id > 1 ? (id = ':nth-child(' + id + ')') : (id = '');
xpath = ' ' + element.tagName.toLowerCase() + id + xpath;
}
return xpath;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment