function removeURLParameter(url, parameter) {
//prefer to use l.search if you have a location/link object
var urlparts= url.split('?');
if (urlparts.length>=2) {
var prefix= encodeURIComponent(parameter)+'=';
var pars= urlparts[1].split(/[&;]/g);
//reverse iteration as may be destructive
for (var i= pars.length; i-- > 0;) {
//idiom for string.startsWith
if (pars[i].lastIndexOf(prefix, 0) !== -1) {
pars.splice(i, 1);
}
}
if(pars.length > 0) {
url= urlparts[0]+'?'+pars.join('&');
} else {
url= urlparts[0];
}
return url;
} else {
return url;
}
}
var url = 'https://jsfiddle.net/?test=123123&qwe=er24';
alert(removeURLParameter(url, 'qwe')); // https://jsfiddle.net/?test=123123
В некоторых случаях требуется выдеруть из URL параметры или текущюю локализацию и еще что-нибудь, для этого и существует данный скрипт. Применяем очень просто
parseUrl('https://gostash.it/ru/stashes/create?type=snippet')
В ответ получаем следующее:
{
"protocol":"https:",
"host":"gostash.it",
"hostname":"gostash.it",
"pathname":"/ru/stashes/create",
"search":"?type=snippet",
"hash":""
}
Сам скрипт:
function parseUrl(href) {
const match = href.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
return {
protocol: match[1],
host: match[2],
hostname: match[3],
port: match[4],
pathname: match[5],
search: match[6],
hash: match[7],
};
}
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор.
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
}
Результат: 9e24e277-8524-812a-9c3f-4930444d74de
Функция на javascript для генерации масива БЭМ модификаторов. Использую такую в jade.
На вход тербует json обьект вида
{
'base': 'block',
'mods': [
'key': 'value',
'key2': 'value2'
]
}
Возвращяет масив вида ['block', 'block_key_value', 'block_key2_value2']
-
var _mods = function (data) {
var mods = [data.base];
if (data.mods) {
data.mods.forEach(function(mod, index) {
if (typeof mod === "string") {
mods.push(mods[0] + '_' + mod);
}
else {
for (var key in mod) {
var val = mod[key];
if (key === "mod") {
mods.push(mods[0] + '_' + val);
}
else {
mods.push(mods[0] + '_' + key + '_' + val);
}
}
}
});
}
return mods;
};
Примеры использования
//- Test 1 key/value
- var myMods = _mods({'base': 'module-name', 'mods': [{'key': 'value'}, {'key2': 'value2'}]});
div(class=myMods)= myMods
//- Test 2 value
- var myMods = _mods({'base': 'module-name', 'mods': ['mod1', 'mod2']});
div(class=myMods)= myMods
//- Test 3 mixed
- var myMods = _mods({'base': 'module-name', 'mods': [{'key': 'value'}, {'key2': 'value2'}, {'mod': 'mod1'}, {'mod': 'mod2'}]});
div(class=myMods)= myMods
Плавная сортировка вертикальных элементов.
Главной задачей было добиться максимальной быстрой скорости сортировки и отрисовки, без лишних действий. Данный плагин предназначен для узкого списка задач, по этому на супер функциональность в нём можете не рассчитывать.
Так же есть AssetBundle для Yii2 SmoothSortAsset
В своей работе мне понадобилось создать REST интерфейс, и обращаться на бек через GET параметры. Привожу сниппет в нескольких примерах на JS и JQ.
//JS версия
var obj = {
param1: 'something',
param2: 'somethingelse',
param3: 'another',
bla: {
param5: 'i\'m nested!',
ja: {
param6: 'i am really nested'
}
}
};
var serialiseObject = function(obj) {
var pairs = [];
for (var prop in obj) {
if (!obj.hasOwnProperty(prop)) {
continue;
}
if (Object.prototype.toString.call(obj[prop]) == '[object Object]') {
pairs.push(serialiseObject(obj[prop]));
continue;
}
pairs.push(prop + '=' + obj[prop]);
}
return pairs.join('&');
}
console.log(serialiseObject(obj));
// param1=something¶m2=somethingelse¶m3=another¶m5=i'm nested!¶m6=i am really nested
// jQuery версия
var params = { width:1680, height:1050 };
var str = jQuery.param( params );
console.log(str)
// width=1680&height=1050
Эту функцию удобно использовать для вывода чисел пользователю.
var roundCount = function (number) {
if (number > 999 && number <= 999999){
return number / 1000 + 'k';
} else if (number > 999999){
return '>1M';
}
return number;
};
Эту функцию удобно использовать для вывода чисел пользователю.
var roundCount = function (number) {
var result;
if (number > 999 && number <= 999999){
result = number / 1000 + 'k';
} else if (number > 999999){
result = '>1M';
} else {
result = number;
}
return result;
};
console.log(roundCount(234234234)) // ">1M"
console.log(roundCount(434)) // 434
console.log(roundCount(54345)) // "54.345k"
console.log(roundCount(34567)) // "34.567k"
console.log(roundCount(234234)) // "234.234k"
console.log(roundCount(43423)) // "43.423k"
console.log(roundCount(2344234)) // ">1M"
В MongoDB отвратительный полнотекстовый поиск. Для индексации и поиска можно использовать Sphinxsearch. В интернете есть несколько вариантов, как это сделать (при помощи PHP, mongoexport --type=csv, etc).
Но, как показала практика, когда колличество документов в коллекции измеряется миллионами и они собираются из разных источников, перечисленные методы либо вообще не работают (сфинкс ломается о различные спец.символы), либо просто виснут. Самым быстрым и надежным способом в итоге оказалось генерировать индекс силами самого сфинкса.
Ниже пример. Сразу предупрежу, что я специально отказался от использования XML DOM в пользу скорости.
//echo header
print("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+ "<sphinx:docset>\n"
+ " <sphinx:schema>\n"
+ " <sphinx:field name=\"content\"/>\n"
+ " </sphinx:schema>\n");
//echo posts
db.posts.find().forEach( function(post) {
print('<sphinx:document id="' + post._id.valueOf() + "\">\n"
+ ' <content>' + doc.content.toString().replace(/[><]/g,'') + "</first_name>\n" //обязательно убирайте символы < и >
+ "</sphinx:document>\n");
}
print("</sphinx:docset>");
Если в _id у вас не только цифры (а по умолчанию, если вы ничего не присваиваете в _id, это так и будет), то стоит добавить счетчик i++ вместо post._id.valueOf()
Ну и, исходник в сфинксе:
source sourcename
{
type = xmlpipe2
xmlpipe_command = mongo databasename --quiet /path/to/jsfile.js
xmlpipe_field_string = content
}
Благодарю автора zular за данный скрипт. Хотел написать коммент, но нажал чтото не то :) В общем, чтобы класс таки удалялся, на 6 строке лучше сравнивать в виде ">" а не ">=" ибо в нашем случае $(window).scrollTop() всегда >= 0
Здравствуйте, столкнулся с задачей фиксации меню при скролле страницы, был найден скрипт на просторах интернета, который решил мою задачу. Я его немного изменил под свои нужды.
Зависимости:
Классы:
Преимущества скрипта:
// --- affix top menu script ---
$(() => {
let target = $('.nav-afix');
let startPosition = target.offset().top;
$(window).scroll(() => {
if ($(window).scrollTop() > startPosition) {
if (!target.hasClass()) {
target.addClass('affix')
};
} else {
target.removeClass('affix')
};
});
});