, , .
So, I have a little function for this (it is optimized):
function getParent(elem, target)
{
if(target == null)
return elem.parentNode;
var elem_name = target,
attr_name = null, attr_value = null,
compare_type = null,
match_val = target.match(/\[.+[^\[\]]\]$/i);
if(match_val != null)
{
elem_name = elem_name.replace(match_val[0], '');
var expr = match_val[0].substr(1, match_val[0].length-2),
tmp = expr.split('=');
attr_name = tmp[0];
if(tmp.length == 2)
{
attr_value = tmp[1].toLowerCase();
attr_value = attr_value.replace(/(\'|\")+/ig, '');
if(attr_name.match(/\^$/))
compare_type = 'begin';
else if(attr_name.match(/\*$/))
compare_type = 'all';
else if(attr_name.match(/\$$/))
compare_type = 'end';
else
compare_type = 'simple';
if(compare_type != 'simple')
attr_name = attr_name.substr(0, attr_name.length-1);
}
}
var parent = elem.parentNode;
do
{
if(parent.nodeName.toUpperCase() == elem_name.toUpperCase())
{
if(attr_name != null)
{
var attribute = parent.getAttribute(attr_name).toLowerCase();
if(attribute != null && attribute != '')
{
if(attr_value == null)
return parent;
if(compare_type == 'simple' && attribute == attr_value)
return parent;
if(compare_type == 'begin' && attribute.match(eval('/^'+attr_value+'/ig')))
return parent;
if(compare_type == 'end' && attribute.match(eval('/'+attr_value+'$/ig')))
return parent;
if(compare_type == 'all' && attribute.match(eval('/'+attr_value+'/ig')))
return parent;
}
} else {
return parent;
}
}
parent = parent.parentNode;
}
while(parent != null);
return null;
}
source
share