2017-03-19 156 views
0

好的。我想先道歉,因爲我甚至不知道如何正確地標題這個問題。 我會盡力解釋: 我有一個工作代碼,這種工作方式,但它有點混亂,所以我試圖把它分成小函數。 整個過程是一個模擬滾動條:函數內部調用函數 - 故障:函數不執行

-div id =「滾動條」表示滾動條軌道。
-div id =「滾動條」的唯一孩子代表滾動條的拇指。

現在。每當document.documentElement中發生「onmousedown」事件時,函數checkAndPerform(e)就會被執行。 (e)獲取滾動條的邊框並調用以下功能:

-checkClick(e):它檢查滾動條內是否發生了單擊並且返回true或false。

-perform():如果checkClick的結果爲true,則它將拇指移至點擊位置。另外,它向下滾動滾動條操作的部分(部分ID =「ejercicios」)。最後,它爲document.documentElement添加一個「mousemove」EventListener,並附帶跟隨Me(e)函數。 這個followMe函數調用一個限制滾動到軌跡欄邊框的函數。之後,在「mousemove」處於活動狀態時,執行div和滾動部分的翻譯,最後調用函數release(),該函數在鼠標鍵釋放後添加「mouseup」EventListener以刪除followMe函數。

的代碼的想法來到這裏:

How can I retrieve all mouse coordinates between mousedown to mouseup event,在那裏你可以接受的答案該功能被稱爲「航跡」被調用troubleless(因爲它是在我以前的代碼)看到。

所以,在這裏它是困擾javascript代碼:

function getHeight(object) { 
    var height = object.getBoundingClientRect().bottom - object.getBoundingClientRect().top; 
    return height; 
} 

function checkClick(e) { 
    console.log("x:" + e.pageX, "y:" + e.pageY); 
    if (e.pageX > sBLeft - 5 && e.pageX < sBRight + 5 && e.pageY < sBBottom && e.pageY > sBTop) { 
     adentroBar = true; 
     console.log("meas adentro"); 
    } else { 
     adentroBar = false; 
     console.log("meas afuera"); 
    } 
    return adentroBar; 
} 

function scrollLimited(e) { 
    if (e.pageY < sBTop) { 
     translateY = 0; 
    } else if (e.pageY > sBBottom) { 
     translateY = getHeight(scrollBar) - getHeight(thumb); 
    } else { 
     translateY = e.pageY - sBTop - .5 * getHeight(thumb); 
    } 
} 

function followMe(e) { 
    scrollLimited; 
    thumb.style.transform = "translate3d(0," + translateY + "px,0)"; 
    document.getElementById('ejercicios').scrollTop = translateY * ratio; 
    document.documentElement.addEventListener("mouseup", release, false); 
} 

function perform() { 
    if (adentroBar === true) { 
     translateY = e.pageY - sBTop - getHeight(thumb)/2; 
    } 
    thumb.style.transform = "translate3d(0," + translateY + "px,0)"; 
    document.getElementById('ejercicios').scrollTop = translateY * ratio; 
    document.documentElement.addEventListener("mousemove", followMe, false); 
} 

function release() { 
    document.documentElement.removeEventListener("mousemove", followMe, false); 
} 

function checkAndPerform(e) { 
    var translateY, adentroBar, scrollBar = document.getElementById('scrollbar'), 
     thumb = scrollBar.getElementsByTagName("div")[0], 
     sBLeft = scrollBar.getBoundingClientRect().left, 
     sBRight = scrollBar.getBoundingClientRect().right, 
     sBTop = scrollBar.getBoundingClientRect().top, 
     sBBottom = scrollBar.getBoundingClientRect().bottom, 
     preg = document.getElementById('preguntas'), 
     ratio = preg.offsetHeight/(getHeight(scrollBar) - getHeight(thumb)); 
    if (e.which === 1) { 
     checkClick; 
     perform; 
    } 
} 
document.documentElement.addEventListener("mousedown", checkAndPerform, false); 

而且,這裏是一個jFiddle它:https://jsfiddle.net/pa0exs4q/ 我可以提供的情況下,你覺得有趣的工作代碼,但正如我剛纔所說,它是非常混亂和寫作。 問題是流中的第二個函數(checkClick),甚至沒有被調用。 我試圖稱它爲(checkClick(e)),在這種情況下它運行,但未能識別checkAndPerform中定義的變量。 在我的工作代碼中,一切都是唯一的功能,所以我認爲這可能是一個範圍問題,但我對任何想法都是開放的。 爲我的英語道歉,並提前致謝!

回答

1

如果您有一個名爲myFunction的函數,您可以簡單地將它傳遞給myFunction,但要實際調用它,必須將其編寫爲myFunction()。所以這個:

function checkAndPerform(e){ 
    var translateY, adentroBar, scrollBar=document.getElementById('scrollbar'), thumb=scrollBar.getElementsByTagName("div")[0], sBLeft=scrollBar.getBoundingClientRect().left, sBRight=scrollBar.getBoundingClientRect().right, sBTop=scrollBar.getBoundingClientRect().top, sBBottom=scrollBar.getBoundingClientRect().bottom, preg=document.getElementById('preguntas'), ratio=preg.offsetHeight/(getHeight(scrollBar)-getHeight(thumb));  

    if (e.which===1){ 
    checkClick; 
    perform; 
    } 
} 

應該成爲這樣的:

function checkAndPerform(e){ 
    var translateY, adentroBar, scrollBar=document.getElementById('scrollbar'), thumb=scrollBar.getElementsByTagName("div")[0], sBLeft=scrollBar.getBoundingClientRect().left, sBRight=scrollBar.getBoundingClientRect().right, sBTop=scrollBar.getBoundingClientRect().top, sBBottom=scrollBar.getBoundingClientRect().bottom, preg=document.getElementById('preguntas'), ratio=preg.offsetHeight/(getHeight(scrollBar)-getHeight(thumb));  

    if (e.which===1){ 
    checkClick(e); 
    perform(e); // make sure to pass e and expect it in perform, otherwise it won't have access to it 
    } 
} 

沒有看到您的相應的標記,這在我看來,最有可能的和突出的問題,在你的代碼。祝你好運!

+0

在此之後,我不得不學習「通過」和「通話」之間的區別,但正如您所說,它只是在將參數傳遞給每個功能後才起作用。除了一個..:S。對於那個我創建了一個屬性的對象,現在它的工作很棒!非常感謝! – Sourcerer

+0

不客氣 - 樂於幫忙! –