2016-03-03 10 views
13

Tôi có một trang HTML cơ bản với một nút:webpack cơ bản không làm việc cho chức năng nút bấm - của router lỗi tham khảo: undefined

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    ... 
</head> 
<body> 
    <button id="button" onclick="uclicked()">Click me</button> 
    <script src="./bundle.js"></script> 
</body> 
</html> 

và một app.js:

//(function(){ 
    console.log('started up') 
    function uclicked(){ 
     console.log('You clicked'); 
    } 
//})(); 

webpack được cài đặt và webpack --watch thành công. Các webpack.config.js là:

module.exports={ 
    entry: './app.js', 
    output: { 
     path: __dirname, 
     filename: 'bundle.js' 
    } 
} 

Khi tôi tải trang console.log đang làm việc nhưng khi tôi nhấn nút tôi nhận được Uncaught ReferenceError: uclicked is not defined.

Nếu tôi thay thế <script src="./bundle.js"></script> bằng <script src="./app.js"></script> và bỏ qua webpack nút bấm tốt. Tại sao thiết lập webpack cơ bản này không hoạt động?

+4

'uclicked' tham chiếu đến một chức năng toàn cầu, nhưng webpack theo mặc định sẽ bọc' bundle' của bạn trong một iife, bảo vệ phạm vi toàn cầu. Sử dụng 'addEventListener' trong mã của bạn hoặc hiển thị ứng dụng của bạn dưới dạng đối tượng công khai bằng cách sử dụng' trình tải tiếp xúc 'https://github.com/webpack/expose-loader –

Trả lời

27

Khi bạn chạy tệp trên webpack, webpack sẽ cố gắng không phân phối phạm vi toàn cầu và do đó chức năng sẽ không được cung cấp trên toàn cầu theo mặc định.

Nếu bạn muốn chức năng có thể truy cập được bên ngoài phạm vi của tệp JS, bạn nên đặt nó trong phạm vi toàn cục.

function uclicked() { 
    // do something 
} 
window.uclicked = uclicked; 

Hoặc chỉ:

window.uclicked = function() { 
    // do something 
} 
+1

làm cách nào để truy cập vào chức năng mà không làm cho nó trở thành toàn cầu? – vidstige

+1

@vidstige Sau đó, bạn sẽ phải tự thiết lập xử lý sự kiện vào nút như thế này:. document.getElementById ('buttonID') onClick = function() {/ * làm somethiing * /} Bạn cần phải đảm bảo rằng tập lệnh này được gọi là ** sau khi ** html đã được tải (bạn có thể làm điều đó bằng cách gọi thẻ script của bạn ở cuối ). –

Các vấn đề liên quan