Проблема выбора непрочитанных сообщений в Gmail с помощью JQuery - PullRequest
1 голос
/ 14 сентября 2011

В Gmail, нажав на флажок, показанный ниже, вы выбираете все сообщения, и я делаю пользовательский скрипт (для личного использования, и он мне нужен для работы в Chrome), который выберет непрочитанноетолько сообщения (только первые 2 сообщения на скриншоте ниже непрочитаны) вместо поведения по умолчанию этого флажка.

enter image description here

Моя первая идея - смоделировать события кликаи хотя я мог получить доступ к «непрочитанному» пункту меню в порядке с помощью кода ...

var unread_menuitem = document.getElementById('canvas_frame').contentWindow.document.getElementById(':s2');
$(unread_menuitem).css({'border':'thin red solid'});

enter image description here

и отправить ему событие click, используя код ...

var clickEvent = document.createEvent('MouseEvents');
clickEvent.initEvent( 'click', true, true );
unread_menuitem.dispatchEvent(clickEvent); // Chrome's console returned 'true'

непрочитанные сообщения не выделяются.


Моя вторая идея заключалась в том, чтобы форсировать выбор, установив флажок $('#canvas_frame').contents().find('tr.zE input').prop('checked', true) и применить стили CSS, к которым применяется Gmail.событие щелчка вручную, но хотя я смог сопоставить событие щелчка вручную как визуально, так и с точки зрения DOM (afaik) ...

enter image description here

Gmail говорит: «Нет разговоров»выбрано "при выполнении какого-либо действия, в этом случаеЯ сделал «Пометить как прочитанное».Я также хочу отметить, что ручное нажатие на флажки, которые были установлены в этом состоянии с использованием моего метода грубой силы, не сняло их, как вы ожидаете.Им нужно было одно дополнительное ручное нажатие, чтобы убрать галочку.

enter image description here

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

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Решено, просто, как пирог, и теперь, когда я об этом думаю, это решение, указанное в ответе пользователя PirateKitten - вместо того, чтобы «снимать галочки» с непрочитанных сообщений, таких как моя вторая идея, моделировать вместо этого нажимает на эти флажки. Работает как чудо, и вот код, который вы можете запустить в консоли Chrome при использовании Gmail (не требует jQuery btw):

var unreadMessages = document.getElementById('canvas_frame').contentWindow.document.querySelectorAll('tr.zE input');
var numMessages = unreadMessages.length;
while ( numMessages-- ) {
    var clickEvent = document.createEvent('MouseEvents');
    clickEvent.initEvent( 'click', true, true );
    unreadMessages[numMessages].dispatchEvent(clickEvent); 
}

Вот мой полный скрипт , который вы можете запустить внутри своей консоли Chrome (или превратить его в расширение / usercript), чтобы изменить стандартное поведение флажка с выбора ВСЕХ сообщений только на непрочитанные сообщения:

var hasUILoaded = setInterval( function() {
    if( document.getElementById('canvas_frame').contentDocument.getElementsByClassName('J-Zh-I J-J5-Ji J-Pm-I L3') ) {
        clearInterval( hasUILoaded );
        setTimeout( function() {
            var content_frame = document.getElementById('canvas_frame').contentDocument;
            var chkbox = content_frame.getElementsByClassName( 'J-Zh-I J-J5-Ji J-Pm-I L3' );
            var chkbox = chkbox[0].childNodes[0];
            var unreadMessages = content_frame.getElementsByClassName('zE'); // DOM structure: <tr class=zE> <td> <img><input> </td> </tr> so we add ".childNodes[0].childNodes[1]" whenever we want to access the check boxes of each message.
            var allMessages = content_frame.getElementsByClassName('zA');            

            chkbox.onclick = function() {
                if( chkbox.checked ) {
                    var numUnread = unreadMessages.length;;
                    var numAll  = allMessages.length;
                    setTimeout(function () { 
                        if( allMessages[0].childNodes[0].childNodes[1].checked ) { 
                            while ( numAll-- ) {
                                var clickEvent = document.createEvent('MouseEvents');
                                clickEvent.initEvent( 'click', true, true ); 
                            allMessages[numAll].childNodes[0].childNodes[1].dispatchEvent(clickEvent);       
                            }
                        }
                    }, 10);

                    setTimeout(function (){
                        if(!unreadMessages[0].childNodes[0].childNodes[1].checked) {
                            while ( numUnread-- ) {
                                var clickEvent = document.createEvent('MouseEvents');
                                clickEvent.initEvent( 'click', true, true ); 
                unreadMessages[numUnread].childNodes[0].childNodes[1].dispatchEvent(clickEvent);  
                            }
                        }
                    }, 30);
                }
            }
        }, 100);
    }
}, 300);
1 голос
/ 14 сентября 2011

Здесь есть сценарий здесь , который выглядит так, как будто вы пытаетесь сделать.Это весь сценарий, который вам нужно было создать, или это просто часть функциональности?

Согласно обсуждениям, они создали его для Firefox, в котором он работает, некоторые люди отметили, что он не работает вChrome, так что вы можете искать решение, которое должно быть нацелено на разные браузеры (ваш вопрос не указывает, должно ли оно работать в Chrome, только то, что вы его использовали).

Это то, что они используютчтобы выбрать непрочитанные сообщения, похоже, что они имитируют события mousedown и mouseup для каждого элемента:

var handler = function(type,e) {
    e.preventDefault();
    e.stopPropagation();

    var e2 = document.createEvent('MouseEvents');
    e2.initEvent('mousedown',true,false); 
    var el = anchor.wrappedJSObject;
    el.dispatchEvent(e2);

    setTimeout(function() {
        var el = document.querySelectorAll('div[selector='+type+'] > div')[0].wrappedJSObject;
        var e2 = document.createEvent('MouseEvents');
        e2.initEvent('mouseup',true,false); 
        el.dispatchEvent(e2);
    },100);
}

Они вызывают это, устанавливая событие щелчка ниже, которое вызывает handler('unread',e);

...