1

完全に実行されている既存のスクリプトがあります。Firefox2.xおよびGreasemonkey0.8.x用にコーディングされており、jQueryを使用できません。

古い作業スクリプト:

//--- Make sure this list of names is all uppercase.
var usersWhoCanSetPriority = ['JOHN', 'LUKE', 'JEFF', 'MAX', 'ANDY'];

var bDisablePrio    = true;
var tdNodes         = document.getElementsByTagName ("TD");
for (var J = tdNodes.length - 1;  J >= 0;  --J) {
    var tdNode      = tdNodes[J];
    if (tdNode.className == "user") {
        var userName        = tdNode.textContent.replace (
            /^(?:.|\n|\r)+\(User:\s+([^)]+)\)(?:.|\n|\r)+$/i, "$1"
        ).toUpperCase ();

        if (usersWhoCanSetPriority.indexOf (userName) > -1) {
            bDisablePrio    = false;
        }
    }
}

if (bDisablePrio) {
    var oldInput = document.getElementsByName ("prio");
    oldInput[0].setAttribute ("disabled", "disabled");
}


  1. これは、ユーザーがにいないときの外観/動作のフィドルですusersWhoCanSetPriority

  2. これは、ユーザーがフルアクセス権を持っている場合の外観/動作のフィドルです


新しいスクリプトの例:

これで、宛先入力が存在する場合、特権ユーザーは任意の値を設定できるはずです。ただし、特権のないユーザーは設定とを
ブロックする必要があります。1222

  1. 宛先フィールドを持つ特権ユーザー

  2. 制限付きユーザー、宛先フィールド

つまり、ユーザーがNOT ->'JOHN'、'LUKE'、'JEFF'、'MAX'、'ANDY'(フッターから)でない場合は、prio入力を無効にし、ユーザーが「12」を入力しているときに入力を停止します。または「22」を押して、エラーメッセージを書き込みます。

スティーブ(「許可されていないユーザー」)は、たとえば120、121、220、222、およびその他すべての番号を入力できますが、1222は入力できないことを知っておく必要があります。12も120にあるので問題かどうかわかりません!'JOHN'、'LUKE'、'JEFF'、'MAX'、'ANDY'は、すべての数値を入力に入力できます。

古いスクリプトは、site-one.htmlやsite-two.htmlなどのさまざまなページで実行されます。ただし、宛先入力はsite-one.htmlとsite-three.htmlにあります。つまり、prio-inputしかない場合もあれば、prio-inputしかない場合もあります。 prio-inputとdestination-inputの両方があります。

どうすればそれをすべて行うことができますか?

よろしく、ベルンテ

4

2 に答える 2

3

http://jsfiddle.net/WT9yZ/4/を参照してください

あなたは付け加えられます

if(bDisablePrio){
    var destExcluded=['12','22'];
    document.getElementById('dest').onchange=function(){
        if(destExcluded.indexOf(this.value)>-1){
            this.value='';
        }
    }
}

問題は、許可されている"122"が許可されてい"12"ない場合、ユーザーがそれを書き込むのを防ぐためにイベントを使用できないことonkeypressです。ユーザーが書き込むことができない場合、ユーザーも書き込むこと"12"ができないため"122"です。

次に、解決策は、onchangeテキストフィールドがフォーカスを失ったときに発生するイベントです(変更されている場合)。次に、ユーザーが"12"またはのみを書き込んだ場合"22"は、テキストフィールドをクリアできます。</ p>

于 2012-09-06T19:49:41.660 に答える
1

ユーザーuser1653020の答えは近いですが、いくつかの問題があります。

  1. Greasemonkey 0.8では失敗します!「落とし穴#2:イベントハンドラー」を参照してください。
  2. が存在しない場合はクラッシュしdestinationます。
  3. それはあまりユーザーフレンドリーではありません。(ユーザーに自分が間違っていることを知らせないでください。)
  4. ユーザーが無効な値を送信できるようにします。

jsfiddle.net/P2VeGにアクセスし、宛先として12を入力して、Enter[送信]ボタンを押すかクリックします。フォームがサーバーに送信され、宛先値が無効であり、ユーザーへの警告がないことがわかります。

次のコードは、これらの問題をすべて克服するはずです。(ただし、明らかな理由により、GM 0.8およびFF2ではテストされていません。)

jsfiddle.net/P2VeG/2で動作中のコードを参照してください

//--- Make sure this list of names is all uppercase.
var usersWhoCanSetPriority  = ['JOHN', 'LUKE', 'JEFF', 'MAX', 'ANDY'];
var excludedDestinations    = ['12', '22'];

var bDisablePrio    = true;
var tdNodes         = document.getElementsByTagName ("TD");
for (var J = tdNodes.length - 1;  J >= 0;  --J) {
    var tdNode      = tdNodes[J];
    if (tdNode.className == "user") {
        var userName        = tdNode.textContent.replace (
            /^(?:.|\n|\r)+\(User:\s+([^)]+)\)(?:.|\n|\r)+$/i, "$1"
        ).toUpperCase ();
        if (usersWhoCanSetPriority.indexOf (userName) > -1) {
            bDisablePrio = false;
        }
    }
}

if (bDisablePrio) {
    var oldInput    = document.getElementsByName ("prio");
    if (oldInput  &&  oldInput.length) {
        oldInput[0].setAttribute ("disabled", "disabled");
    }

    var destInput   = document.getElementsByName ("dest");
    if (destInput  &&  destInput.length) {
        destInput[0].addEventListener (
            "change",
            function (zEvent) {
                bCheckdestinationValue (destInput[0]);
            },
            false
        );

        //--- Extra added to try and get FF2 to behave as later versions do.
        destInput[0].addEventListener (
            "keydown",
            function (zEvent) {
                if (zEvent.keyCode == 13) {
                    if ( bCheckdestinationValue (destInput[0]) ) {
                        zEvent.preventDefault ();
                        zEvent.stopPropagation ();
                        return false;
                    }
                }
            },
            true
        );

        destInput[0].form.addEventListener (
            "submit",
            function (zEvent) {
                var destValue   = destInput[0].value;
                if (    destValue === ''
                        ||  excludedDestinations.indexOf (destInput[0].value) > -1
                ) {
                    //--- Stop the submit
                    /*--- According to:
                        http://www.webdevout.net/browser-support-dom#dom2events
                        preventDefault() and stopPropagation() are supported by FF2
                    */
                    zEvent.preventDefault ();
                    zEvent.stopPropagation ();
                    return false;
                }
            },
            true
        );
    }
}

function bCheckdestinationValue (destInputNd) {
    //--- Returns true if value is bad.
    if (excludedDestinations.indexOf (destInputNd.value) > -1) {
        destInputNd.value = ''; // Blank input

        //--- Add or show Error message.
        var destErrNode = document.getElementById ("gmDestErrorDisp");
        if (destErrNode) {
            destErrNode.style.display = "inline";
        }
        else {
            destErrNode             = document.createElement ('b');
            destErrNode.id          = "gmDestErrorDisp";
            destErrNode.style.color = "red";
            destErrNode.textContent = "12 and 22 are forbidden";
            destInputNd.parentNode.appendChild (destErrNode);
        }
        //--- Uncomment this alert(), if all else fails in FF2.
        ////alert ('Destination cannot be 12 or 22.');
        return true;
    }
    else {
        var destErrNode = document.getElementById ("gmDestErrorDisp");
        if (destErrNode) {
            destErrNode.style.display = "none";
        }
    }
    return false;
}
于 2012-09-07T01:34:39.427 に答える