[英]How do I stop certain values of input, based on text elsewhere in the page?
我有一個完美運行的現有腳本! 它是針對Firefox 2.x和Greasemonkey 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");
}
新腳本示例:
現在,如果存在目標輸入,則特權用戶應該能夠設置任何值。
但是應該阻止非特權用戶設置12
和22
。
也就是說,如果用戶不是 - >'JOHN','LUKE','JEFF','MAX','ANDY'(來自頁腳)然后禁用prio輸入,並在用戶輸入“12”時停止輸入或“22”,並寫入錯誤消息。
您必須知道允許史蒂夫(“不允許的用戶”)輸入例如120,121,220,222和所有其他數字,但不能輸入12和22 ! 我不知道這是不是一個問題,因為12也是120! 'JOHN','LUKE','JEFF','MAX','ANDY'被允許輸入所有數字。
舊腳本運行在不同的頁面上,例如site-one.html和site-two.html但是目標輸入位於site-one.html和site-three.html上 - 這意味着有時我只有prio-input,有時候我有prio輸入和目的地輸入。
我該怎么做?
此致,Bernte
你可以加
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的答案很接近,但它有幾個問題:
destination
不存在時會崩潰。 轉到jsfiddle.net/P2VeG ,輸入12作為目的地,然后按Enter鍵或單擊“提交”按鈕。 您將看到表單被發送到服務器,並且具有無效的Destination值並且沒有警告用戶!
以下代碼應該克服所有這些問題。 (但由於顯而易見的原因,它在GM 0.8和FF2中未經測試。)
//--- 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.