1

我有一个运行完美的现有脚本!它是为Firefox 2.xGreasemonkey 0.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. 受限用户,带有目的地字段

也就是说,如果用户不是-> 'JOHN', 'LUKE', 'JEFF', 'MAX', 'ANDY' (from footer) 然后禁用 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和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 回答