繁体   English   中英

如何根据页面中其他位置的文本停止某些输入值?

[英]How do I stop certain values of input, based on text elsewhere in the page?

我有一个完美运行的现有脚本! 它是针对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'(来自页脚)然后禁用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输入和目的地输入。

我该怎么做?

此致,Bernte

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" ,则可以清除文本字段。

用户user1653020的答案很接近,但它有几个问题:

  1. 它会在Greasemonkey 0.8中失败! 请参阅“陷阱#2:事件处理程序”
  2. destination不存在时会崩溃。
  3. 它不是非常用户友好。 (不要让用户知道她做错了什么。)
  4. 允许用户提交无效值。

转到jsfiddle.net/P2VeG ,输入12作为目的地,然后按Enter键或单击“提交”按钮。 您将看到表单被发送到服务器,并且具有无效的Destination值并且没有警告用户!

以下代码应该克服所有这些问题。 (但由于显而易见的原因,它在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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM