簡體   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