В настоящее время у меня есть этот код для пользовательской панели поиска 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.*
без пробелов, он откроет эту страницу в новой вкладке.
Спасибо за любую помощь!
Таким образом, один из способов справиться с этим — использовать условие 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://» в качестве протокола по умолчанию на случай, если значение поля ввода не имеет его.
Скрипт был обновлен, следите за переменной inputValue, теперь она объявлена с помощью 'let' вместо 'const'
@Brendan Пожалуйста, примите во внимание один из ответов. Он вознаграждает людей, отвечающих на вопросы, и помогает другим пользователям найти наиболее подходящее решение их проблемы, спасибо.
Спасибо за информацию! Это отлично работает для любой введенной вами ссылки с префиксом протокола, например
http://
, но когда URL-адрес вводится без него, напримерexample.com
илиhttps://example.com
, он перенаправляется на базовый домен размещенного сайта, за которым следует /{введенный URL} . Есть ли способ перенаправить домены даже при входе без протокола? Спасибо за помощь!