1- Возможен ли 100% пиксель пёрфект? как бы я не старался сдвигать всё по милипиксилям, всё равно идёт малейшее несоответствие с макетом, а особенно со шрифтами.Шрифты - подогнать можно, если дизайнер их предварительно правильно обработал. Но, подогнать под 1 конкретный браузер, т.к. разные браузеры по разному рендерят шрифты. Выводы - сделаете самостоятельно :)
2- Нужно ли так очень ответственно подходить к работе?Эти вопросы обычно обсуждаю с заказчиком и/или дизайнером или тем, кто принимает макет по факту. А так же опираясь на то, из какого места у дизайнера рисовавшего макет - растут руки, иной раз, делать "в точности как нарисовано" - означат "угробить проект", т.к.
Через меня прошло пару заказов и вдруг начали жаловаться, что идёт сильное не соответствие с макетом.Очень странно, что они начали жаловаться после того как приняли макет...
let obj={};
[{name: 'one', q: 5}, {name: 'one', q: 3}, {name: 'two', q: 1},{name: 'two', q: 6},{name: 'three', q: 10}].forEach(entry=>{
if(obj[entry.name]){
obj[entry.name].q+= entry.q;
}else{
obj[entry.name]= entry;
}
});
console.log(Object.values(obj));
//Or ES5 way
console.log(Object.keys(obj).map(name=>obj[name]));
/**
* @name MyNamespace
* @namespace Hold all functionality
*/
(function () {
"use strict";
/** @lends MyNamespace*/
var stlib = function (param, param, param) { ...All of my code...};
}());
/**
* @module foobar
*/
/**
* @function
* @author Baa
* @name hello
* @description Output a greeting
* @param {String} name - The name of the person to say hello
*/
(function hello(name) {
/**
* @function
* @author Baz
* @inner
* @private
* @memberof module:foobar
* @description Check if the argument is a string (see: {@link module:foobar~hello})
* @param {String} string - The string
* @returns {String} Returns true if string is valid, false otherwise
*/
var isString = function checkString(string) { return typeof string === 'string'; };
if (isString(name))
console.log('Hello ' + name + '!');
}('Mr. Bubbles'));
...
из ES6, освойте, что ли, новые структуры данных. var te = new TextEncoder("utf-8");
te.encode(string); // возвращает Uint8Array
new Uint8Array(new Int32Array([435678]).buffer) // вернет Uint8Array с [222, 165, 6, 0]
Собственно я думал это одно и то же, разве нет ?
В обеих случаях у $a нет значения.
;(function ($) {
$(".input").bind("paste", function(evt) {
var item = (evt.clipboardData || evt.originalEvent.clipboardData).items[0] || null;
if (item && item.kind === "file" && item.type.indexOf("image") !== -1) {
var file = item.getAsFile(),
data = new FormData();
data.append('file', file);
$.ajax({
url: "/upload",
type: "POST",
data: data,
contentType: false,
processData: false,
success: function (r) {
// ...
}
})
}
})
})(jQuery)
$(document).on("keydown", function(e){
if(e.keyCode == 27) {
var gPause = myGame.currentStatus("isPaused");
var frozenData = {};
if(!gPause){
myGame.gameCurrentProcessing.all("stop").currentStatus("paused", true);
frozenData = myGame.detach();
} else {
frozenData.appendTo(document.body);
myGame.gameCurrentProcessing.all("start").currentStatus("paused", false);
}
}
});
<?php
/**
* Простой роутер
* @devg
*/
final class RouterLite {
public static $routes = array();
private static $params = array();
public static $requestedUrl = '';
/**
* Добавить маршрут
*/
public static function addRoute($route, $destination=null) {
if ($destination != null && !is_array($route)) {
$route = array($route => $destination);
}
self::$routes = array_merge(self::$routes, $route);
}
/**
* Разделить переданный URL на компоненты
*/
public static function splitUrl($url) {
return preg_split('/\//', $url, -1, PREG_SPLIT_NO_EMPTY);
}
/**
* Текущий обработанный URL
*/
public static function getCurrentUrl() {
return (self::$requestedUrl?:'/');
}
/**
* Обработка переданного URL
*/
public static function dispatch($requestedUrl = null) {
// Если URL не передан, берем его из REQUEST_URI
if ($requestedUrl === null) {
$uri = reset(explode('?', $_SERVER["REQUEST_URI"]));
$requestedUrl = urldecode(rtrim($uri, '/'));
}
self::$requestedUrl = $requestedUrl;
// если URL и маршрут полностью совпадают
if (isset(self::$routes[$requestedUrl])) {
self::$params = self::splitUrl(self::$routes[$requestedUrl]);
return self::executeAction();
}
foreach (self::$routes as $route => $uri) {
// Заменяем wildcards на рег. выражения
if (strpos($route, ':') !== false) {
$route = str_replace(':any', '(.+)', str_replace(':num', '([0-9]+)', $route));
}
if (preg_match('#^'.$route.'$#', $requestedUrl)) {
if (strpos($uri, '$') !== false && strpos($route, '(') !== false) {
$uri = preg_replace('#^'.$route.'$#', $uri, $requestedUrl);
}
self::$params = self::splitUrl($uri);
break; // URL обработан!
}
}
return self::executeAction();
}
/**
* Запуск соответствующего действия/экшена/метода контроллера
*/
public static function executeAction() {
$controller = isset(self::$params[0]) ? self::$params[0]: 'DefaultController';
$action = isset(self::$params[1]) ? self::$params[1]: 'default_method';
$params = array_slice(self::$params, 2);
return call_user_func_array(array($controller, $action), $params);
}
}
?>
<?php
// маршруты (можно хранить в конфиге приложения)
// можно использовать wildcards (подстановки):
// :any - любое цифробуквенное сочетание
// :num - только цифры
// в результирующее выражение записываются как $1, $2 и т.д. по порядку
$routes = array(
// 'url' => 'контроллер/действие/параметр1/параметр2/параметр3'
'/' => 'MainController/index', // главная страница
'/contacts' => 'MainController/contacts', // страница контактов
'/blog' => 'BlogController/index', // список постов блога
'/blog/:num' => 'BlogController/viewPost/$1' // просмотр отдельного поста, например, /blog/123
'/blog/:any/:num' => 'BlogController/$1/$2' // действия над постом, например, /blog/edit/123 или /blog/dеlete/123
'/:any' => 'MainController/anyAction' // все остальные запросы обрабатываются здесь
));
// добавляем все маршруты за раз
RouterLite::addRoute($routes);
// а можно добавлять по одному
RouterLite::addRoute('/about', 'MainController/about');
// непосредственно запуск обработки
RouterLite::dispatch();
?>