While I would strongly advise that you go with Toni's answer, I wanted to offer an alternative solution to the problem, even thought it's not quite what you were asking for – though that's because you offered no clarity, or explanation, of where you wanted the 'full class-name' returned to.
This approach takes the prefixed class-names and then creates a data-* attribute on each element with the prefix-name; therefore the classes with the prefix of "in-" are used to generate a data-in attribute with the suffix of the class, following the '-' character becomes the attribute-value. So:
<div class="in-left"></div>
Becomes:
<div class="in-left" data-in="left"></div>
Which seems to be an appropriate solution to the problem you describe, and allows you to use your 'normal'/'preferred' syntax to access the relevant elements; though there's some ambguity and a lack of clarity of the desired result in your question as it stands.
That said, one approach is the following:
// creating a simple jQuery plugin:
(function ($) {
// the plugin-name:
$.fn.fullClassFromPartial = function (opts) {
// extending the 'defaults' with the
// options supplied by the user:
var s = $.extend({
'partial': '',
'join' : ''
}, opts);
// we proceed only if the user supplies a
// value for the s.partial property:
if (s.partial.length) {
// returning the jQuery collection (this),
// after iterating through that collection
// using the each() method:
return this.each(function (i, n) {
// setting the data-* attribute equal
// to the value of the s.partial value
// after replacing non-alpha characters:
n.dataset[s.partial.replace(/[^a-z]/g, '')] =
// setting the attribute-value, first
// using Function.prototype.call() to
// allow us to use Array.prototype.slice()
// on the Array-like return-value of
// the HTMLElement.classList property
// to convert the Array-like value into
// an Array:
Array.prototype.slice.call(n.classList, 0)
// using Array.prototype.filter()
// to retain only those elements
// upon whom the inner assessment
// returns a true/truthy value:
.filter(function (cN, i) {
// within the anonymous function the
// first argument ('cN') is the array
// element of the array over which
// we're iterating; the second argument
// ('i') is the index of that array-element
// in the Array.
// if the s.partial value is found at
// the beginning of the array-value,
// we retain this element in the array:
return cN.indexOf(s.partial) === 0;
// we convert into a map, using
// using Array.prototype.map()
// in order to create/return a new
// Array:
}).map(function (cN) {
// here we return the class-name
// after removing the s.partial
// prefix from it:
return cN.replace(s.partial, '');
// should multiple attribute-values prefixed with
// the same string exist, then we join them together
// with the value supplied to the s.join property
// which can be updated by the user via the
// supplied options:
}).join(s.join);
});
//
} else {
return this;
}
};
})(jQuery);
// calling the plugin (note that while I haven't restricted
// the selector to only those elements whose class contains
// the 'in-' string, that is definitely recommended (this is
// just a simple demo, though, and I want to show it working
// with a larger-than-necessary collection):
$('div').fullClassFromPartial({
// setting the 'partial' property to the prefix
// we're looking for:
'partial': "in-",
// setting the 'join' property to the string
// with which we want to join multiple values
// together:
'join' : '_'
});
(function($) {
$.fn.fullClassFromPartial = function(opts) {
var s = $.extend({
'partial': '',
'join': ' '
}, opts);
if (s.partial.length) {
return this.each(function(i, n) {
n.dataset[s.partial.replace(/[^a-z]/g, '')] = Array.prototype.slice.call(n.classList, 0).filter(function(cN, i) {
return cN.indexOf(s.partial) === 0;
}).map(function(cN) {
return cN.replace(s.partial, '');
}).join(s.join || ' ');
});
} else {
return this;
}
};
})(jQuery);
$('div[class*="in-"]').fullClassFromPartial({
'partial': "in-",
'join': '_'
});
div {
border: 2px solid #000;
min-height: 2px;
margin: 1em;
padding: 0.5em;
}
[data-in]::before {
content: attr(data-in);
}
[data-in=left] {
border-left-color: #f90;
}
[data-in=right] {
border-right-color: #f90;
}
[data-in=top] {
border-top-color: #f90;
}
[data-in=bottom] {
border-bottom-color: #f90;
}
[data-in=top_left] {
background-color: #ffa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="slide in-top"></div>
<div></div>
<div class="slide in-right"></div>
<div class="left"></div>
<div class="slide in-bottom"></div>
<div class="in-bottom slide"></div>
<div class="slide in-left"></div>
<div class="slide in-top in-left"></div>
</div>
External JS Fiddle demo, for experimentation and development.
References:
data-transition="left"attribute?Normally I would use a data attribute data-in="left", but can't for this project.How that?switchcheck, or just use$(this).attr('class')in your.eachfunction to find all of the classes it has.hasClass()approach is probably easiest, what sort of result did you want from the function you were trying to put together? An Object containing the Node and the 'full class'? Or a 2 dimensional array of some kind?