4

探索中のイベントを追跡するUnicreaturesのユーザースクリプトに取り組んでいます。それは機能しています(まあ、それは機能しますが、それでもいくつかの作業が必要です笑)が、すべてのステップのポップアップアラートを含まない、収集している情報を表示する方法が必要です。

ページ上にボックスを作成して、その中にコンテンツを表示するにはどうすればよいですか?

このページのメニューの左側にあるフレームやウィンドウなどを作成し、スクリプトの実行時にさまざまな変数の値を書き込みたいと考えています。

このデータをlocalStorageに収集しているので、スクリプトは最初にさまざまなlocalStorageプロパティを更新してから、このボックスに結果を表示します。

localStorage.steps = Number(localStorage.steps) + 1;
displayValueInFloatingBox(localStorage.steps + ' in Sargasso' );

また、このボックスにボタンを追加して、これらのプロパティの値をリセットします。これにより、スクリプトを毎回編集することなく、永久に追跡するか、セッションを1、2回だけ追跡するかを選択できます(特に、スクリプトを共有するため)。これは変数をゼロに設定するだけだと思う​​ので、ボタンを作成して何かを実行する方法を知る必要があります...これはおそらく何らかの形でeventListenerを使用します。

jQueryではなくプレーンJavaScriptに固執してください...私はまだJavaScriptをほとんど取得していません。そして、答えを説明してください。そうすれば、何かがどのように機能するかを理解できます。少しのコードが使用された理由がわからないため、同様の質問が返ってくるようなコードスニペットは必要ありません。

付録A:現在のスクリプト

// ==UserScript==
// @name Unicreatures Egg pop-up
// @namespace Unicreatures Egg pop-up
// @description Unicreatures Egg pop-up
// @include http://unicreatures.com/explore.php*
// @include http://www.unicreatures.com/explore.php*
// ==/UserScript==
var regexp = /You find an? (Exalted )?(.*?) egg nearby/;
var match = regexp.exec( document.body.innerHTML );
if ( match ) {
  if ( match[1] ) {
      alert( "Exalted egg found: " + match[2] );
  } else {
      alert( "Normal egg found: " + match[2] );
  }
}
var y = document.body.innerHTML;
var links = document.getElementsByTagName( 'a' );

for ( var i = 0; i < links.length; i++ ) {
var link = links[i];
if ( /area=sea(?!\&gather)/.test( link.href )) {
      link.addEventListener( 'click', function () {
      localStorage.steps=Number(localStorage.steps)+1
      // alert(localStorage.steps + ' in Sargasso' );
    }, true );
  }
}

//document.addEventListener('click', function(){alert('page clicked')}, true);

if(y.indexOf("You find a Noble")> 0)
{
  alert('Noble Egg Alert');
}

if(y.indexOf("You find an Exalted")> 0)
{
  localStorage.exaltedEggCount=Number(localStorage.exaltedEggCount)+1;
  alert('Exalted Egg Alert '+localStorage.exaltedEggCount);
}

if(y.indexOf("egg nearby!")> 0)
{
  localStorage.eggCount=Number(localStorage.eggCount)+1;

  alert('Egg Alert '+localStorage.eggCount);
}
4

1 に答える 1

11

ページの左上隅にボックスを追加する簡単な方法の 1 つを次に示します。まず、divボックスとして機能する要素を作成する必要があります。(他の HTML 要素も機能する可能性がdivありますが、特別な意味はなく、単純なコンテナーであるため、適切な選択です。)

var box = document.createElement( 'div' );

ボックスに ID を与えます。後でそれを見つけられるようにするためと、CSS でスタイルdocument.getElementsById()を設定できるようにするためです。

box.id = 'myAlertBox';

次に、ボックスのスタイルを設定する必要があります。GreaseMonkey を使用しているのでGM_addStyle、ドキュメントに CSS スタイル ルールを追加するために使用できます。

GM_addStyle( 
    ' #myAlertBox {             ' +
    '    background: white;     ' +
    '    border: 2px solid red; ' +
    '    padding: 4px;          ' +
    '    position: absolute;    ' +
    '    top: 8px; left: 8px;   ' +
    '    max-width: 400px;      ' +
    ' } '
);

JavaScript に複数行の文字列を含めるための厄介な構文に注意してください。(ボックスのスタイルを設定する方法は他にもあり、GreaseMonkey の外部でも機能します。以下にそのいくつかを示します。)

CSS スタイル ルール自体を見ると、最初の 3 行は、ボックスには白い背景と 2 ピクセル幅の赤い境界線が必要であり、境界線とコンテンツの間に 4 ピクセルのパディングが必要であることを示しています。これらすべてが、典型的なシンプルなアラート ボックスのように見えるだけです。

次の行は、ボックスをページ上に絶対に配置する必要があることを示しています。つまり、ページ上に他に何があるかに関係なく、常に固定位置に配置する必要があります。その下の行は、ボックスに指定する位置を指定しています: ここでは、4 ピクセルページの左上隅から。最後の行は、ボックスにどれだけコンテンツを詰め込んでも、ボックスの幅が 400 ピクセルを超えてはならないことを示しています。

そういえば、もちろんコンテンツも追加する必要があります。プレーンテキストを使用することもできます:

box.textContent = "Here's some text! This is not HTML, so <3 is not a tag.";

または、HTML を使用できます。

box.innerHTML = "This <i>is</i> HTML, so &lt;3 needs to be escaped.";

最後に、ボックスをページに追加して表示させる必要があります。

document.body.appendChild( box );

そして、そこに行きます!ページ上のボックス。


わかりましたが、どうすればそれを取り除くことができますか? 最も簡単な方法は、クリックすると消えるようにすることです。

box.addEventListener( 'click', function () {
    box.parentNode.removeChild( box );
}, true );

または、ボックスに別の閉じるボタンを作成し、そのクリック ハンドラーのみを設定することもできます。

var closeButton = document.createElement( 'div' );
closeButton.className = 'myCloseButton';
closeButton.textContent = 'X';

GM_addStyle( 
    ' .myCloseButton {           ' +
    '    background: #aaa;       ' +
    '    border: 1px solid #777; ' +
    '    padding: 1px;           ' +
    '    margin-left: 8px;       ' +
    '    float: right;           ' +
    '    cursor: pointer;        ' +
    ' } '
);

box.insertBefore( closeButton, box.firstChild );
closeButton.addEventListener( 'click', function () {
    box.parentNode.removeChild( box );
}, true );

ボックス内の他のコンテンツの前に閉じるボタンを挿入し、スタイルfloat: rightを指定すると、ボックスが右上隅にフロートし、その周りにテキストが流れます。このcursor: pointerルールは、マウス カーソルがボタン上にあるときに手の形に見えるようにし、クリック可能であることを示します。

同じ方法で、他のボタンをボックス (またはページの他の場所) に追加することもできます。ボタンに ID の代わりにクラス名を付けたので、必要に応じて、すべてのボタンに同じクラスを指定し、同じ方法でスタイルを設定できます。

ボタンの HTML コードを に配置しbox.innerHTML、結果の要素を見つけて、そのbox.getElementById()ようにクリック ハンドラを追加することもできます。


要素をスタイリングする他の方法についても言及したいと思います。簡単な方法の 1 つは、CSS ルールをそのstyleプロパティに直接書き込むことです。

box.style.cssText =
    ' background: white;     ' +
    ' border: 2px solid red; ' +
    ' padding: 4px;          ' +
    ' position: absolute;    ' +
    ' top: 8px; left: 8px;   ' +
    ' max-width: 400px;      ' ;

(この方法では、ボックスに ID を与える必要さえありません。) スタイルを 1 つずつ設定 (および読み取り) することもできます。

box.style.background = 'white';
box.style.border = '2px solid red';
box.style.padding = '4px';
box.style.position = 'absolute';
box.style.top = '8px';
box.style.left = '8px';
box.style.maxWidth = '400px';

一部の名前が異なることに注意してください。たとえば、max-width有効な JavaScript プロパティ名ではないため、maxWidth代わりになります。ハイフンを含む他の CSS プロパティ名にも同じルールが適用されます。

それでも、GM_addStyleより柔軟であるため、私は好みます。たとえば、ボックス内のすべてのリンクを赤くしたい場合は、次のようにします。

GM_addStyle( 
    ' #myAlertBox a {  ' +
    '    color: red;   ' +
    ' } '
);

ところで、ここに巧妙なトリックがあります: に置き換えるposition: absoluteposition: fixed、ボックスはページと一緒にスクロールせず、下にスクロールしてもブラウザーの隅に固定されたままになります。

もう 1 つのヒント: Firebugをまだお持ちでない場合は、インストールしてください。これにより、ページ コンテンツの調査と JavaScript のデバッグ非常に簡単になります。

于 2012-09-10T18:28:22.940 に答える