Как сделать так, чтобы панель поиска с кнопкой <input> открывала домен при вводе?

В настоящее время у меня есть этот код для пользовательской панели поиска DuckDuckGo:

<form action = "https://duckduckgo.com/" method = "get" id = "ddg-search">
    <div class = "div-block-4">
        <input autofocus = "true" class = "text-field-3 hero-search-bar w-input" data-name = "q" id = "field-3" maxlength = "256" name = "q" placeholder = "Search DuckDuckGo" type = "text">
    </div>
</form>

Он автоматически открывает URL-адрес https://duckduckgo.com/?q = {{SEARCH}}, когда вы вводите текст в поле и нажимаете клавишу ввода.

Как я могу заставить этот бар перейти к домену, если он введен? В идеале он не будет проверять домен, просто если он увидит строку в шаблоне xxxx.* без пробелов, он откроет эту страницу в новой вкладке.

Спасибо за любую помощь!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
318
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Таким образом, один из способов справиться с этим — использовать условие if и сверить строку с RegExp, который распознает доменные имена.

Вот отличный, который вы можете использовать:

/[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+/

Я предполагаю, что вам не нужна помощь в получении значения из вашего текстового поля или фактического перенаправления. Однако, если вам нужна дополнительная помощь, прокомментируйте ниже, и я опубликую более полный ответ. Код ниже должен помочь вам добраться туда, куда вы хотите:

var domainRegExp = /[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+/

var pass = domainRegExp.test('test.com')
var fail = domainRegExp.test('test')

console.info(pass, 'pass')
console.info(fail, 'fail')

Итак, как вы можете видеть, значение внутри переменной «pass» равно true, а «fail» — false.

Ответ принят как подходящий

Один из способов решить эту проблему — перехватить событие отправки формы, проанализировать входное значение и, если это домен, открыть новое окно с доменом и отменить отправку, вернув false. В случае недействительного домена пусть форма работает как обычно, возвращая true.

Ваш html:

<form action = "https://duckduckgo.com/" method = "get" onsubmit = "return decideWhatToDo()" id = "ddg-search">
    <div class = "div-block-4">
        <input autofocus = "true" class = "text-field-3 hero-search-bar w-input" data-name = "q" id = "field-3" maxlength = "256" name = "q" placeholder = "Search DuckDuckGo" type = "text">
    </div>
    <input type = "submit" />
</form>

Ваш javascript:

function decideWhatToDo() {  
  let inputValue = document.getElementById('field-3').value;

  if (isDomain(inputValue)) {
    // the form won't be sent and a new window will open requesting the domain    
    if (!startsWithProtocol(inputValue)) {
      inputValue = 'http://' + inputValue;
    }

    window.open(inputValue, '_blank');
    return false;
  } 

  // Proceed to send the form as usual
  return true;
}

function startsWithProtocol(value) {
  return /^((https?|ftp|smtp)://)/.test(value);
}

function isDomain(value) {
  return /^((https?|ftp|smtp)://)?(www.)?[a-z0-9]+\.[a-z]+(/[a-zA-Z0-9#]+/?)*$/.test(value);
}

Спасибо за информацию! Это отлично работает для любой введенной вами ссылки с префиксом протокола, например http://, но когда URL-адрес вводится без него, например example.com или https://example.com, он перенаправляется на базовый домен размещенного сайта, за которым следует /{введенный URL} . Есть ли способ перенаправить домены даже при входе без протокола? Спасибо за помощь!

bdn 08.04.2019 18:01

Вы правы, браузер интерпретирует это как относительный путь. Я собираюсь изменить сценарий, чтобы он добавлял «http://» в качестве протокола по умолчанию на случай, если значение поля ввода не имеет его.

f-CJ 08.04.2019 18:41

Скрипт был обновлен, следите за переменной inputValue, теперь она объявлена ​​с помощью 'let' вместо 'const'

f-CJ 08.04.2019 18:45

@Brendan Пожалуйста, примите во внимание один из ответов. Он вознаграждает людей, отвечающих на вопросы, и помогает другим пользователям найти наиболее подходящее решение их проблемы, спасибо.

f-CJ 11.04.2019 00:05

Другие вопросы по теме