LINUX.ORG.RU

Заменить содержимое div, зная class и содержимое

 , ,


0

0

Дано: динамически генерируемая страница на плюсаче. Люди в кругах представлены элементами вида

<div class="jn Gs">Linus Torvalds</div>
Элементы различаются только текстом между <div…> и </div>.

Требуется: дописать текст в элементе. Например:

The Linus Torvalds

После поисков и консультаций нарисовался код для greasemonkey:

// ==UserScript==
// @name        G+ tags
// @namespace   https://plus.google.com/*
// @description Tag people in circles
// @include     https://plus.google.com/*
// @version     1
// ==/UserScript==


​​var elements = document.getElementsByClassName("jn Gs");
for(i=0;i<=elements.length;i++) {
    content = elements[i].innerHTML;
    switch(content) {
        case "Linus Torvalds" :
            elements[i].innerHTML = "The " + content;
            break;
        default : 
            elements[i].innerHTML = content + " - who?";
    }            
}

Но получился Fig. 1. Кто подскажет, что могло пойти не так?

Или как можно решить задачу с помощью других, желательно простых инструментов типа Stylish?

★★★★

document.getElementsByClassName(«jn Gs»);

jn и Gs это два разных класса.

mopsene ★★★ ()
Ответ на: комментарий от mopsene

jn и Gs это два разных класса.

Хорошо, вот такой вариант:

// ==UserScript==
// @name        G+ tags
// @namespace   https://plus.google.com/circles/*
// @description Tag people in circles
// @include     https://plus.google.com/circles/*
// @version     1
// ==/UserScript==

var divs = document.getElementsByTagName('div');
for (var i=0, len=divs.length; i<len; i++){
    var current = divs[i],
        cName = current.className;
    if (cName.indexOf('jn') > -1 && cName.indexOf('Gs') > -1) {
        switch (current.firstChild.nodeValue) {
            case 'Linus Torvalds':
                current.firstChild.nodeValue = 'The ' + current.firstChild.nodeValue;
                break;
        }
    }
}
Тоже фигвам.

Xenesz ★★★★ ()
Ответ на: комментарий от Xenesz

Ты все делаешь неправильно. =)

Я тебе завтра правильный вариант напишу, а то у меня уже 3 часа ночи.

mopsene ★★★ ()
Ответ на: комментарий от Kalashnikov

всё могло бы быть

С этого я попытался начать, но не вкурил.

Xenesz ★★★★ ()
var elements = document.getElementsByClassName("jn")

for (var i = 0; i < elements.length; ++i) {
    var e = elements[i].getElementsByClassName('Gs')
    for(var j = 0; j < e.length; ++j) {
        var content = e[j].innerText
            switch(content) {
                case "Linus Torvalds" :
                    elements[i].innerText = "The " + content;
                    break;
                default : 
                    elements[i].innerText = content + " - who?";
            }            
    }
}

Как-то так. Если не работает — напиши, что отладчик выводит, я скажу что делать. Мне влом это всё воспроизводить.

sphericalhorse ★★★★ ()
Ответ на: комментарий от sphericalhorse

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

В DOM элемента не нашёл свойства innerText, нашёл innerHTML с искомым значением, заменил, но разницы не увидел. То же с textContent.

Xenesz ★★★★ ()
Ответ на: комментарий от sphericalhorse

Что было в дивах, то и выводится без изменений. Ошибок не видать.

Xenesz ★★★★ ()
Ответ на: комментарий от sphericalhorse

На ДжС-фидле всё работет.

Не совсем. Ёпперный теятр, оно не работает в джсфидле в файрфоксе, но работает в опере и гуглхроме.

Такая штука сработала во всех браузерах в песочнице

var divs = document.getElementsByTagName('div');

for (var i=0, len=divs.length; i<len; i++){
    var current = divs[i];
    if (current.className == 'jn Gs') {
        switch (current.firstChild.nodeValue) {
            case 'Linus Torvalds':
                current.firstChild.nodeValue = 'The ' + current.firstChild.nodeValue;
                break;
            case "I'm sexy and I know it":
                 current.firstChild.nodeValue += ' sure';
                 break;
            default:
                current.firstChild.nodeValue += ' WTF';
                 break;
         }
    }
}
Да вот беда, в гризманки в файрфоксе она не работает >_<

Xenesz ★★★★ ()
Последнее исправление: Xenesz (всего исправлений: 1)
Ответ на: комментарий от Xenesz

В гуглхроме на целевой странице тоже не работает :(

Xenesz ★★★★ ()
Ответ на: комментарий от Xenesz

Хм, странно. У меня тоже скрипты не работают в гризманки, может там js какой-то другой?

mopsene ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.