-2

Google の検索ツール ([その他の検索ツール] を押したときに表示されるオプション) にオプションを追加する簡単な JavaScript を作成しようとしています。ただし、新しい要素を既存の要素に追加しようとすると、エラー。例:

var yr = document.getElementById('qdr_y'); 
yr.parent.insertBefore(k,yr);

yr2 行目は null であるため、例外をスローします。検索結果ページの直接のソース コードを調べたところ、基本的な結果ページには "すべての結果"、"その他の検索ツール"、および非表示の "少ない検索ツール" しか含まれていないことがわかりました。他のすべてのオプションは、他の方法で注入されます。

これらの他の要素にアクセスして、新しい要素を正しい場所に追加するにはどうすればよいですか?

4

2 に答える 2

1

そこにあります:

// ==UserScript==
// @name           TESTE
// @namespace      TESTE
// @description    TESTE
// @include        http*://*.google.*
// ==/UserScript==


var k = document.createElement('div');
k.innerHTML = "<center><b> bla bla </b></center>"
var yr = document.getElementById('gbmm'); 
yr.insertBefore(k,yr.firstChild);

(これは単なる例です。and タグは使用<center>しないでください<b>)。

ここに画像の説明を入力

このようなことを意味しない限り

ここに画像の説明を入力

次に、コードは次のようになります

// ==UserScript==
// @name           TESTE
// @namespace      TESTE
// @description    TESTE
// @include        http*://*.google.*
// ==/UserScript==

var k = document.createElement('li');
k.id = 'myoption'
k.className = 'tbou'
k.innerHTML = "<a href='http://userscripts.org/users/rasg' class='q qs'> Here is my option </a>"
var yr = document.getElementById('clir_1'); 
yr.parentNode.appendChild(k);

また、GM スクリプトに JQuery を追加することも検討してください。

// @require        http://code.jquery.com/jquery.min.js

コーディングがはるかに簡単です。

* 編集 *

あなたのコメントに基づいて

2番目のソリューションのように、ノードを「すべての検索ツール」に挿入しようとしています。ただし、あなたが投稿したことは、clir_1 の代わりに qdr_y を使用することを除いて、まさに私がすでに行っていることです!

次の(非常に単純な)コードが解決策です

// ==UserScript==
// @name           TESTE 3
// @namespace      TESTE 3
// @description    TESTE 3
// @require        http://code.jquery.com/jquery.min.js
// @include        http*://www.google.com/*
// ==/UserScript==

$(window).load(function(){
    $('.tbpc').click()
    $('.tbt').on('DOMNodeInserted', function() {
        if ($('#my_li').length) { $('#my_li').show() }
        else { $('#whv_').parent().append("<li id='my_li' class='tbou' style=''><a class='q qs' href='http://userscipts.org'>Now i am inside</a>") }
    })
    $('.tbpo').on('click', function() { $('#my_li').hide() })
});

ここに画像の説明を入力

それは私が望むほどきれいではありませんが、グーグルは私たちに悪いことをさせます:)

于 2012-04-14T06:17:27.937 に答える
0

parentコード スニペットではparentNode.

とにかく、一般的に、動的要素の場合は、ターゲット要素を確認して待つ必要があります。何かをクリックする必要がある場合は、スクリプトでクリックする必要があります。(通常、Google サイトでページ JS 機能を使用しようとしてもうまくいきません。Google ページは常に、スクリプトを作成するのに非常に「楽しい」ものです。;))

AJAX の遅延を補うために、ポーリングを多用する必要があります。(AJAX イベントへのフックまたはミューテーション イベントの使用はどちらも、成功に対する苦痛の比率が高くなります。ポーリングはうまく機能します。)

最後に、これは Google であるため、投票を 1 回実行するだけでは十分ではありません。これらの検索オプションは常に上書きされているからです。

これは、米国版の Google 検索結果で機能するサンプル スクリプトです (jQuery が必要です)。

// ==UserScript==
// @name        _Google Search options add
// @include     http://www.google.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==

if (window.top != window.self)  //-- Don't run on frames or iframes.
    return;

/*-- This script:
    1) Waits for the "More search tools" control.
    2) Clicks that control.
    3) Waits for the target element
    4) Adds our element before that one.
*/

waitForKeyElements ("#tbpi", clickMoreSearchToolsLink);

function clickMoreSearchToolsLink (jNode) {
    var clickEvent  = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);

    waitForKeyElements ("#qdr_y", addOurExtraNodes);
}

function addOurExtraNodes (jNode) {
    jNode.before ("<li>Look at me, Ma!</li>");
}


/*--- waitForKeyElements():  A handy, utility function that
    does what it says.
*/
function waitForKeyElements (
    selectorTxt,    /* Required: The jQuery selector string that
                        specifies the desired element(s).
                    */
    actionFunction, /* Required: The code to run when elements are
                        found. It is passed a jNode to the matched
                        element.
                    */
    bWaitOnce,      /* Optional: If false, will continue to scan for
                        new elements even after the first match is
                        found.
                    */
    iframeSelector  /* Optional: If set, identifies the iframe to
                        search.
                    */
) {
    var targetNodes, btargetsFound;

    if (typeof iframeSelector == "undefined")
        targetNodes     = $(selectorTxt);
    else
        targetNodes     = $(iframeSelector).contents ()
                                           .find (selectorTxt);

    if (targetNodes  &&  targetNodes.length > 0) {
        /*--- Found target node(s).  Go through each and act if they
            are new.
        */
        targetNodes.each ( function () {
            var jThis        = $(this);
            var alreadyFound = jThis.data ('alreadyFound')  ||  false;

            if (!alreadyFound) {
                //--- Call the payload function.
                actionFunction (jThis);
                jThis.data ('alreadyFound', true);
            }
        } );
        btargetsFound   = true;
    }
    else {
        btargetsFound   = false;
    }

    //--- Get the timer-control variable for this selector.
    var controlObj      = waitForKeyElements.controlObj  ||  {};
    var controlKey      = selectorTxt.replace (/[^\w]/g, "_");
    var timeControl     = controlObj [controlKey];

    //--- Now set or clear the timer as appropriate.
    if (btargetsFound  &&  bWaitOnce  &&  timeControl) {
        //--- The only condition where we need to clear the timer.
        clearInterval (timeControl);
        delete controlObj [controlKey]
    }
    else {
        //--- Set a timer, if needed.
        if ( ! timeControl) {
            timeControl = setInterval ( function () {
                    waitForKeyElements (    selectorTxt,
                                            actionFunction,
                                            bWaitOnce,
                                            iframeSelector
                                        );
                },
                200
            );
            controlObj [controlKey] = timeControl;
        }
    }
    waitForKeyElements.controlObj   = controlObj;
}
于 2012-04-14T07:51:35.480 に答える