Удалить запрос из URL

Я хотел немного уточнить ответ безжизненным , потому что, когда я начал читать о том, как использовать super () в иерархии множественного наследования в Python, я не получил его немедленно.

Что вам нужно понять, так это то, что super(MyClass, self).__init__() предоставляет следующий метод next __init__ в соответствии с используемым алгоритмом упорядочивания разрешения метода (MRO) в контексте полного наследования иерархия .

Эта последняя часть имеет решающее значение для понимания. Рассмотрим снова пример:

class First(object):
  def __init__(self):
    super(First, self).__init__()
    print "first"

class Second(object):
  def __init__(self):
    super(Second, self).__init__()
    print "second"

class Third(First, Second):
  def __init__(self):
    super(Third, self).__init__()
    print "that's it"

В соответствии с этой статьей о порядке разрешения метода Гвидо ван Россума вычисляется порядок разрешения __init__ (до Python 2.3) используя «перекос по левому краю по глубине»:

Third --> First --> object --> Second --> object

После удаления всех дубликатов, кроме последнего, получаем:

Third --> First --> Second --> object

Итак, позволяет следить за тем, что происходит, когда мы создаем экземпляр класса Third, например x = Third().

  1. В соответствии с MRO __init__ третьего вызывается первым.
  2. Далее, согласно MRO, внутри метода __init__ super(Third, self).__init__() разрешается __init__ метод First, который вызывается.
  3. Внутри __init__ Первого super(First, self).__init__() вызывает __init__ из Во-вторых, потому что это то, что диктует MRO!
  4. Внутри __init__ of Second super(Second, self).__init__() вызывает __init__ объекта, что ничего не значит. После этого будет напечатан «второй».
  5. После завершения super(First, self).__init__() будет напечатан «первый».
  6. После завершения super(Third, self).__init__() будет напечатан «это все».

Это объясняет, почему создание экземпляра Third () приводит к:

>>> x = Third()
second
first
that's it

. Алгоритм MRO был улучшен с Python 2.3, чтобы хорошо работать в сложных случаях, но я думаю что использование «перемотки по глубине слева направо» + «удаление дубликатов ожидается для последнего» все еще работает в большинстве случаев (прокомментируйте, если это не так). Обязательно прочитайте сообщение в блоге Guido!

0
задан J.doe 7 March 2019 в 10:23
поделиться

1 ответ

Если я правильно понял, вы просто хотите добавить перезагрузку после нажатия на одно из ваших ключевых слов.

Вы не уточнили, хотите ли вы сделать это только в PHP, поэтому я даю вам решение только для javascript.

/** {string} URL queries in string */
let urlQueriesString = window.location.search,
/** {string[]} URL queries in array */
	urlQueriesArray = urlQueriesString.substring(1).split('&'),
/** {Object.<string, string>} URL queries in object */
	urlQueries = {},
/** {string[]} List of search keywords */
	searchKeywords = [],
/** {HTMLElement[]} List of <li> which will be inserted into DOM */
    liElements;

// Fills in urlQueries object
for (let i in urlQueriesArray) {
	urlQueriesArray[i] = urlQueriesArray[i].split('=');
    
    urlQueries[urlQueriesArray[i][0]] = urlQueriesArray[i][1];
}

// Gets search keywords from _sft_category parameter
searchKeywords = urlQueries._sft_category.split('+'); // or .split(' ')

// Inserts a <li> in the DOM for each keyword
for (let i in searchKeywords) {
	let ul = document.getElementsByTagName('ul')[0],
        html = `<li>${searchKeywords[i]}</li>`;
    
    ul.innerHTML += html;
}

// Gets inserted <li>
liElements = document.getElementsByTagName('li');

// Adds an event on click for each <li>
for (let i in liElements) {
    let li = liElements[i];
    
    // Checks instance type because last element of liElements is the length and we don't want to do what's following for this one
    if (li instanceof HTMLElement) {
    	// Creates new URL on click
        li.addEventListener('click', function() {
            let url = window.location.hostname + window.location.pathname,
                keyword = this.innerText;
                
            searchKeywords = searchKeywords.filter((kw) => (kw !== keyword));
            
            url += urlQueriesString.replace(/_sft_category=[\w\d_+-]+/, `_sft_category=${searchKeywords.join('+')}`);
            
            console.log(url);
            
            // Uncomment next line for reload with new url
            // window.location.href = url;
        });
    }
}
<ul></ul>

Этот фрагмент кода может быть упрощен, но в настоящее время он должен выполнять свою работу.

Возможно, вам придется немного адаптировать его, чтобы он работал с вашим проектом.

0
ответ дан Kévin Bibollet 7 March 2019 в 10:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: