2012-11-19 153 views
2

我正在從一個項目中導入一些項目,這個項目從一個文件myjs.js中導入,這個文件在頭文件中被調用(在項目的所有網頁上)。 這些文件管理複選框的行爲,並且實際上切換每個複選框對的檢查。問題是,在某些情況下,這種行爲是錯誤的,但我無法更改此js文件中的任何內容,因爲它太複雜。 因此,在某個頁面上,我決定聽取某些複選框上的點擊事件來糾正行爲:問題是腳本存在衝突,我無法觸發我的腳本(放在這個頁面上)。我如何強制它使我的Java腳本第一次被監聽?多個點擊監聽器-java script

事實上覆選框被myjs.js構造,應用到HTML sequece

<div class="left"> 
      <input type="radio" name="isPubOk" id="pubOk" checked="checked" /> 
      <label for="pubOk"><?php echo _("Oui"); ?></label> 
</div> 
<div class="left"> 
      <input type ="radio" name="isPubNok" id="pubNok" checked="" /> 
      <label for="pubNok"><?php echo _("Non"); ?></label> 
</div> 

這裏的js文件的樣本:

function initCustomForms() { 
    getElements(); 
    separateElements(); 
    replaceRadios(); 
    replaceCheckboxes(); 
    replaceSelects(); 
    // hide drop when scrolling or resizing window 
    if (window.addEventListener) { 
     window.addEventListener("scroll", hideActiveSelectDrop, false); 
     window.addEventListener("resize", hideActiveSelectDrop, false); 
    } 
    else if (window.attachEvent) { 
     window.attachEvent("onscroll", hideActiveSelectDrop); 
     window.attachEvent("onresize", hideActiveSelectDrop); 
    } 
} 

function refreshCustomForms() { 
    // remove prevously created elements 
    if(window.inputs) { 
     for(var i = 0; i < checkboxes.length; i++) { 
      if(checkboxes[i].checked) {checkboxes[i]._ca.className = "checkboxAreaChecked";} 
      else {checkboxes[i]._ca.className = "checkboxArea";} 
     } 
     for(var i = 0; i < radios.length; i++) { 
      if(radios[i].checked) {radios[i]._ra.className = "radioAreaChecked";} 
      else {radios[i]._ra.className = "radioArea";} 
     } 
     for(var i = 0; i < selects.length; i++) { 
      var newText = document.createElement('div'); 
      if (selects[i].options[selects[i].selectedIndex].title.indexOf('image') != -1) { 
       newText.innerHTML = '<img src="'+selects[i].options[selects[i].selectedIndex].title+'" alt="" />'; 
       newText.innerHTML += '<span>'+selects[i].options[selects[i].selectedIndex].text+'</span>'; 
      } else { 
       newText.innerHTML = selects[i].options[selects[i].selectedIndex].text; 
      } 
      document.getElementById("mySelectText"+i).innerHTML = newText.innerHTML; 
     } 
    } 
} 

// getting all the required elements 
function getElements() { 
    // remove prevously created elements 
    if(window.inputs) { 
     for(var i = 0; i < inputs.length; i++) { 
      inputs[i].className = inputs[i].className.replace('outtaHere',''); 
      if(inputs[i]._ca) inputs[i]._ca.parentNode.removeChild(inputs[i]._ca); 
      else if(inputs[i]._ra) inputs[i]._ra.parentNode.removeChild(inputs[i]._ra); 
     } 
     for(i = 0; i < selects.length; i++) { 
      selects[i].replaced = null; 
      selects[i].className = selects[i].className.replace('outtaHere',''); 
      selects[i]._optionsDiv._parent.parentNode.removeChild(selects[i]._optionsDiv._parent); 
      selects[i]._optionsDiv.parentNode.removeChild(selects[i]._optionsDiv); 
     } 
    } 

    // reset state 
    inputs = new Array(); 
    selects = new Array(); 
    labels = new Array(); 
    radios = new Array(); 
    radioLabels = new Array(); 
    checkboxes = new Array(); 
    checkboxLabels = new Array(); 
    for (var nf = 0; nf < document.getElementsByTagName("form").length; nf++) { 
     if(document.forms[nf].className.indexOf("default") < 0) { 
      for(var nfi = 0; nfi < document.forms[nf].getElementsByTagName("input").length; nfi++) {inputs.push(document.forms[nf].getElementsByTagName("input")[nfi]); 
      } 
      for(var nfl = 0; nfl < document.forms[nf].getElementsByTagName("label").length; nfl++) {labels.push(document.forms[nf].getElementsByTagName("label")[nfl]);} 
      for(var nfs = 0; nfs < document.forms[nf].getElementsByTagName("select").length; nfs++) {selects.push(document.forms[nf].getElementsByTagName("select")[nfs]);} 
     } 
    } 
} 

// separating all the elements in their respective arrays 
function separateElements() { 

    var r = 0; var c = 0; var t = 0; var rl = 0; var cl = 0; var tl = 0; var b = 0; 
    for (var q = 0; q < inputs.length; q++) { 
     if(inputs[q].type == "radio") { 
      radios[r] = inputs[q]; ++r; 
      for(var w = 0; w < labels.length; w++) { 
       if((inputs[q].id) && labels[w].htmlFor == inputs[q].id) 
       { 
        radioLabels[rl] = labels[w]; 
        ++rl; 
       } 
      } 
     } 
     if(inputs[q].type == "checkbox") { 
      checkboxes[c] = inputs[q]; ++c; 
      for(var w = 0; w < labels.length; w++) { 
       if((inputs[q].id) && (labels[w].htmlFor == inputs[q].id)) 
       { 
        checkboxLabels[cl] = labels[w]; 
        ++cl; 
       } 
      } 
     } 
    } 
} 

//replacing radio buttons 
function replaceRadios() { 


    for (var q = 0; q < radios.length; q++) { 

     radios[q].className += " outtaHere"; 
     var radioArea = document.createElement("div"); 
     if(radios[q].checked) { 
      radioArea.className = "radioAreaChecked"; 
     } 
     else 
     { 
      radioArea.className = "radioArea"; 
     } 
     radioArea.id = "myRadio" + q; 
     radios[q].parentNode.insertBefore(radioArea, radios[q]); 
     radios[q]._ra = radioArea; 

     radioArea.onclick = new Function('rechangeRadios('+q+')'); 
     if (radioLabels[q]) { 
      if(radios[q].checked) { 
       radioLabels[q].className += "radioAreaCheckedLabel"; 
      } 
      radioLabels[q].onclick = new Function('rechangeRadios('+q+')'); 
     } 
    } 
    return true; 
} 

//checking radios 
function checkRadios(who) { 
    var what = radios[who]._ra; 
    for(var q = 0; q < radios.length; q++) { 
     if((radios[q]._ra.className == "radioAreaChecked") && (radios[q]._ra.nextSibling.name == radios[who].name)) 
     { 
      radios[q]._ra.className = "radioArea"; 
     } 
    } 
    what.className = "radioAreaChecked"; 
} 

//changing radios 
function changeRadios(who) { 
    if(radios[who].checked) { 
     for(var q = 0; q < radios.length; q++) { 
      if(radios[q].name == radios[who].name) { 
       radios[q].checked = false; 
      } 
      radios[who].checked = true; 
      checkRadios(who); 
     } 
    } 
} 

//rechanging radios 
function rechangeRadios(who) { 
    if(!radios[who].checked) { 
     for(var q = 0; q < radios.length; q++) { 
      if(radios[q].name == radios[who].name) { 
       radios[q].checked = false; 
      } 
      if(radioLabels[q]) { 
       radioLabels[q].className = radioLabels[q].className.replace("radioAreaCheckedLabel",""); 
      } 
     } 
     radios[who].checked = true; 
     if(radioLabels[who] && radioLabels[who].className.indexOf("radioAreaCheckedLabel") < 0) { 
      radioLabels[who].className += " radioAreaCheckedLabel"; 
     } 
     checkRadios(who); 

     if(window.$ && window.$.fn) { 
      $(radios[who]).trigger('change'); 
     } 
    } 
} 

//replacing checkboxes 
function replaceCheckboxes() { 
    if (replaceCheckBoxes == 0) 
    return; 
    for (var q = 0; q < checkboxes.length; q++) { 
     // checkboxes[q].className += " outtaHere"; 
     var checkboxArea = document.createElement("div"); 
     if(checkboxes[q].checked) { 
      checkboxArea.className = "checkboxAreaChecked"; 
      if(checkboxLabels[q]) { 
       checkboxLabels[q].className += " checkboxAreaCheckedLabel" 
      } 
     } 
     else { 
      checkboxArea.className = "checkboxArea"; 
     } 
     checkboxArea.id = "myCheckbox" + q; 
     checkboxes[q].parentNode.insertBefore(checkboxArea, checkboxes[q]); 
     checkboxes[q]._ca = checkboxArea; 
     checkboxArea.onclick = new Function('rechangeCheckboxes('+q+')'); 
     if (checkboxLabels[q]) { 
      checkboxLabels[q].onclick = new Function('changeCheckboxes('+q+')'); 
     } 
     checkboxes[q].onkeydown = checkEvent; 
    } 
    return true; 
} 

//checking checkboxes 
function checkCheckboxes(who, action) { 
    var what = checkboxes[who]._ca; 
    if(action == true) { 
     what.className = "checkboxAreaChecked"; 
     what.checked = true; 
    } 
    if(action == false) { 
     what.className = "checkboxArea"; 
     what.checked = false; 
    } 
    if(checkboxLabels[who]) { 
     if(checkboxes[who].checked) { 
      if(checkboxLabels[who].className.indexOf("checkboxAreaCheckedLabel") < 0) { 
       checkboxLabels[who].className += " checkboxAreaCheckedLabel"; 
      } 
     } else { 
      checkboxLabels[who].className = checkboxLabels[who].className.replace("checkboxAreaCheckedLabel", ""); 
     } 
    } 

} 

//changing checkboxes 
function changeCheckboxes(who) { 
    setTimeout(function(){ 
     if(checkboxes[who].checked) { 
      checkCheckboxes(who, true); 
     } else { 
      checkCheckboxes(who, false); 
     } 
    },10); 
} 
+1

讓我猜猜,有人的代碼沒有通過'addEventListener' /'attachEvent'附加事件 – Shmiddty

+0

你有任何可以發佈的代碼嗎?這個問題有點含糊不清,能夠提供任何體面的答案。 – War10ck

+0

你不能依賴事件的順序,他們不能保證。此外,沒有問題的人不太可能得到答案,不要保守祕密 –

回答

2

請在這裏看到了jQuery stopImmediatePropagation()功能: http://docs.jquery.com/Types/Event#event.stopImmediatePropagation.28.29

我相信這樣會達到你想要做的。

編輯:有了更多的細節,我可以提供更好的答案。

編輯2:似乎沒有保證JavaScript執行順序,所以內聯代碼可能不會在動態添加代碼之前運行。另外,這個特定的函數只有在使用jQuery添加其他處理程序時纔有效。

編輯3:

一個快速和骯髒的解決將是

<script type="text/javascript">var executeHandlers = false;</script>

添加到一個HTML文件的頂部。

然後編輯JavaScript文件,以使事件處理程序有

if (executeHandlers !== false) { ... do the logic you normally would here ... }

因爲身體

這將一行添加到需要區別對待的HTML文件,不應該影響其他頁面上的執行。

請注意,這是一個快速和髒的修復,有更好的方法來做到這一點。使用現有.js文件的限制條件,並且只有一個需要區別對待的文件,這似乎是達到預期結果的最快/最簡單的方式,而不一定是最好的。

+0

只有當節點深入該層次結構比處理程序最初所在的節點更高。另外,不保證你的處理程序會在處理程序之前被調用。OP也沒有要求'jQuery',並假定每個安裝處理程序都使用jQuery執行它 –

+0

@Juan:很好的調用,但是我相信內聯JavaScript應該比動態添加的腳本更高。根據他對問題的描述,他的代碼直接與頁面內聯。如果我錯了,請糾正我,我會更新答案。 – renab

+0

不能保證內聯腳本會先運行。即使是這樣,它也不會停止同一節點上的其他處理程序,除非它們也設置了jQuery –