Игнорирование определенных дочерних элементов в jQuery - PullRequest
1 голос
/ 22 февраля 2012

У меня есть следующий код:

<table>
<th class="title2">The <i>very</i> hungry school</th><br />
<th class="title2">The very hungry school <span>yeah it works</span></th>

И ..

    function capitalise(str) {
        if (!str) return;
        var counter = 0;
        var stopWords = ['a', 'an', 'and', 'at', 'but', 'by', 'far', 'from', 'if', 'into', 'of', 'off', 'on', 'or', 'so', 'the', 'to', 'up'];
        str = str.replace(/\b\S*[a-z]+\S*\b/ig, function(match) {
            counter++;
            return $.inArray(match, stopWords) == -1 || counter === 1 ? match.substr(0, 1).toUpperCase() + match.substr(1) : match;
        });
        return str;
    }


    $('th.title2').each(function() {    

        var capclone = $(this).clone().children(':not(i)').remove().end();

        capclone.text(capitalise(capclone.text()));

        capclone.append($(this).children(':not(i)'));

        $(this).replaceWith(capclone);

    });​

Этот код работает для того, что мне нужно, но есть ли способ сохранить курсивный элемент. В настоящий момент его удаляют, это не плохое решение, но оно не идеальное.

1 Ответ

1 голос
/ 23 февраля 2012

Если вместо использования text() использовать html(), чтобы получить html как элемент, а затем заглавные буквы для каждого слова. Я немного упростил регулярное выражение до /\b\w+\b/ig, которое будет соответствовать границе слова, за которой следуют один или несколько символов и граница слова. Это также будет соответствовать начальному символу в HTML-теге, но это не должно вызывать никаких проблем. Вместо клонирования и замены узла я просто обновляю html, который должен быть быстрее, поскольку он легче при взаимодействии с DOM.

function capitalise(str) {
    if (!str) return;
    var stopWords = ['a', 'an', 'and', 'at', 'but', 'by', 'far', 'from', 'if', 'into', 'of', 'off', 'on', 'or', 'so', 'the', 'to', 'up'];
    str = str.replace(/\b\w+\b/ig, function(match) {
        return $.inArray(match, stopWords) == -1 ? match.substr(0, 1).toUpperCase() + match.substr(1) : match;
    });
    return str;
}

$('th.title2').each(function() {
    var capclone = $(this), newHtml = capitalise(capclone.html());
    capclone.html(newHtml);
});​

Вы можете играть с кодом в этой скрипке .

...