Як перевірити, чи містить URL заданий рядок?


361

Як я міг зробити щось подібне:

<script type="text/javascript">
$(document).ready(function () {
    if(window.location.contains("franky")) // This doesn't work, any suggestions?
    {
         alert("your url contains the name franky");
    }
});
</script>

"window.location.contains is not a function"
ген b.

Відповіді:


656

Вам потрібно додати властивість href і перевірити indexOfзамістьcontains

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
  $(document).ready(function() {
    if (window.location.href.indexOf("franky") > -1) {
      alert("your url contains the name franky");
    }
  });
</script>


3
У мене є така довга URL-адреса, preview.tbwabox.co.nz/_v005/index.html#buying-a-car, і я хочу перевірити, чи рядок містить "покупка автомобіля, але сценарій" не працює ?
Венсох

6
@Vennsoh Ви не можете знайти «покупки-а-кар» , тому що ви повинні дивитися в window.location.hashНЕ window.location.href. Просто замініть ці значення у функції ОП.
Адріан Гонсалес

1
@JW Чому `> -1` ми не можемо використовувати`> 0`?
Ельшан

5
@Elshan Тому що, строго кажучи, .href.indexOf("franky") можна повернути значення 0, якщо .hrefпочинається з "відвертого". Звичайно, у цьому випадку це ніколи не відбувається так, як .hrefзавжди починається з протоколу, як правило, "http:" або "file:". Незважаючи на це, ВИНАГО слід використовувати> -1,> = 0 або, на мою перевагу,! == - 1 при порівнянні з результатом indexOf().
robinCTS

У мене є масив значень і хочу перевірити, чи має URL-яке значення, і дайте мені індекс масиву, який відповідає умові. Як це зробити? Дякую.
Si8

101
if (window.location.href.indexOf("franky") != -1)

зробив би це. Крім того, ви можете використовувати регулярний вираз:

if (/franky/.test(window.location.href))

4
Плюси / мінуси між двома варіантами були б приємним доповненням до цієї відповіді.
Кріс

Але якби я використав вираз регулярного вираження, ніхто не зміг би його прочитати;)
RayLoveless

26

Ви б використовували indexOfтак:

if(window.location.href.indexOf("franky") != -1){....}

Також зауважте додавання hrefрядка в іншому випадку:

if(window.location.toString().indexOf("franky") != -1){....}

23

так:

    <script type="text/javascript">
        $(document).ready(function () {
            if(window.location.href.indexOf("cart") > -1) 
            {
                 alert("your url contains the name franky");
            }
        });
    </script>

Яка різниця між викликом window.location.indexOf та window.location.href.indexOf?
starsplusplus

@starsplusplus Різниці немає. window.location.hrefє псевдонімом window.location developer.mozilla.org/en-US/docs/Web/API/Window.location
Адріан Гонзалес

Наведене вище для мене добре працює, але для двох змінних, як перевірити його, містяться обидва значення
Vinoth Narayan

1
@VinothNarayan Ви можете просто додати ще одну умову до ifзаяви. Щоб переконатися, що він має обидва, ви можете скористатися оператором AND, який знаходиться &&в Javascript: if( window.location.href.indexOf("cart") > -1 && window.location.href.indexOf("box") > -1 ) Щоб перевірити, чи має він те чи інше значення, використовуйте оператор АБО, який є двома символами труби|| if( window.location.href.indexOf("cart") > -1 || window.location.href.indexOf("box") > -1 )
Адріан Гонзалес

19

window.locationце не рядок, але він має toString()метод. Тож ви можете це зробити так:

(''+window.location).includes("franky")

або

window.location.toString().includes("franky")

Зі старих документів Mozilla :

Об'єкти розташування мають метод toString, який повертає поточну URL-адресу. Ви також можете призначити рядок window.location. Це означає, що ви можете працювати з window.location так, ніби це був рядок у більшості випадків. Іноді, наприклад, коли вам потрібно викликати метод String на ньому, вам доведеться явно зателефонувати доString.


2
У Firefox 48 видалено String.prototype.contains (). Використовуйте тільки String.prototype.includes (). Дивіться тут
CaseyC

@CaseyC Змінено. Дякую!
Алін Пуркару

9

Регекс-спосіб:

var matches = !!location.href.match(/franky/); //a boolean value now

Або в простій заяві, яку ви можете використовувати:

if (location.href.match(/franky/)) {

Я використовую це для перевірки того, чи веб-сайт працює локально чи на сервері:

location.href.match(/(192.168|localhost).*:1337/)

Це перевіряє, чи містить href192.168 або localhostAND, чи слід за ним :1337.

Як бачите, використання regex має свої переваги перед іншими рішеннями, коли умова стає трохи складніше.


Приємно. Я використовував if (window.parent.location.href.match (/ \? /)) {Window.parent.location = window.parent.location.pathname; } і це працює дуже добре ...
Тарік

Крім того, мені здається трохи більш стислим використовувати, if(/franky/.test(location.href)) { /* regex matched */ }якщо я нічого не роблю з сірниками.
cchamberlain

Так, testнапевно чистіше, ніж matchу цьому випадку.
Стефан Біцзіттер

6

document.URLповинні отримати вам URLі

if(document.URL.indexOf("searchtext") != -1) {
    //found
} else {
    //nope
} 

6

Спробуйте це, це коротше і працює точно так window.location.href:

if (document.URL.indexOf("franky") > -1) { ... }

також якщо ви хочете перевірити попередню URL-адресу:

if (document.referrer.indexOf("franky") > -1) { ... }

@sixstarpro Я не робив знімку, але, о, я не знаю, можливо, очевидно, тому що ти дав таку ж відповідь, як цей, розміщений 18 місяців раніше! Крім того, додаткова інформація про document.referrerце абсолютно не має значення для питання.
robinCTS

4

Легше це стає

<script type="text/javascript">
$(document).ready(function () {
    var url = window.location.href;
    if(url.includes('franky'))    //includes() method determines whether a string contains specified string.
    {
         alert("url contains franky");
    }
});
</script>

3

Спробуйте це:

<script type="text/javascript">             
    $(document).ready
    (
        function () 
        { 
            var regExp = /franky/g;
            var testString = "something.com/frankyssssddsdfjsdflk?franky";//Inyour case it would be window.location;
            if(regExp.test(testString)) // This doesn't work, any suggestions.                 
            {                      
                alert("your url contains the name franky");                 
            }             
        }
    );         
</script> 

3

Спробуйте indexOf

if (foo.indexOf("franky") >= 0)
{
  ...
}

Ви також можете спробувати пошук (для регулярних виразів)

if (foo.search("franky") >= 0)
{
  ...
}

2

Використовуйте Window.location.href, щоб взяти URL в JavaScript. це властивість, яка повідомить вам поточне місцезнаходження URL-адреси веб-переглядача. Встановлення властивості на щось інше призведе до перенаправлення сторінки.

if (window.location.href.indexOf('franky') > -1) {
     alert("your url contains the name franky");
}

Як перевірити, чи URL-адресом є сторінка за замовчуванням, а перевірка iam рядка не видно. як, наприклад, sample.com/homepage.aspx - це моя сторінка, і я шукаю рядок 'homepage'. якщо ((loc.toString (). toUpperCase (). indexOf ('домашня сторінка')> -1)) {} працює нормально, але коли Iam на sample.com (який все ще вказує на homepage.aspx) код вище не працюватиме. Як перевірити цей сценарій? Будь ласка, допоможіть!
Sweta

2

Мені подобається створити, booleanа потім використовувати це в логіці if.

//kick unvalidated users to the login page
var onLoginPage = (window.location.href.indexOf("login") > -1);

if (!onLoginPage) {
  console.log('redirected to login page');
  window.location = "/login";
} else {
  console.log('already on the login page');
}

1

Помістіть у свій js файл

                var url = window.location.href;
                console.log(url);
                console.log(~url.indexOf("#product-consulation"));
                if (~url.indexOf("#product-consulation")) {
                    console.log('YES');
                    // $('html, body').animate({
                    //     scrollTop: $('#header').offset().top - 80
                    // }, 1000);
                } else {
                    console.log('NOPE');
                }

Я не знав ~, тому переглянув це: " ~це трюк, щоб перетворити indexOf()знайдене повернене значення в truthy (роблячи при цьому не знайдене як хибне). Люди інакше використовують це для його побічного ефекту обрізання чисел ..." - stackoverflow.com/a/12299678/3917091
Регулярний Джо

1

Регулярні вирази будуть більш оптимальними для багатьох людей через межі слів \bабо подібні пристрої. Межі слова виникають , коли який - або з 0-9, a-z, A-Z, _знаходяться на тій стороні , на наступний матч, або коли буквено - цифровий підключається до символьні рядки або кінець рядка або початок.

if (location.href.match(/(?:\b|_)franky(?:\b|_)))

Якщо ви користуєтесь if(window.location.href.indexOf("sam"), ви отримаєте сірники flotsamі same, серед інших слів. tomвідповідав би томатів і завтра, без регулярного вираження.

Зробити це чутливим до регістру так само просто, як і видалення i.

Крім того, додати інші фільтри так само просто

if (location.href.match(/(?:\b|_)(?:franky|bob|billy|john|steve)(?:\b|_)/i))

Давайте поговоримо (?:\b|_). RegEx зазвичай визначається _як word characterтак, що не викликає межі слова. Ми використовуємо це (?:\b|_)для вирішення цього питання. Щоб побачити, чи він знаходить, \bабо _з обох боків рядка.

В інших мовах може знадобитися щось подібне

if (location.href.match(/([^\wxxx]|^)(?:franky|bob|billy|john|steve)([^\wxxx]|$)/i))
//where xxx is a character representation (range or literal) of your language's alphanumeric characters.

Все це простіше, ніж говорити

var x = location.href // just used to shorten the code
x.indexOf("-sam-") || x.indexOf("-sam.") || x.indexOf(" sam,") || x.indexOf("/sam")...
// and other comparisons to see if the url ends with it 
// more for other filters like frank and billy

Підтримка регулярних виразів інших мов підтримує, \p{L}але JavaScript не робить, що значно спростить завдання виявлення іноземних символів. Щось на зразок[^\p{L}](filters|in|any|alphabet)[^\p{L}]


Єдиною стороною до регулярних виразів є те, що вони "лише записувати" (тобто неможливо читати);)
RayLoveless

@RayLoveless Так, мовами без (?#comments)і безперервного поширення, # commentsяк JavaScript. Однак прочитати цей не важко. // Коли я використовую складний регулярний вираз у JavaScript, я зберігаю коментовану копію, яку я можу редагувати lol.
Регулярний Джо

0

Припустимо, у вас є цей сценарій

<div>
  <p id="response"><p>
  <script>
    var query = document.location.href.substring(document.location.href.indexOf("?") + 1);
    var text_input = query.split("&")[0].split("=")[1];
    document.getElementById('response').innerHTML=text_input;
  </script> </div>

І форма URL є www.localhost.com/web_form_response.html?text_input=stack&over=flow

Текст, написаний на <p id="response">, будеstack


0

Це буде хорошою практикою, якщо ви перетворите рядок у нижній чи верхній регістр, оскільки метод indexof () чутливий до регістру. Це буде, якщо ваш пошук не є чутливим до регістру розумом, тож для пошуку, який не враховує регістри, це буде:

var string= location.href;
var convertedString= string.toLowerCase();
 if(convertedString.indexOf(franky) != -1){
  alert("url has franky");
}
else{
 alert("url has no franky");
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.