2013-10-01 120 views
0

我有一個運行onload的javascript函數。它按類查找錨點標記,並根據標記中的數據添加onclick函數。我的問題是包含href的一部分的變量'h'。它將被設置爲該功能的最後評估。因此,如果h的最後一個值是「s-g123」,那麼頁面上的所有鏈接都會將此值作爲插入鏈接的值。如何在運行時修復h的值,因此是靜態的?提前致謝。javascript中的動態onclick變量範圍

// converts <a href='#g123' class="shoh"> to <a href='#g123' onclick=function() { shoh('s-g123', 'show') }"> 
function managelinks() { 
var elems = document.getElementsByTagName('*'), i; 
var h, pos; 
for (i = 0; i < elems.length; i++) { 
    if ((elems[i].className).indexOf('shoh') > -1) { 
     if ((pos = elems[i].href.indexOf('#')) > -1) { 
      h = "s-" + elems[i].href.substr(pos + 1); 
      elems[i].onclick = function() { 
       shoh(h, 'show') 
      }; 
     } 
    } 
} 
+0

關:見問答uerySelectorAll更高效的查詢(如果您不需要支持IE6/7)另請閱讀JavaScript的關閉:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures – biziclop

+0

感謝關閉的鏈接。這似乎是問題。必須通過重組來實現我的目標。這個任務看起來很簡單......同樣感謝querySelectorAll提示 - 看起來它可以減少代碼量,甚至可以加快速度。 – mseifert

+0

在我的答案中看下面的例子。我也使用了'anchor_elem.hash'屬性。 – biziclop

回答

2

如果你沒有支持老遲鈍的瀏覽器,你可以使用這樣的:如果你還使用jQuery庫(或更小ZeptoJS)

function managelinks() { 
    // querySelectorAll should work with ie8+ 
    var elems = document.querySelectorAll('a.shoh'), i; 
    var h, pos, elem; 
    for (i = 0; i < elems.length; i++) { 
     elem = elems[i]; 
     h = elem.hash.substr(1); 
     if (h) { 
      // remember the value of h by making a closure 
      elem.onclick = (function(myH){ 
       return function() { 
        shoh(myH, 'show'); 
       }; 
      })(h); 
     } 
    } 
} 

那麼你功能可能更短:

function managelinks() { 
    $(document).on('click', 'a.shoh', function(){ 
     var h = this.hash.substr(1); 
     if (h) shoh(h, 'show'); 
    }); 
} 

http://api.jquery.com/on/http://zeptojs.com/#on

+0

輝煌。我只支持ie8,所以沒有問題。有這麼多我不知道JavaScript。消化這可能需要幾個小時。我還沒有使用散列 - 也需要考慮它。感謝工作答案和啓動課程。 – mseifert

+0

只是好奇,你的答案的哪一部分與舊版瀏覽器不兼容?只是querySelectorAll? – mseifert

+0

是的,我認爲,即使是IE6,其他所有東西都應該可以工作。 – biziclop