2012-10-18 3 views
0

잘못된 입력에 오류가 있습니다 :그리스 몽키 스크립트가이 같은 논리에 나는 그리스 몽키 스크립트가

  1. 않는 한 로그인 한 사용자 권한 그룹에 (JOHN, 루크, JEFF, MAX, ANDY) name="prio"으로 <input>을 사용 중지하십시오.

  2. 권한이없는 사용자 인 경우 <input name="dest">에서 값을 선택하지 않습니다.
    특히 "12"또는 "22"를 차단하고 오류 메시지를 작성하십시오. 내가 다른 입력 필드에 텍스트를 삽입하거나 내가 선택 필드를 변경하고 를 입력 누르면 정지를 제출

    내가이 나타날 스크립트는 잘 작동하지만, 버그가


콘솔에서 오류 메시지 :

Error: destInput[0] has no properties Source File: file:///E:/FirefoxPortable2.x/Data/profile/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js Line: 379

var err = this.findError(script, line - lineFinder.lineNumber - 1);

은 내가 name="dest"와 규칙이 모든 입력 필드와 선택 필드에 노력하고 있습니다 생각하십니까? 하지만 "dest"입력에 대해서만 규칙을 원합니다. 여기

my script code입니다 :

// ==UserScript== 
// @name   _SO Block submit on custom FF2 page. 
// @namespace  PC 
// @include  file:///D:/temp/foo%20SO/task* 
// @include  file:///D:/temp/foo%20SO/fixture* 
// @include  file:///D:/temp/foo%20SO/pallet* 
// ==/UserScript== 

GM_log ("Script start."); 

unsafeWindow._oldSubmit = unsafeWindow.document.forms[0].submit; 
unsafeWindow.document.forms[0].submit = function() { 
    GM_log ("Submit function fired."); 

    var destInput = document.getElementsByName ("dest"); 
    if (! destInput || destInput.length == 0) { 
     //unsafeWindow._oldSubmit(); 
    } 

    var destValue = destInput[0].value; 
    if ( /^\s*$/.test (destValue) 
      || excludedDestinations.indexOf (destValue) > -1 
    ) { 
     GM_log ("Submit should be blocked! (1)"); 
    } 
    else { 
     //unsafeWindow._oldSubmit(); 
    } 
}; 


//--- 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]); 
       GM_log ("Change handler fired."); 
      }, 
      false 
     ); 

     destInput[0].form.addEventListener (
      "submit", 
      function (zEvent) { 
       GM_log ("Submit handler fired."); 
       var destValue = destInput[0].value; 
       if ( /^\s*$/.test (destValue) 
         || excludedDestinations.indexOf (destValue) > -1 
       ) { 
        //--- Stop the submit 
        zEvent.preventDefault(); 
        //zEvent.stopPropagation(); 
        GM_log ("Submit should be blocked! (2)"); 
        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); 
     } 
     return true; 
    } 
    else { 
     var destErrNode = document.getElementById ("gmDestErrorDisp"); 
     if (destErrNode) { 
      destErrNode.style.display = "none"; 
     } 
    } 
    return false; 
} 

Here is an old working version on jsFiddle for a better understanding.

추신 : 내 오래된 시스템에서 pastebin 코드 (unsafeWindow ..)가 유일한 작동 버전입니다. 시스템은 FF 2.0.0.11 및 Greasemonkey 0.8를 실행하며 업데이트 할 수 없습니다.

버그를 제거하는 방법이 있습니까? : D

답변

1

변경 양식 [0] .submit 코드 :

if (unsafeWindow.document.forms[0]) { 
    unsafeWindow._oldSubmit = unsafeWindow.document.forms[0].submit; 
    unsafeWindow.document.forms[0].submit = function() { 
     GM_log ("Submit function fired."); 

     var destInput = document.getElementsByName ("dest"); 
     if (! destInput || destInput.length == 0) { 
      unsafeWindow._oldSubmit(); 
     } 
     else { 
      var destValue = destInput[0].value; 
      if ( /^\s*$/.test (destValue) 
        || excludedDestinations.indexOf (destValue) > -1 
      ) { 
       GM_log ("Submit should be blocked! (1)"); 
      } 
      else { 
       unsafeWindow._oldSubmit(); 
      } 
     } 
    }; 
} 

그것은 그들을 사용하기 전에 상황이 존재하기에 적절한 작업을 수행합니다.

또한

,이 라인의 주석 :

//zEvent.stopPropagation(); 
+0

난 당신이이 질문에 대해 쓴 코드를 제거를 ... 모든 입력은 지금 노력하고 있습니다! : D 하지만 내가 12 또는 22 삽입 할 때 대상 부분 더 이상 작동하지 않습니다 .. "12 및 22 금지 된"오류 메시지가 가져 오지만 더 이상 중지되지 않습니다. 문제가있는 아이디어가 있습니까? – bernte

+1

답변을 업데이트했지만 테스트 할 방법이 없습니다. –

관련 문제