IEEE 754 and browsers, toFixed or toPrecission

Все числа в JavaScript, как целые так и дробные, имеют тип Number и хранятся в 64-битном формате IEEE-754, также известном как «double precision»
Так должно быть, но есть нюансы, отличия в итогах, возьмем простой алгоритм for (n=0.5; n<10; n+=1) console.log(n+0.05, (n+0.05).toFixed(1));
Google Chrome Версия 51.0.2704.103 Internet Explorer 11 Версия 11.0.9600.18314 Ваш браузер
+=0.05toFixed(1)toFixed(20) +=0.05toFixed(1)toFixed(20) +=0.05toFixed(1)toFixed(20)
0.550.60.55000000000000004441 0.550.60.55000000000000000000
1.551.61.55000000000000004441 1.551.61.55000000000000000000
2.552.52.54999999999999982236 2.552.62.55000000000000000000
3.553.53.54999999999999982236 3.553.63.55000000000000000000
4.554.54.54999999999999982236 4.554.64.55000000000000000000
5.555.55.54999999999999982236 5.555.65.55000000000000000000
6.556.56.54999999999999982236 6.556.66.55000000000000000000
7.557.57.54999999999999982236 7.557.67.55000000000000000000
8.558.68.55000000000000071054 8.558.68.55000000000000000000
9.559.69.55000000000000071054 9.559.69.55000000000000000000
Тут, конечно, под большим вопросом где подкрасить красным, Google Chrome выводит честные данные, а ИЕ то что нам нужно :-) Хотя и в ИЕ и в Хроме (тут и ИЕ соблюдает стандарты)
x = 0.1 + 0.2
0.30000000000000004
Кстати, в PHP результат будет 0.3, но это не заслуга, просто у него точность по умолчанию 14 знаков. Дабы уровнять и скорректировать результаты, можем использовать такую замену toFixed, позаимствовал у Angular
function toFixed(number, fractionSize) {
    return +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
}

Create an object property from a variable value in JavaScript

Создаем объект со свойством равным значению переменной
switch(_this.data(‘act’)) {
	case ‘setfilter’:
		$.ajax({ url: _this.prop(‘href’), dataType: «json», type: «POST»,
		 data: (datas = $.extend({}, _this.data()), $(‘#performedwork input’).map(function(i,o){ return ( t={}, t[$(o).prop(‘name’)]=$(o).val(), t ); }).each(function(i,o){ $.extend(datas, o) }), datas ),
		 success: function( d ) {
			if (d.error.length) {
				bootbox.dialog({ title: ‘<div class="text-danger">Ошибка</div>‘, message: ‘<div class="text-danger">«</div>‘, onShown: function() { this.find(‘.bootbox-body > div’).text(d.error); } });
			} else {

IE10,IE11 bug — You must choose an item from the list

Баг в ИЕ10, ИЕ11 получаем сообщение «Необходимо выбрать элемент из списка» если для элемента select установлено свойство required и изначально пустой select будет заполнен с помощью javascript И кликнули в пустой селект ИЛИ сперва попытались отправить пустой список. Усложнение уровня если select будет заполнен единственным option, выбрать его вообще никак не получится. Безымянный93 Решение в коде, «передерним» селект, в ДОМ структуре то селект обозначен как с выбранным элементом.
Или использовать селект с элементом плайсхолдером.

function hack1() {
	var cur = $('#select1').prop('selectedIndex');
	$('#select1').prop('selectedIndex', -1);
	$('#select1').prop('selectedIndex', cur);
}
Тут можно протестировать

css title

Задача, в таблице есть строки с некоторыми стилями флагами, код и js недоступен, только css, нужно проставить title атрибут, некий аналог.

tr.is-foreign:hover td:nth-child(2):before {
 position: absolute;
 background: #fff;
 border: 1px solid grey;
 border-radius: 3px;
 color: #000;
 padding: 4px 6px;
 margin-top: -24px;
 content: "\421\418\20\43D\430\20\0437\430\43C\435\43D\443";
}
 
От "Чужое СИ" взял Unicode Entities, получил  %u0427%u0443%u0436%u043E%u0435%20%u0421%u0418
%u0 заменяем на \, %u на \ получаем значение content
 
Безымянный92

Skipping recall function from a script php

Пропуск повторного вызова функции из скрипта php.
session_id('cron'); //используем именованную сессию, имя файла сессии sess_cron
session_start();
if ($this->session->has(__METHOD__)) {
	$attemptCount = intval($this->session->get('attemptCount-' . __METHOD__));
	$this->session->set('attemptCount-' . __METHOD__, ++$attemptCount);
	printf("Run at: %s\r\n", date('c', intval($this->session->get(__METHOD__))));
	return;
} else {
	$this->session->set(__METHOD__, $_SERVER["REQUEST_TIME_FLOAT"]);
	$this->session->set('attemptCount-' . __METHOD__, 1);
	session_write_close(); // закроем сессию, снимем с нее блокировку иначе следующие скрипты не смогут ничего прочитать и будут ждать в очереди, а нам нужен другой эффект
}

sleep(300); //тут что-то делаем

//снимаем блокировку
session_id('cron');
session_start();
$this->session->remove(__METHOD__);
Безымянный91
если хотим аналог мьютекса, то достаточно только session_id(‘cron’) и все, все скрипты в очереди на ожидание ресурса — файла сессии

php анонимная функция с возможностью немедленного выполнения

Аналог анонимной функции JavaScript с немедленным исполнением
(function () { /* do something */ })()

модель рабочего примера, найти первое вхождение, частичное или полное

#php 5.3
$ttttar212 = ['asf',['asd','qwer2'],'qwe'];
$inttttar = 0;
call_user_func(function($cont_act, $ttttar212) use (&$inttttar) {
	foreach ($ttttar212 as $v) {
		if ($cont_act[0] === $v || $cont_act === $v) {
			$inttttar++;
			break;
		}
	}
}, ['qwe','qwer'], $ttttar212);

в действии

// если совпадает с внутренними (с виртуальными) то тоже подсветим
if ($data->active == 0 && isset($data->virtual) && is_array($data->virtual)) {
	call_user_func(function($cont_act, $ttttar) use (&$data) {
		foreach ($ttttar as $v) {
			if ($cont_act[0] === $v || $cont_act === $v) {
				$data->active++;
				break;
			}
		}
	}, [$controllerName, $actionName], $data->virtual);
//	$data->active += (int)in_array($controllerName, $data->virtual);
//	$data->active += (int)in_array([$controllerName,$actionName], $data->virtual);
}

Сессии php и десериализация

Задача, проход по списку сессий, сессия стандартно в файлах, получить доступ к данным.
<div id="usersmonitor" >
<table id="usersmonitortable" class="table table-bordered table-hover table-condensed table-fixed">
<thead>
<tr><th style="width: 15%;">Последняя активность</th><th style="width: 35%;">ФИО</th><th style="width: 25%;">e-mail</th><th style="width: 25%;">Роль</th></tr>
</thead>
<tbody>
<?php 
function unserialize_php($session_data) {
        $return_data = array();
        $offset = 0;
        while ($offset < strlen($session_data)) {
            if (!strstr(substr($session_data, $offset), "|")) {
                throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
            }
            $pos = strpos($session_data, "|", $offset);
            $num = $pos - $offset;
            $varname = substr($session_data, $offset, $num);
            $offset += $num + 1;
            $data = unserialize(substr($session_data, $offset));
            $return_data[$varname] = $data;
            $offset += strlen(serialize($data));
        }
	return $return_data;
}

$directory = session_save_path().'/';
$filenames = array();
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        $filenames[$fileinfo->getMTime()] = $fileinfo->getFilename();
    }
}
krsort($filenames);

foreach($filenames as $mt => $fn) {
 $ot = new \DateTime();
 $ot->setTimestamp($mt);
 $st = $ot->format('d.m.Y H:i');
 $t = unserialize_php(file_get_contents($directory . $fn));
 if (isset($t['auth']) && isset($t['auth']['user'])) {
	$tt = (object)$t['auth']['user'];
	echo "<tr><td>{$st}</td><td>{$tt->nameLast} {$tt->nameFirst} {$tt->nameMidle}</td><td>{$tt->email}</td><td>{$tt->name}</td></tr>";
 }
}

?>
</tbody>
</table>
</div>

<script>
$(function () {
	setInterval( function() {$('#usersmonitor').load('/users/usersmonitor #usersmonitortable', {act: 'refresh'})} , 30100 );
});
</script>

Условные комментарии начиная с IE 10 больше не работают

<!-- [if IE 6]><style type="text/css">
   .transparent { background: #0078c9; }
</style><![endif]-->
https://msdn.microsoft.com/en-us/library/hh801214(v=vs.85).aspx «Отделить» 10-ый от 11-го с помощью js или на бекенде аналогично распарсить User-Agent
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie ie11';
} else if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie ie10';
} else if(uA.indexOf('MSIE ') != -1) {
    document.body.className = document.body.className+' ie ieo';
}

JQuery preventDefault stopPropagation stopImmediatePropagation

Отличие в методах:
  • preventDefault() = прервать обработку действия по умолчанию на элементе текущего события
  • stopPropagation() = остановить всплытие(bubbling) события к родительским элементам
  • stopImmediatePropagation() = stopPropagation + прерывает передачу события во все последующие обработчики «слушающих» на текущем элементе