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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

D1D1D1D

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

Цитата:
экранируется \[, а закрытие ] - нет

Не понял. На всякий случай заэкранировал начальные и конечные квадратные скобки из паттерна(вместе и по отдельности),  

Код:
pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;
            pattern = new RegExp(pattern, 'miu');

но все равно ошибка

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 02:38 15-04-2022
Mavrikii

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

Цитата:
На всякий случай заэкранировал начальные и конечные квадратные скобки из паттерна(

не нужно их экранировать. об этом и ошибка, что есть закрывающая ], но нет открывающей.
при экранировании это означает именно поиск символа [, а не часть синтаксиса регулярного выражения.
проблема в вашем ${pattern}, что в нем подставляется.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 02:41 15-04-2022
D1D1D1D

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

Цитата:
проблема в вашем ${pattern}, что в нем подставляется.

Подставил вот этот шаблон - но он же правильный:

Код:
\d+(?!\.)

 
Добавлено:
Кажется, эта строчка вызывает ошибку

Код:
pattern = pattern.replace(/\./g, '[\\u0400-\\u04FF\\w]');

Если её закоментировать - работает.
 
Добавлено:
Поэтому я заменил символ точки в качестве подстановочного знака -- на @

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 02:43 15-04-2022 | Исправлено: D1D1D1D, 02:45 15-04-2022
Mavrikii

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

Цитата:
Если её закоментировать - работает.

потому что она преобразует вашу \. в \[\\u0400-\\u04FF\\w]
что и создает проблему, которую я описал выше.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 02:51 15-04-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Добавил экранирование первой квадратной скобки - и вроде стандартно заработало:

Код:
pattern = pattern.replace(/./g, '\[\\u0400-\\u04FF\\w]');

 
Добавлено:
Всё-таки, что-то там не то

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 03:11 15-04-2022
Mavrikii

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

Цитата:
Добавил экранирование первой квадратной скобки - и вроде стандартно заработало:

зачем?? вы какую то отсебятину лепите.
вы меняете любой символ (о чем и говорит точка) на эту запись.
 
фактически, в регулярке, \. означает использование символа точки, а не любой символ как его представление точкой в регулярке. поэтому оттуда \ не придет, а приходит откуда то еще ранее.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 03:19 15-04-2022
D1D1D1D

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

Код:
В виджете из архива на все поисковые поля назначена функция, которая заменяет некоторые введенные символы на другие, например, букву Ё на Е. Сокращенно функция выглядит так —

Код:
function fix(obj) {
   obj.value = obj.value.replace(/[ё]/g, 'е');
}

В коде виджета строк больше, и замечено, что на некоторых версиях андроида при вводе букв — они дублируются. В связи с этим вопрос — есть ли другой способ прописать подобный функционал на input onkeyup?

Убрал всё что можно убрать из файла "index.js", и оказалось, что такое поведение, когда буквы дублируются, происходит только в верхних фильтрах, а общий поиск нормально работает. Так же это не зависит от браузера и происходит на версиях Андроида 7 по Андроид 11 (как минимум). Видимо, именно работа фильтров сказывается ("содержит", "не содержит", "начинается с" и тд.)

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 14:45 15-04-2022
Mavrikii

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

Цитата:
когда буквы дублируются, происходит только в верхних фильтрах

думаю, что дело не в фильтрах. оно вообще не должно вмешиваться, дублируя символ.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 22:14 15-04-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Это происходит в момент вывода результатов. То есть, всё нормально, пока происходит быстрый набор запроса. Но стоит немного замешкаться с вводом букв - как результаты обновляются и одновременно в поисковой строке дублируется то, что было до этого туда туда введено

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 05:37 16-04-2022 | Исправлено: D1D1D1D, 05:39 16-04-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет. Внизу приведен код, позволяющий проводить поиск по частям слов для виджета, который здесь не раз разбирался. Следующая строчка в приведенном фрагменте кода отвечает за поиск целых слов:

Код:
pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;

Возник вопрос — возможно ли назначить этот функционал на пункт из выпадающиего списка, как на скрине? Чтобы пользователь, желающий искать по целым словам, мог включить эту опцию в выпадающем списке —
 
   
 

Код:
    if (target === "filterRow" && selectedFilterOperations == 'contains') // && selectedFilterOperations == 'contains'
    {
        return [function(dataItem) {
            var pattern = getter(value);
            //pattern = pattern.replace(/(?<!\.)\*/g, '[\\u0400-\\u04FF\\w]*');
            pattern = pattern.replace(/\./g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, "=", true];
    } else {
        return [function(dataItem) {
            return getter(dataItem[self.dataField]);
        }, selectedFilterOperations || 'contains', value];
    }

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 19:13 06-05-2022 | Исправлено: D1D1D1D, 19:13 06-05-2022
Mavrikii

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

Цитата:
selectedFilterOperations == 'contains'

показывает какая опция выбрана - contains = содержит
если будет выбрано equals (или как то иначе может называться), то применяется другой алгоритм фильтрации.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 00:00 07-05-2022 | Исправлено: Mavrikii, 00:00 07-05-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Пробовал дублировать код, с заменой contains на equals, а также совмещенный вариант, но не срабатывает —

Код:
    if (target === "filterRow" && selectedFilterOperations == 'contains')
    {
        return [function(dataItem) {
            var pattern = getter(value);
            //pattern = pattern.replace(/(?<!\.)\*/g, '[\\u0400-\\u04FF\\w]*');
            pattern = pattern.replace(/@/g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, "=", true];
    } else {
        return [function(dataItem) {
            var pattern = getter(value);
            //pattern = pattern.replace(/(?<!\.)\*/g, '[\\u0400-\\u04FF\\w]*');
            pattern = pattern.replace(/@/g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, selectedFilterOperations || 'equals', value];
    }

 
В чем может быть ошибка?

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 01:31 07-05-2022
Mavrikii

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

Цитата:
В чем может быть ошибка?

наверно и потому, что нужно учитывать и target, плюс смотреть что там приходит и в каком виде.

Цитата:
    } else {
        return [function(dataItem) {
            return getter(dataItem[self.dataField]);
        }, selectedFilterOperations || 'contains', value];
    }

плюс не убивать этот else блок
 

Цитата:
с заменой contains на equals

я не знаю что там передается, посмотреть через брейкпоинт или console.log
 

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 01:41 07-05-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Так заработало, спасибо! —  
 

Код:
    if (target === "filterRow" && selectedFilterOperations == 'contains') {
        return [function(dataItem) {
            var pattern = getter(value);
            //pattern = pattern.replace(/(?<!\.)\*/g, '[\\u0400-\\u04FF\\w]*');
            pattern = pattern.replace(/@/g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, "=", true];
    } else if (target === "filterRow") {
        return [function(dataItem) {
            var pattern = getter(value);
            //pattern = pattern.replace(/(?<!\.)\*/g, '[\\u0400-\\u04FF\\w]*');
            pattern = pattern.replace(/@/g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, "=", true];
    } else {
        return [function(dataItem) {
            return getter(dataItem[self.dataField]);
        }, selectedFilterOperations || 'contains', value];
    }

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 04:43 07-05-2022
Mavrikii

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

Цитата:
Так заработало, спасибо! —  

в виду того, что там много идентичного кода, условие нужно ставить не в том месте
 

Код:
    if (target === "filterRow") {
        return [function(dataItem) {
            var pattern = getter(value);
            pattern = pattern.replace(/@/g, '[\\u0400-\\u04FF\\w]');
            pattern = pattern.replace(/,,/g, '.*');
            pattern = pattern.replace(/,/g, '[\\u0400-\\u04FF\\w]*');
            if (selectedFilterOperations == 'contains')
                pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}`;
            else
                 pattern = `(^|\\s|[^\\u0400-\\u04FF\\w]|\\b)${pattern}(?=\\s|[^\\u0400-\\u04FF\\w]|\\b|$)`;
            pattern = new RegExp(pattern, 'miu');
            var cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern)) {
                return true;
            } else {
                return false;
            }
        }, "=", true];
    } else {
        return [function(dataItem) {
            return getter(dataItem[self.dataField]);
        }, selectedFilterOperations || 'contains', value];
    }

не проверял

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 04:47 07-05-2022
D1D1D1D

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

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 04:56 07-05-2022
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли задать открытие документа по клику, не прописывая "HREF"? Код ниже не срабатывает

Код:
 
<u onclick="document.location=("about.html");return false;">

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 16:51 07-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D
https://ptpit.ru/learn/JSADV/02.htm

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 17:00 07-05-2022
D1D1D1D

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

Код:
<u onclick="document.location=(\"about.html\");return false;">

Всего записей: 1362 | Зарегистр. 05-04-2010 | Отправлено: 17:05 07-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D
Скобки круглые там зачем?

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 17:21 07-05-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