2017-08-30 64 views
1

我發現了一個示例任務,當您單擊文檔中的任意位置時,會在頁面上顯示警報。在這個任務中,你只需要編輯display()函數,該函數有兩個參數 - myFunc和myObj,這樣就可以顯示人物對象的名字。我想出了類似的東西,但是警報只在頁面刷新後出現,而不是在每次點擊文檔後出現。單擊eventListener問題

function start() { 
    var person = { 
        name : "John" 
    }; 
    function alertName() { 
        alert(""+this.name.toUpperCase() + ""); 
    } 
    document.addEventListener('click', display(alertName, person)); 
} 
function display(myFunc, myObj) { 
    name = myObj.name; 
    myFunc(); 

} 
start(); 

這裏是提琴:

function start() { 
 
    var person = { 
 
        name : "John" 
 
    }; 
 
    function alertName() { 
 
        alert(""+this.name.toUpperCase() + ""); 
 
    } 
 
    document.addEventListener('click', start(alertName, person)); 
 
} 
 
function display(myFunc, myObj) { 
 
    name = myObj.name; 
 
    myFunc(); 
 

 
} 
 
start();
body { 
 
    background-color:yellow; 
 
}
<body> 
 

 
    </body>

+0

這不是事件偵聽器的工作方式。您不必在回調中選擇參數。另外,由於包含了參數,所以在聲明事件偵聽器時執行函數_at。你需要傳遞一個_reference到一個function_。你在技術上做的是將display()函數的_result作爲回調參數。這是沒有意義的,因爲該函數不返回任何東西。而你的小提琴不起作用,因爲你調用了一個不存在的函數,並且它與這裏的示例不匹配。在發佈之前檢查你的東西:-) – ADyson

+0

那裏沒有jquery - 你打算單獨使用jquery還是javascript? –

回答

0

你要明白,display是一個函數,並通過display(alertName, person)你立即調用它,而不是作爲一個事件回調。但是addEventListener需要函數引用作爲第二個參數,所以它意味着當調用display(alertName, person)必須返回一個新函數時,將從內部調用alertName(這是一個引用)。

最後,this.namealertName意味着它需要的myObj上下文中被調用,使用Function.prototype.call做到這一點。

function start() { 
 
    var person = {         
 
    name: "John"     
 
    } 
 
    
 
    function alertName() {         
 
    alert("" + this.name.toUpperCase() + "");     
 
    } 
 
    
 
    document.addEventListener('click', display(alertName, person)); 
 
} 
 

 
function display(myFunc, myObj) { 
 
    return function() { 
 
    myFunc.call(myObj) 
 
    } 
 
} 
 
start();
Click somewhere.

+0

我是初學者,我只是在學習。感謝您的回答 – hetious

1

這裏在的addEventListener第二個參數的問題,必須要調用時,事件會觸發功能。

在你的例子中,你傳遞了一條指令而不是一個函數。你可以做的是在函數體內添加display()調用,並將該函數作爲第二個參數傳遞:

function start() { 
    var person = { 
        name : "John" 
    }; 
    function alertName() { 
        alert(""+this.name.toUpperCase() + ""); 
    } 
    document.addEventListener('click', function() { 
    display(alertName, person) 
    }); 
} 
function display(myFunc, myObj) { 
    name = myObj.name; 
    myFunc(); 

} 
start();