Выберите элемент тока в jQuery

Чтобы использовать регулярные выражения непосредственно в формулах Excel, может помочь следующая UDF (функция, определенная пользователем).

Как это работает

Он принимает 2-3 параметра.

  1. Текст для использования регулярного выражения.
  2. Регулярное выражение.
  3. Строка формата, определяющая, как должен выглядеть результат. Он может содержать $0, $1, $2 и т. Д. $0 - это полное совпадение, $1 и up соответствуют соответствующим группам совпадений в регулярном выражении. По умолчанию $0.

Некоторые примеры

Извлечение адреса электронной почты:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Результаты в: some@email.com

Извлечение нескольких подстрок:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Результаты в: E-Mail: some@email.com, Name: Peter Gordon

Чтобы разделить объединенную строку в одной ячейке на ее компоненты в нескольких ячейках:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Результаты в: Peter Gordon some@email.com ...

Как использовать

Чтобы использовать этот UDF, выполните следующие действия (примерно на основе этой страницы Microsoft . У них есть дополнительная дополнительная информация!):

  1. В Excel в файле с поддержкой макроса («.xlsm») нажмите ALT+F11, чтобы открыть Редактор Microsoft Visual Basic для приложений .
  2. Добавить ссылку VBA в библиотеку регулярных выражений (бесстыдно скопировано из Portland Runners ++ answer ): нажмите Инструменты -> Ссылки (пожалуйста, извините немецкий скриншот) Tools -> References [/g14] Найдите Microsoft VBScript Regular Expressions 5.5 в списке и поставьте галочку рядом с Это. Нажмите OK .
  3. Нажмите Insert Module . Если вы присвоите модулю другое имя, убедитесь, что модуль не имеет то же имя, что и UDF ниже (например, имя модуля Regex, а функция regex вызывает #NAME! ). Second icon in the icon row -> Module [/g15]
  4. В большом текстовом окне в середине вставьте следующее:
    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
    
  5. Сохраните и закройте Microsoft Visual Basic для приложений Окно редактора.

39
задан j0k 4 December 2012 в 08:23
поделиться

4 ответа

К счастью, селекторы jQuery позволяют Вам намного больше свободы:

$("div a").click( function(event)
{
   var clicked = $(this); // jQuery wrapper for clicked element
   // ... click-specific code goes here ...
});

... присоединит указанный обратный вызов к каждому <a> содержавшийся в <div>.

69
ответ дан Shog9 27 November 2019 в 02:25
поделиться

Когда событие щелчка jQuery называет Ваш обработчик событий, оно устанавливает "это" на объект, на который нажали. Для превращения его в объект jQuery просто передайте его функции "$": $(this). Так, для получения, например, следующего одноуровневого элемента, Вы сделали бы эту внутреннюю часть обработчик щелчков:

var nextSibling = $(this).next();

Редактирование: После чтения комментария Kevin, я понял, что мог бы ошибиться о том, что Вы хотите. Если Вы хотите сделать то, что он спросил, т.е. выберите соответствующую ссылку в другом отделении, Вы могли использовать $(this).index() для получения положения нажатой ссылки. Тогда Вы выбрали бы ссылку в другом отделении его положением, например, с "eq" методом.

var $clicked = $(this);
var linkIndex = $clicked.index();
$clicked.parent().next().children().eq(linkIndex);

, Если Вы хотите быть в состоянии пойти обоими путями, Вам будет нужен некоторый способ определить, какое отделение Вы находитесь в том, таким образом, Вы знаете, нужно ли Вам "затем ()" или "предыдущий ()" после "родителя ()"

9
ответ дан Matthew Crumley 27 November 2019 в 02:25
поделиться

Для выбора одноуровневого элемента Вам было бы нужно что-то как:

$(this).next();

Так, комментарий Shog9 не корректен. В первую очередь, необходимо было бы назвать переменную "нажатой" за пределами функции щелчка отделения, иначе, это потеряно после того, как щелчок происходит.

var clicked;

$("div a").click(function(){
   clicked = $(this).next();
   // Do what you need to do to the newly defined click here
});

// But you can also access the "clicked" element here
0
ответ дан Josh Delsman 27 November 2019 в 02:25
поделиться

Здесь вы найдете методы siblings () и parent () .

// assuming A1 is clicked
$('div a').click(function(e) {
    $(this); // A1
    $(this).parent(); // the div containing A1
    $(this).siblings(); // A2 and A3
});

Сочетание этих методов с иSelf () позволит вам манипулировать любой комбинацией этих элементов по вашему желанию.

Edit: комментарий, оставленный Марком относительно делегирования событий на ответ Shog9, очень хороший. Самый простой способ сделать это в jQuery - использовать метод live () .

// assuming A1 is clicked
$('div a').live('click', function(e) {
    $(this); // A1
    $(this).parent(); // the div containing A1
    $(this).siblings(); // A2 and A3
});

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

5
ответ дан 27 November 2019 в 02:25
поделиться
Другие вопросы по тегам:

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