[英]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.