Как мне остановить определенные значения ввода, основанные на тексте в другом месте на странице?
У меня есть существующий скрипт, который работает отлично! Он написан для 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");
}
Вот как это выглядит / действует, когда пользователь не в
usersWhoCanSetPriority
,Вот как это выглядит / действует, когда пользователь имеет полный доступ.
НОВЫЙ ПРИМЕР СКРИПТА:
Теперь, если входные данные присутствуют, привилегированные пользователи должны иметь возможность установить любое значение.
Но непривилегированным пользователям следует заблокировать настройку 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 - это означает, что иногда у меня есть только первичный ввод, а иногда У меня есть и прио-ввод и назначение-ввод.
Как мне все это сделать?
С уважением, Бернте
2 ответа
Ответ пользователя user1653020 близок, но у него есть несколько проблем:
- Это не удастся в Greasemonkey 0.8! Смотрите "Подводный камень #2: Обработчики событий".
- Это потерпит крах, когда
destination
нет - Это не очень удобно для пользователя. (Не сообщает пользователю, что она делает неправильно.)
- Позволяет пользователю отправлять недопустимые значения.
Перейдите на http://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;
}
Смотрите 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"
Вы можете очистить текстовое поле.