Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » вопросы по javascript

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gserg2007
Делайте то, что нужно, до появления окна. Запоминаете элемент или выделение. То, с чем будете работать далее. Или давайте конкретный пример.

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 13:33 29-09-2022
gserg2007

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот простой пример модального окна (html-файл).
Выделите часть текста, запустите окно и щелкните на нём не закрывая.
Выделение пропадет, а надо, чтобы не пропадало.

Код:
 
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Модальное окно</title>
    <style>
        /* Затемнение всей страницы при открытии окна */
        .modal {
            display: none;
            position: fixed;
            z-index: 1;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            overflow: auto; /* разрешаем прокрутку */
            background-color: rgba(0,0,0,0.4);
            z-index: 100;
            opacity: 0.6;
        }
 
        /* Добавляется при открытии окна */
        .modal-open {
            display: block;
        }
 
        /* Содержимое модального окна */
        .modal-content {
            background-color: #fefefe;
            margin: 15% auto; /* отступ сверху и центрирование по горизонтали */
            padding: 20px;
            border: 1px solid #888;
            width: 80%;
        }
 
        /* Кнопка закрытия модального окна */
        .close {
            color: #aaa;
            float: right;
            font-size: 28px;
            font-weight: bold;
        }
 
        .close:hover,
        .close:focus {
            color: black;
            text-decoration: none;
            cursor: pointer;
        }
    </style>
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            // это то модальное окно, с которым и будем работать
            const modal = document.querySelector('#myModal');
 
            // назначаем обработчик события для клика по кнопке открытия окна
            document.querySelector('#myBtn').addEventListener('click', openModal);
 
            /*
             * Обработчик события клика по кнопке открытия модального окна
             */
            function openModal() {
                modal.classList.add('modal-open');
                // обработчики событий, которые работают, когда окно открыто
                attachModalEvents();
            }
 
            /*
             * Функция назначает обработчики событий к элементам модального окна при открытии
             */
            function attachModalEvents() {
                // закрывать модальное окно при нажатии на крестик
                modal.querySelector('.close').addEventListener('click', closeModal);
                // закрывать модальное окно при нажатии клавиши Escape
                document.addEventListener('keydown', handleEscape);
                // закрывать модальное окно при клике вне контента модального окна
                modal.addEventListener('click', handleOutside);
            }
 
            /*
             * Обработчик события клика по кнопке закрытия модального окна
             */
            function closeModal() {
                modal.classList.remove('modal-open');
                // окно закрыто, эти обработчики событий больше не нужны
                detachModalEvents();
            }
 
            /*
             * Функция удаляет обработчики событий к элементам модального окна при закрытии
             */
            function detachModalEvents() {
                modal.querySelector('.close').removeEventListener('click', closeModal);
                document.removeEventListener('keydown', handleEscape);
                modal.removeEventListener('click', handleOutside);
            }
 
            /*
             * Функция закрывает модальное окно при нажатии клавиши Escape
             */
            function handleEscape(event) {
                if (event.key === 'Escape') {
                    closeModal();
                }
            }
 
            /*
             * Функция закрывает модальное окно при клике вне контента модального окна
             */
            function handleOutside(event) {
                const isClickInside = !!event.target.closest('.modal-content');
                if (!isClickInside) {
                    closeModal();
                }
            }
        });
    </script>
</head>
<body>
    <!-- Кнопка открытия модального окна -->
    <button id="myBtn">Открыть окно</button>
 
    <!-- Затемнение всей страницы при открытии окна -->
    <div id="myModal" class="modal">
        <!-- Содержимое модального окна -->
        <div class="modal-content">
            <span class="close">&times;</span>
            <p>Контент модального окна</p>
        </div>
    </div>
    Выделите тут часть текста.
</body>
</html>
 

Всего записей: 3 | Зарегистр. 27-05-2014 | Отправлено: 17:38 29-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gserg2007
вам не нужно это визуально, достаточно лишь сохранить выделение перед открытием.. но можно и восстанавливать постоянно, если уж так хочется.
https://jsfiddle.net/uahv3xqg/
решение не кроссбраузерное, нужно добавить еще кода.. что то типа

Код:
function saveSelection() {
    if (window.getSelection) {
        var sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            return sel.getRangeAt(0);
        }
    } else if (document.selection && document.selection.createRange) {
        return document.selection.createRange();
    }
    return null;
}
 
function restoreSelection(range) {
    if (range) {
        if (window.getSelection) {
            var sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.selection && range.select) {
            range.select();
        }
    }
}

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 21:08 29-09-2022
RdMax

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите почему на ютубе скрипты работают, а на сайте с вставленным видео с ютуба нет ?
Вот например скрипт на жесте мыши включает перевод субтитров на ютубе:

Код:
setTimeout(function(){
document.querySelector('button[class*="subtitles-button"]').click();
},100);
setTimeout(function(){
document.querySelector('button[class*="settings-button"]').click();
},300);
setTimeout(function(){
  document.querySelector('span[class="ytp-menuitem-label-count"]').click();
},1000);
setTimeout(function(){
    document.querySelector('div.ytp-panel-menu >:last-child >div').click();
},2000);
setTimeout(function(){
    document.querySelector('div.ytp-panel-menu > div:nth-child(84) > div').click();
},3000);

На ютубе работает, а на dugtor с трейлерами с ютуба с такими же элементами по коду - нет

Всего записей: 271 | Зарегистр. 11-11-2020 | Отправлено: 15:36 08-10-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RdMax

Цитата:
а на сайте с вставленным видео с ютуба нет ?

потому что видео вставляется в iframe, с другого домена, к которому доступа у вас нет.
 
или говорите точно о чем речь.

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 19:15 08-10-2022 | Исправлено: Mavrikii, 21:36 08-10-2022
b7music



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Здравствуйте, подскажите, пожалуйста, почему может не срабатывать serialize() ?

Код:
$("#contacts_common_form").submit(function() {
        // alert('send');
        
        var th = $(this);
        th.find(".form-result").remove();
        
        $.ajax({
            type: "POST",
            url: "/ajax/feedback_form.php", //Change
            //data: th.serialize()
            data: th.serialize()
            
        }).done(function(data) {
             //alert(data);
                console.log(data == 'ok');
 
 
            if (data == 'ok') {
                // th.find(".form-group,.text-center").hide();
                th.prepend('<div class="form-result">Заявка принята!</div>');
                th.trigger("reset");
            }
            else{
                alert(data);
            }
        // setTimeout(function() {
            // Done Functions
            // th.trigger("reset");
        // }, 1000);
        });
        return false;
    });

data  возвращает false
Если указать data: th.serializeArray() то вот что выводит
http://prntscr.com/ASPNFAZnrvsI
 
 
и вроде как передаются данные в файл http://prntscr.com/tBXhen6V-EOg но не работает(

Всего записей: 674 | Зарегистр. 04-03-2010 | Отправлено: 08:35 27-10-2022 | Исправлено: b7music, 09:49 27-10-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
b7music

Цитата:
data  возвращает false

возвращает куда?
 

Цитата:
.done(function(data) {

это ответ сервера, а не данные из формы.

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 10:53 27-10-2022
b7music



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
возвращает куда?

 
в консоле.  console.log( data == 'ok');  
если в лог вывести th  

Код:
{
    "0": {
        "0": {
            "__ym_indexer": 2555,
            "value": "как зовут",
            "metrikaId_0.042850920168386875": 11
        },
        "1": {
            "__ym_indexer": 2563,
            "value": "почта",
            "metrikaId_0.042850920168386875": 13
        },
        "2": {
            "__ym_indexer": 2570,
            "metrikaId_0.042850920168386875": 14
        },
        "3": {
            "__ym_indexer": 2574,
            "value": "сообщение",
            "metrikaId_0.042850920168386875": 16
        },
        "4": {
            "__ym_indexer": 2583,
            "metrikaId_0.042850920168386875": 17
        },
        "5": {
            "__ym_indexer": 2585,
            "metrikaId_0.042850920168386875": 18
        },
        "6": {
            "__ym_indexer": 2587,
            "metrikaId_0.042850920168386875": 19
        },
        "jQuery321093904275933497221": {
            "events": {
                "submit": [
                    {
                        "type": "submit",
                        "origType": "submit",
                        "data": null,
                        "guid": 47,
                        "namespace": ""
                    }
                ]
            }
        },
        "__ym_indexer": 2540,
        "metrikaId_0.042850920168386875": 8
    },
    "length": 1
}

а вот после data: th.serialize() в data пусто

Всего записей: 674 | Зарегистр. 04-03-2010 | Отправлено: 11:02 27-10-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
b7music

Цитата:
а вот после data: th.serialize() в data пусто

да в каком месте вы data смотрите и как???

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 11:20 27-10-2022 | Исправлено: Mavrikii, 11:20 27-10-2022
b7music



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
        console.log(data);
        return false;
        
    });
в конце дописал
'это console.log(th);
http://prntscr.com/3eKl_5PR9fSg
Соответственно console.log( $(this).serialize() );
 
 возвращает то что нужно, но не работает(
вот содержимое файла  /ajax/feedback_form.php

Код:
$name = $_POST["name"];
$from = $_POST["email"];
$TEXT = "".$_POST["message"];
 
      $arEventFields= array(
        "AUTHOR" => $_POST["name"],
        "AUTHOR_EMAIL" => $_POST["email"],
 
        "TEXT" => $TEXT,
        );
      CEvent::Send("FEEDBACK_FORM", SITE_ID, $arEventFields);
 

Всего записей: 674 | Зарегистр. 04-03-2010 | Отправлено: 11:33 27-10-2022 | Исправлено: b7music, 11:58 27-10-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
b7music

Цитата:
возвращает то что нужно, но не работает(

раз данные уходят, значит дело не в этом. а в том, что делается на сервере.
переадресации 302 сервер не делает? иначе POST данные не перебрасываются.
 
var_dump($_POST); и смотрите что есть вообще

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 21:18 27-10-2022 | Исправлено: Mavrikii, 21:51 27-10-2022
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую, есть три переменные типа string.
Одна - пусть будет так: const rootUrl = window.location.origin;
Вторая - скажем relativePath как очевидно является стринговым представлением относительного url, берется из атрибута. Сложение этих двух стрингов сравнивается с третьей переменной -  
var currentUrl = window.location.href;
Проблема в том, что вторая переменная - relativePath - может быть записана несколькими вариантами - со слешами и/или в начале и/или в конце, и так и так, и совсем без них.  
Например -  
/category/product1/
/category/product2
category/product3/
/page.html/

 
и тд и тп.  
 
Последняя переменная currentUrl также может быть как со слешем в конце так и без слеша.  
 
Поэтому, перед конкатинацией и сравнением надо сначала удалить слеши у relativePath и у currentUrl, но только если слеш первый и/или последний символ в строке, чтобы не удалить промежуточные слеши, а потом уже например
 
rootUrl.concat('/', relativePath);  - и уже сравнивать с currentUrl
 
Проблема что я с регулярками не дружу почти, подскажите как правильную составить )
 
 
 

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 11:25 08-11-2022 | Исправлено: Weinaum, 11:28 08-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
js регулярки в javascript регулярные выражения

Цитата:
но только если слеш первый и/или последний символ в строке

ну, например

Код:
String.prototype.rtrim = function(chr) {
    var rgx = new RegExp((!chr? '\\s' : '[' + chr + ']') + '+$');
    return this.replace(rgx, '');
}
String.prototype.ltrim = function(chr) {
    var rgx = new RegExp('^' + (!chr? '\\s' : '[' + chr + ']') + '+');
    return this.replace(rgx, '');
}

 
так как в chr нет экранирования, то делать уж самостоятельно.

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 12:20 08-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как заблокировать выполнение Ajax, если <input> <form> и пустой?
 
required и включен, но Ajax продолжает то же самое
 

Код:
 
<form id="myForm2" class="navbar-form navbar-left" onsubmit="return false">
    
        <div>
            <b>Actor</b>
            <input type="text" id="nome" autofocus style="width: 300px;" placeholder="Inserisci attore in minuscolo o imdbid" name="input_nome" required />
            
            <input type="submit" class="button1" id="invia" name="Cerca un nome" value="Cerca Attore"  />
        
        </div>
        </form>
 
 

 
 

Код:
<div id="risultato">

 

Код:
 
<script type="text/javascript">
            $("#invia").click(function(){                
                $.ajax({    
                    type: "POST",  
                    url: "results_actor.php",  
                    data: "input_nome=" + $("#nome").val(),
                    success: function(response){
                        $("#risultato").html(response);
                    }
                });  
            });          
        </script>
 

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 10:59 20-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback
Я же сказал - сделать проверку самостоятельно и если все как нужно, тогда $.ajax

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 11:26 20-11-2022
b7music



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте. Подскажите, как вставить свой блок div после этого

Код:
                       (insertedLoc = BX.create("DIV", {
                            attrs: { "data-property-id-row": locationId },
                            props: { className: "form-group bx-soa-location-input-container soa-property-container" },
                            style: { visibility: "hidden" },
                            html: currentLocation.HTML,
                        })),
 

 

Код:
var htmlText = <div class="form-group ">Текст текст</div>document.write(htmlText);

так не работает( скрипт перестает работать.
 
Вот полная функция  
 

Код:
getDeliveryLocationInput: function (node) {
                    var currentProperty, locationId, altId, location, k, altProperty, labelHtml, currentLocation, insertedLoc, labelTextHtml, label, input, altNode;
                    for (k in this.result.ORDER_PROP.properties)
                        if (this.result.ORDER_PROP.properties.hasOwnProperty(k) && "Y" == (currentProperty = this.result.ORDER_PROP.properties[k]).IS_LOCATION) {
                            (locationId = currentProperty.ID), (altId = parseInt(currentProperty.INPUT_FIELD_LOCATION));
                            break;
                        }
                    if ((location = this.locations[locationId]) && location[0] && location[0].output)
                        for (k in ((this.regionBlockNotEmpty = !0),
                        (labelHtml =
                            '<label class="bx-soa-custom-label" for="soa-property-' +
                            parseInt(locationId) +
                            '">' +
                            ("Y" == currentProperty.REQUIRED ? '<span class="bx-authform-starrequired">*</span> ' : "") +
                            BX.util.htmlspecialchars(currentProperty.NAME) +
                            (currentProperty.DESCRIPTION.length ? " <small>(" + BX.util.htmlspecialchars(currentProperty.DESCRIPTION) + ")</small>" : "") +
                            "</label>"),
                        (currentLocation = location[0].output),
                        (insertedLoc = BX.create("DIV", {
                            attrs: { "data-property-id-row": locationId },
                            props: { className: "form-group bx-soa-location-input-container soa-property-container" },
                            style: { visibility: "hidden" },
                            html: currentLocation.HTML,
                        })),
                        
                        node.appendChild(insertedLoc),
                        node.appendChild(BX.create("INPUT", { props: { type: "hidden", name: "RECENT_DELIVERY_VALUE", value: location[0].lastValue } })),
                        currentLocation.SCRIPT))
                            currentLocation.SCRIPT.hasOwnProperty(k) && BX.evalGlobal(currentLocation.SCRIPT[k].JS);
    
                    
                    if (location && location[0] && location[0].showAlt && altId > 0)
                        for (k in this.result.ORDER_PROP.properties)
                            if (parseInt(this.result.ORDER_PROP.properties[k].ID) == altId) {
                                altProperty = this.result.ORDER_PROP.properties[k];
                                break;
                            }
                    altProperty &&
                        ((altNode = BX.create("DIV", { attrs: { "data-property-id-row": altProperty.ID }, props: { className: "form-group bx-soa-location-input-container" } })),
                        (labelTextHtml = BX.util.htmlspecialchars(altProperty.NAME)),
                        (labelTextHtml += "Y" == altProperty.REQUIRED ? '<span class="bx-authform-starrequired">*</span> ' : ""),
                        (label = BX.create("LABEL", { attrs: { for: "altProperty" }, props: { className: "bx-soa-custom-label" }, html: labelTextHtml })),
                        (input = BX.create("INPUT", {
                            props: {
                                id: "altProperty",
                                type: "text",
                                placeholder: altProperty.DESCRIPTION,
                                autocomplete: "city",
                                className: "form-control bx-soa-customer-input bx-ios-fix",
                                name: "ORDER_PROP_" + altProperty.ID,
                                value: altProperty.VALUE,
                            },
                        })),
                        altNode.appendChild(label),
                        altNode.appendChild(input),
                        node.appendChild(altNode),
                        this.bindValidation(altProperty.ID, altNode)),
                        location && location[0] && node.appendChild(BX.create("DIV", { props: { className: "bx-soa-reference" }, html: this.params.MESS_REGION_REFERENCE }));
                },
 

Нужно после этого блока создать обычный со своим текстом.

Всего записей: 674 | Зарегистр. 04-03-2010 | Отправлено: 15:05 06-12-2022 | Исправлено: b7music, 15:06 06-12-2022
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
что то теперь задержка на всех слайдах и на каждом новом цикле помечаются 2 слайда - 1 и 2.
Может я что то недопонял?
https://codepen.io/lagudal/pen/RwJEEdj
 

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 15:41 06-12-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum

Цитата:
что то теперь задержка на всех слайдах  

ну так смена класса идет после окончания анимации.
можно менять и до начала движения, но тоже будет не очень.  

Цитата:
и на каждом новом цикле помечаются 2 слайда

потому что скрипт клонирует цепочку, вместе с классом.
можно так

Код:
.on('beforeChange', function(e, slick, slide) {
  $('.customer-logos .slide').removeClass('remove-filter');      
    })

 
Добавлено:
b7music

Цитата:
так не работает( скрипт перестает работать.

конечно не будет.
 

Цитата:
Подскажите, как вставить свой блок div после этого

после node.appendChild(insertedLoc),
сделать

Код:
node.appendChild(BX.create("DIV", {
  props: { className: "form-group" },
  html: "Текст текст"
  })),

Всего записей: 15108 | Зарегистр. 20-09-2014 | Отправлено: 20:49 06-12-2022 | Исправлено: Mavrikii, 20:53 06-12-2022
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
спасибо, смысл понятен

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 09:39 07-12-2022
Alinalessio

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Верстаю сайт на локалке. Подключил colorbox отсюда https://www.jacklmoore.com/colorbox/
Теперь на сайте прямо на локалке показываются блоки с чужой рекламой.
Я выяснил, что это провайдер ростелеком этим занимается, подсовывает рекламу если сайт незащищён ssl  
Но что мне делать на локалке?
Вопрос 1: Можно ли подключить colorbox чтобы ростелеком не лез со своей рекламой?
Вопрос 2: Если нельзя, то как сделать https на локалке?
 
Вот, это разве не безобразие?

 
Добавлено:
И ещё, по поводу colorbox. Кто сталкивался с тем, что на мобильных устройствах, всплывающее окошко по ширине больше сайта? Как это поправить?
На снимке красным выделил ширину сайта. Видно, что всплывающее окно намного больше ширины сайта.  

 
Может в js что-то надо прописать про ширину? Не подскажете? Или это дело в вёрстке html?
 
Ссылка на сайт: https://web72.ru/alinex/
 
Это те всплывающие окна, которые на мобильных устройствах шире, чем сайт:

Всего записей: 223 | Зарегистр. 21-06-2010 | Отправлено: 11:51 11-12-2022 | Исправлено: Alinalessio, 12:24 11-12-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Компьютерный форум Ru.Board » Интернет » Web-программирование » вопросы по javascript


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru